diff options
author | Ron Yorston <rmy@pobox.com> | 2024-11-03 12:47:27 +0000 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2024-12-10 01:29:44 +0100 |
commit | f02041441344389b05d10fe6ba8759b6670b8e10 (patch) | |
tree | 4f1aa061fa703127606e1d1dbc05de1fbd8e1d6b | |
parent | 50e2b59370542097eb0efd79cc8d3d39ee52bf82 (diff) | |
download | busybox-w32-f02041441344389b05d10fe6ba8759b6670b8e10.tar.gz busybox-w32-f02041441344389b05d10fe6ba8759b6670b8e10.tar.bz2 busybox-w32-f02041441344389b05d10fe6ba8759b6670b8e10.zip |
cut: improve detection of invalid ranges
Commit 0068ce2fa (cut: add toybox-compatible options -O OUTSEP,
-D, -F LIST) added detection of reversed ranges. Further
improvements are possible.
- The test for reversed ranges compared the start after it had been
decremented with the end before decrement. It thus missed ranges
of the form 2-1.
- Zero isn't a valid start value for a range. (Nor is it a valid
end value, but that's caught by the test for a reversed range.)
- The code
if (!*ltok)
e = INT_MAX;
duplicates a check that's already been made.
- Display the actual range in the error message to make it easier
to find which range was at fault.
function old new delta
.rodata 100273 100287 +14
cut_main 1239 1237 -2
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 14/-2) Total: 12 bytes
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | coreutils/cut.c | 19 | ||||
-rwxr-xr-x | testsuite/cut.tests | 5 |
2 files changed, 12 insertions, 12 deletions
diff --git a/coreutils/cut.c b/coreutils/cut.c index b7fe11126..f68bbbad5 100644 --- a/coreutils/cut.c +++ b/coreutils/cut.c | |||
@@ -278,29 +278,26 @@ int cut_main(int argc UNUSED_PARAM, char **argv) | |||
278 | if (!ntok[0]) { | 278 | if (!ntok[0]) { |
279 | s = 0; | 279 | s = 0; |
280 | } else { | 280 | } else { |
281 | s = xatoi_positive(ntok); | ||
282 | /* account for the fact that arrays are zero based, while | 281 | /* account for the fact that arrays are zero based, while |
283 | * the user expects the first char on the line to be char #1 */ | 282 | * the user expects the first char on the line to be char #1 */ |
284 | if (s != 0) | 283 | s = xatoi_positive(ntok) - 1; |
285 | s--; | ||
286 | } | 284 | } |
287 | 285 | ||
288 | /* get the end pos */ | 286 | /* get the end pos */ |
289 | if (ltok == NULL) { | 287 | if (ltok == NULL) { |
290 | e = s; | 288 | e = s; |
291 | } else if (!ltok[0]) { | 289 | } else if (!ltok[0]) { |
290 | /* if the user specified no end position, | ||
291 | * that means "til the end of the line" */ | ||
292 | e = INT_MAX; | 292 | e = INT_MAX; |
293 | } else { | 293 | } else { |
294 | e = xatoi_positive(ltok); | 294 | /* again, arrays are zero based, lines are 1 based */ |
295 | /* if the user specified and end position of 0, | 295 | e = xatoi_positive(ltok) - 1; |
296 | * that means "til the end of the line" */ | ||
297 | if (!*ltok) | ||
298 | e = INT_MAX; | ||
299 | else if (e < s) | ||
300 | bb_error_msg_and_die("%d<%d", e, s); | ||
301 | e--; /* again, arrays are zero based, lines are 1 based */ | ||
302 | } | 296 | } |
303 | 297 | ||
298 | if (s < 0 || e < s) | ||
299 | bb_error_msg_and_die("invalid range %s-%s", ntok, ltok ?: ntok); | ||
300 | |||
304 | /* add the new list */ | 301 | /* add the new list */ |
305 | cut_lists = xrealloc_vector(cut_lists, 4, nlists); | 302 | cut_lists = xrealloc_vector(cut_lists, 4, nlists); |
306 | /* NB: startpos is always >= 0 */ | 303 | /* NB: startpos is always >= 0 */ |
diff --git a/testsuite/cut.tests b/testsuite/cut.tests index 0b401bc00..c335f824b 100755 --- a/testsuite/cut.tests +++ b/testsuite/cut.tests | |||
@@ -31,7 +31,10 @@ testing "-b encapsulated" "cut -b 3-8,4-6 input" "e:two:\npha:be\ne quic\n" \ | |||
31 | #testing "cut -bO overlaps" \ | 31 | #testing "cut -bO overlaps" \ |
32 | # "cut --output-delimiter ' ' -b 1-3,2-5,7-9,9-10 input" \ | 32 | # "cut --output-delimiter ' ' -b 1-3,2-5,7-9,9-10 input" \ |
33 | # "one:t o:th\nalpha beta\nthe q ick \n" "$abc" "" | 33 | # "one:t o:th\nalpha beta\nthe q ick \n" "$abc" "" |
34 | testing "cut high-low error" "cut -b 8-3 abc.txt 2>/dev/null || echo err" "err\n" \ | 34 | testing "cut high-low error" "cut -b 8-3 input 2>/dev/null || echo err" "err\n" \ |
35 | "$abc" "" | ||
36 | |||
37 | testing "cut -b 2-1 error" "cut -b 2-1 input 2>/dev/null || echo err" "err\n" \ | ||
35 | "$abc" "" | 38 | "$abc" "" |
36 | 39 | ||
37 | testing "cut -c a-b" "cut -c 4-10 input" ":two:th\nha:beta\n quick \n" "$abc" "" | 40 | testing "cut -c a-b" "cut -c 4-10 input" ":two:th\nha:beta\n quick \n" "$abc" "" |