diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-02-22 11:03:23 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-02-22 11:03:23 +0100 |
commit | 2709acbbda8a82ccd18abfe191dcb9dd530e4c57 (patch) | |
tree | 384b57d4a93f8d3a4d4a09a3f9223f71991c76f9 /coreutils | |
parent | 427ae18348a908719ff60383b33041bce5e5393e (diff) | |
download | busybox-w32-2709acbbda8a82ccd18abfe191dcb9dd530e4c57.tar.gz busybox-w32-2709acbbda8a82ccd18abfe191dcb9dd530e4c57.tar.bz2 busybox-w32-2709acbbda8a82ccd18abfe191dcb9dd530e4c57.zip |
sort: fix potentially buggy use of OPT_STR
This also makes OPT_STR reused:
text data bss dec hex filename
930979 481 6852 938312 e5148 busybox_old
930954 481 6852 938287 e512f busybox_unstripped
^^^^^^
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/sort.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/coreutils/sort.c b/coreutils/sort.c index c24b62681..b39297a26 100644 --- a/coreutils/sort.c +++ b/coreutils/sort.c | |||
@@ -85,16 +85,7 @@ | |||
85 | 85 | ||
86 | #include "libbb.h" | 86 | #include "libbb.h" |
87 | 87 | ||
88 | /* This is a NOEXEC applet. Be very careful! */ | ||
89 | |||
90 | |||
91 | /* | ||
92 | sort [-m][-o output][-bdfinru][-t char][-k keydef]... [file...] | ||
93 | sort -c [-bdfinru][-t char][-k keydef][file] | ||
94 | */ | ||
95 | |||
96 | /* These are sort types */ | 88 | /* These are sort types */ |
97 | #define OPT_STR "ngMucszbrdfimS:T:o:k:*t:" | ||
98 | enum { | 89 | enum { |
99 | FLAG_n = 1, /* Numeric sort */ | 90 | FLAG_n = 1, /* Numeric sort */ |
100 | FLAG_g = 2, /* Sort using strtod() */ | 91 | FLAG_g = 2, /* Sort using strtod() */ |
@@ -120,6 +111,15 @@ enum { | |||
120 | FLAG_no_tie_break = 0x40000000, | 111 | FLAG_no_tie_break = 0x40000000, |
121 | }; | 112 | }; |
122 | 113 | ||
114 | static const char sort_opt_str[] ALIGN1 = "^" | ||
115 | "ngMucszbrdfimS:T:o:k:*t:" | ||
116 | "\0" "o--o:t--t"/*-t, -o: at most one of each*/; | ||
117 | /* | ||
118 | * OPT_STR must not be string literal, needs to have stable address: | ||
119 | * code uses "strchr(OPT_STR,c) - OPT_STR" idiom. | ||
120 | */ | ||
121 | #define OPT_STR (sort_opt_str + 1) | ||
122 | |||
123 | #if ENABLE_FEATURE_SORT_BIG | 123 | #if ENABLE_FEATURE_SORT_BIG |
124 | static char key_separator; | 124 | static char key_separator; |
125 | 125 | ||
@@ -129,6 +129,10 @@ static struct sort_key { | |||
129 | unsigned flags; | 129 | unsigned flags; |
130 | } *key_list; | 130 | } *key_list; |
131 | 131 | ||
132 | |||
133 | /* This is a NOEXEC applet. Be very careful! */ | ||
134 | |||
135 | |||
132 | static char *get_key(char *str, struct sort_key *key, int flags) | 136 | static char *get_key(char *str, struct sort_key *key, int flags) |
133 | { | 137 | { |
134 | int start = start; /* for compiler */ | 138 | int start = start; /* for compiler */ |
@@ -404,9 +408,8 @@ int sort_main(int argc UNUSED_PARAM, char **argv) | |||
404 | xfunc_error_retval = 2; | 408 | xfunc_error_retval = 2; |
405 | 409 | ||
406 | /* Parse command line options */ | 410 | /* Parse command line options */ |
407 | opts = getopt32(argv, "^" | 411 | opts = getopt32(argv, |
408 | OPT_STR | 412 | sort_opt_str, |
409 | "\0" "o--o:t--t"/*-t, -o: at most one of each*/, | ||
410 | &str_ignored, &str_ignored, &str_o, &lst_k, &str_t | 413 | &str_ignored, &str_ignored, &str_o, &lst_k, &str_t |
411 | ); | 414 | ); |
412 | /* global b strips leading and trailing spaces */ | 415 | /* global b strips leading and trailing spaces */ |