aboutsummaryrefslogtreecommitdiff
path: root/coreutils
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-02-22 11:03:23 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-02-22 11:03:23 +0100
commit2709acbbda8a82ccd18abfe191dcb9dd530e4c57 (patch)
tree384b57d4a93f8d3a4d4a09a3f9223f71991c76f9 /coreutils
parent427ae18348a908719ff60383b33041bce5e5393e (diff)
downloadbusybox-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.c27
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:"
98enum { 89enum {
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
114static 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
124static char key_separator; 124static 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
132static char *get_key(char *str, struct sort_key *key, int flags) 136static 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 */