sort: Fix message catalogue usage
- Check that catopen() succeeded before calling catclose(). musl will crash in the latter if the catalogue descriptor is -1. - Keep the message catalogue open for most of sort(1)'s actual operation. - Don't use catgets(3) to print error messages if catopen(3) had failed. Reviewed by: arichardson, emaste MFC after: 1 week Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D34081
This commit is contained in:
parent
29d481ae6a
commit
8d8b9b560a
@ -57,7 +57,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
#ifndef WITHOUT_NLS
|
#ifndef WITHOUT_NLS
|
||||||
#include <nl_types.h>
|
#include <nl_types.h>
|
||||||
nl_catd catalog;
|
nl_catd catalog = (nl_catd)-1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define OPTIONS "bcCdfghik:Mmno:RrsS:t:T:uVz"
|
#define OPTIONS "bcCdfghik:Mmno:RrsS:t:T:uVz"
|
||||||
@ -1011,6 +1011,10 @@ main(int argc, char **argv)
|
|||||||
set_tmpdir();
|
set_tmpdir();
|
||||||
set_sort_opts();
|
set_sort_opts();
|
||||||
|
|
||||||
|
#ifndef WITHOUT_NLS
|
||||||
|
catalog = catopen("sort", NL_CAT_LOCALE);
|
||||||
|
#endif
|
||||||
|
|
||||||
fix_obsolete_keys(&argc, argv);
|
fix_obsolete_keys(&argc, argv);
|
||||||
|
|
||||||
while (((c = getopt_long(argc, argv, OPTIONS, long_options, NULL))
|
while (((c = getopt_long(argc, argv, OPTIONS, long_options, NULL))
|
||||||
@ -1194,17 +1198,9 @@ main(int argc, char **argv)
|
|||||||
argv = argv_from_file0;
|
argv = argv_from_file0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef WITHOUT_NLS
|
|
||||||
catalog = catopen("sort", NL_CAT_LOCALE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (sort_opts_vals.cflag && sort_opts_vals.mflag)
|
if (sort_opts_vals.cflag && sort_opts_vals.mflag)
|
||||||
errx(1, "%c:%c: %s", 'm', 'c', getstr(1));
|
errx(1, "%c:%c: %s", 'm', 'c', getstr(1));
|
||||||
|
|
||||||
#ifndef WITHOUT_NLS
|
|
||||||
catclose(catalog);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (keys_num == 0) {
|
if (keys_num == 0) {
|
||||||
keys_num = 1;
|
keys_num = 1;
|
||||||
keys = sort_realloc(keys, sizeof(struct key_specs));
|
keys = sort_realloc(keys, sizeof(struct key_specs));
|
||||||
@ -1343,5 +1339,10 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
sort_free(outfile);
|
sort_free(outfile);
|
||||||
|
|
||||||
|
#ifndef WITHOUT_NLS
|
||||||
|
if (catalog != (nl_catd)-1)
|
||||||
|
catclose(catalog);
|
||||||
|
#endif
|
||||||
|
|
||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,8 @@
|
|||||||
#include <nl_types.h>
|
#include <nl_types.h>
|
||||||
|
|
||||||
extern nl_catd catalog;
|
extern nl_catd catalog;
|
||||||
#define getstr(n) catgets(catalog, 1, n, nlsstr[n])
|
#define getstr(n) \
|
||||||
|
(catalog == (nl_catd)-1 ? nlsstr[n] : catgets(catalog, 1, n, nlsstr[n]))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern const char *nlsstr[];
|
extern const char *nlsstr[];
|
||||||
|
Loading…
Reference in New Issue
Block a user