diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2024-12-13 20:22:05 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2024-12-13 20:22:05 +0100 |
commit | 7624077772878db25d8221fc4d6f731e29ebcdba (patch) | |
tree | fcd18c1c42a303cd124a324b65df14460ba4ee2b | |
parent | f4f8dc68645c061d4ccec5481bc3a659b02bc84f (diff) | |
download | busybox-w32-7624077772878db25d8221fc4d6f731e29ebcdba.tar.gz busybox-w32-7624077772878db25d8221fc4d6f731e29ebcdba.tar.bz2 busybox-w32-7624077772878db25d8221fc4d6f731e29ebcdba.zip |
cut: "it's legal to pass an empty list" seems to be untrue
function old new delta
cut_main 1344 1339 -5
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | coreutils/cut.c | 90 |
1 files changed, 44 insertions, 46 deletions
diff --git a/coreutils/cut.c b/coreutils/cut.c index 6eac7793f..9a99ad05c 100644 --- a/coreutils/cut.c +++ b/coreutils/cut.c | |||
@@ -336,61 +336,59 @@ int cut_main(int argc UNUSED_PARAM, char **argv) | |||
336 | * valid list formats: N, N-, N-M, -M | 336 | * valid list formats: N, N-, N-M, -M |
337 | * more than one list can be separated by commas | 337 | * more than one list can be separated by commas |
338 | */ | 338 | */ |
339 | { | 339 | /* take apart the lists, one by one (they are separated with commas) */ |
340 | while ((ltok = strsep(&sopt, ",")) != NULL) { | ||
340 | char *ntok; | 341 | char *ntok; |
341 | int s = 0, e = 0; | 342 | int s, e; |
342 | |||
343 | /* take apart the lists, one by one (they are separated with commas) */ | ||
344 | while ((ltok = strsep(&sopt, ",")) != NULL) { | ||
345 | |||
346 | /* it's actually legal to pass an empty list */ | ||
347 | if (!ltok[0]) | ||
348 | continue; | ||
349 | 343 | ||
350 | /* get the start pos */ | 344 | /* it's actually legal to pass an empty list */ |
351 | ntok = strsep(<ok, "-"); | 345 | //if (!ltok[0]) |
352 | if (!ntok[0]) { | 346 | // continue; |
353 | s = 0; | 347 | //^^^ testcase? |
354 | } else { | ||
355 | /* account for the fact that arrays are zero based, while | ||
356 | * the user expects the first char on the line to be char #1 */ | ||
357 | s = xatoi_positive(ntok) - 1; | ||
358 | } | ||
359 | |||
360 | /* get the end pos */ | ||
361 | if (ltok == NULL) { | ||
362 | e = s; | ||
363 | } else if (!ltok[0]) { | ||
364 | /* if the user specified no end position, | ||
365 | * that means "til the end of the line" */ | ||
366 | e = INT_MAX; | ||
367 | } else { | ||
368 | /* again, arrays are zero based, lines are 1 based */ | ||
369 | e = xatoi_positive(ltok) - 1; | ||
370 | } | ||
371 | 348 | ||
372 | if (s < 0 || e < s) | 349 | /* get the start pos */ |
373 | bb_error_msg_and_die("invalid range %s-%s", ntok, ltok ?: ntok); | 350 | ntok = strsep(<ok, "-"); |
351 | if (!ntok[0]) { | ||
352 | s = 0; | ||
353 | } else { | ||
354 | /* account for the fact that arrays are zero based, while | ||
355 | * the user expects the first char on the line to be char #1 */ | ||
356 | s = xatoi_positive(ntok) - 1; | ||
357 | } | ||
374 | 358 | ||
375 | /* add the new list */ | 359 | /* get the end pos */ |
376 | cut_list = xrealloc_vector(cut_list, 4, nlists); | 360 | if (ltok == NULL) { |
377 | /* NB: startpos is always >= 0 */ | 361 | e = s; |
378 | cut_list[nlists].startpos = s; | 362 | } else if (!ltok[0]) { |
379 | cut_list[nlists].endpos = e; | 363 | /* if the user specified no end position, |
380 | nlists++; | 364 | * that means "til the end of the line" */ |
365 | e = INT_MAX; | ||
366 | } else { | ||
367 | /* again, arrays are zero based, lines are 1 based */ | ||
368 | e = xatoi_positive(ltok) - 1; | ||
381 | } | 369 | } |
382 | 370 | ||
383 | /* make sure we got some cut positions out of all that */ | 371 | if (s < 0 || e < s) |
384 | if (nlists == 0) | 372 | bb_error_msg_and_die("invalid range %s-%s", ntok, ltok ?: ntok); |
385 | bb_simple_error_msg_and_die("missing list of positions"); | ||
386 | 373 | ||
387 | /* now that the lists are parsed, we need to sort them to make life | 374 | /* add the new list */ |
388 | * easier on us when it comes time to print the chars / fields / lines | 375 | cut_list = xrealloc_vector(cut_list, 4, nlists); |
389 | */ | 376 | /* NB: startpos is always >= 0 */ |
390 | if (!(opt & OPT_NOSORT)) | 377 | cut_list[nlists].startpos = s; |
391 | qsort(cut_list, nlists, sizeof(cut_list[0]), cmpfunc); | 378 | cut_list[nlists].endpos = e; |
379 | nlists++; | ||
392 | } | 380 | } |
393 | 381 | ||
382 | /* make sure we got some cut positions out of all that */ | ||
383 | if (nlists == 0) | ||
384 | bb_simple_error_msg_and_die("missing list of positions"); | ||
385 | |||
386 | /* now that the lists are parsed, we need to sort them to make life | ||
387 | * easier on us when it comes time to print the chars / fields / lines | ||
388 | */ | ||
389 | if (!(opt & OPT_NOSORT)) | ||
390 | qsort(cut_list, nlists, sizeof(cut_list[0]), cmpfunc); | ||
391 | |||
394 | #if ENABLE_FEATURE_CUT_REGEX | 392 | #if ENABLE_FEATURE_CUT_REGEX |
395 | if (opt & OPT_REGEX) { | 393 | if (opt & OPT_REGEX) { |
396 | xregcomp(®, delim, REG_EXTENDED); | 394 | xregcomp(®, delim, REG_EXTENDED); |