Lines 157-162
main(int argc, char **argv)
Link Here
|
157 |
char *tptr, *uptr; |
157 |
char *tptr, *uptr; |
158 |
char possible_help_request; |
158 |
char possible_help_request; |
159 |
char buff[16]; |
159 |
char buff[16]; |
|
|
160 |
long l; |
160 |
|
161 |
|
161 |
/* |
162 |
/* |
162 |
* Use a pointer for consistency, but stack-allocated storage |
163 |
* Use a pointer for consistency, but stack-allocated storage |
Lines 301-316
main(int argc, char **argv)
Link Here
|
301 |
/* libarchive doesn't need this; just ignore it. */ |
302 |
/* libarchive doesn't need this; just ignore it. */ |
302 |
break; |
303 |
break; |
303 |
case 'b': /* SUSv2 */ |
304 |
case 'b': /* SUSv2 */ |
304 |
errno = 0; |
|
|
305 |
tptr = NULL; |
305 |
tptr = NULL; |
306 |
t = (int)strtol(bsdtar->argument, &tptr, 10); |
306 |
l = strtol(bsdtar->argument, &tptr, 10); |
307 |
if (errno || t <= 0 || t > 8192 || |
307 |
if (l <= 0 || l > 8192L || |
308 |
*(bsdtar->argument) == '\0' || tptr == NULL || |
308 |
*(bsdtar->argument) == '\0' || tptr == NULL || |
309 |
*tptr != '\0') { |
309 |
*tptr != '\0') { |
310 |
lafe_errc(1, 0, "Invalid or out of range " |
310 |
lafe_errc(1, 0, "Invalid or out of range " |
311 |
"(1..8192) argument to -b"); |
311 |
"(1..8192) argument to -b"); |
312 |
} |
312 |
} |
313 |
bsdtar->bytes_per_block = 512 * t; |
313 |
bsdtar->bytes_per_block = 512 * (int)l; |
314 |
/* Explicit -b forces last block size. */ |
314 |
/* Explicit -b forces last block size. */ |
315 |
bsdtar->bytes_in_last_block = bsdtar->bytes_per_block; |
315 |
bsdtar->bytes_in_last_block = bsdtar->bytes_per_block; |
316 |
break; |
316 |
break; |
Lines 369-412
main(int argc, char **argv)
Link Here
|
369 |
bsdtar->filename = bsdtar->argument; |
369 |
bsdtar->filename = bsdtar->argument; |
370 |
break; |
370 |
break; |
371 |
case OPTION_GID: /* cpio */ |
371 |
case OPTION_GID: /* cpio */ |
372 |
errno = 0; |
|
|
373 |
tptr = NULL; |
372 |
tptr = NULL; |
374 |
t = (int)strtol(bsdtar->argument, &tptr, 10); |
373 |
l = strtol(bsdtar->argument, &tptr, 10); |
375 |
if (errno || t < 0 || *(bsdtar->argument) == '\0' || |
374 |
if (l < 0 || l >= INT_MAX || *(bsdtar->argument) == '\0' || |
376 |
tptr == NULL || *tptr != '\0') { |
375 |
tptr == NULL || *tptr != '\0') { |
377 |
lafe_errc(1, 0, "Invalid argument to --gid"); |
376 |
lafe_errc(1, 0, "Invalid argument to --gid"); |
378 |
} |
377 |
} |
379 |
bsdtar->gid = t; |
378 |
bsdtar->gid = (int)l; |
380 |
break; |
379 |
break; |
381 |
case OPTION_GNAME: /* cpio */ |
380 |
case OPTION_GNAME: /* cpio */ |
382 |
bsdtar->gname = bsdtar->argument; |
381 |
bsdtar->gname = bsdtar->argument; |
383 |
break; |
382 |
break; |
384 |
case OPTION_GROUP: /* GNU tar */ |
383 |
case OPTION_GROUP: /* GNU tar */ |
385 |
errno = 0; |
|
|
386 |
tptr = NULL; |
384 |
tptr = NULL; |
387 |
|
385 |
|
388 |
uptr = strchr(bsdtar->argument, ':'); |
386 |
uptr = strchr(bsdtar->argument, ':'); |
389 |
if(uptr != NULL) { |
387 |
if (uptr != NULL) { |
390 |
if(uptr[1] == 0) { |
388 |
if (uptr[1] == '\0') { |
391 |
lafe_errc(1, 0, "Invalid argument to --group (missing id after :)"); |
389 |
lafe_errc(1, 0, "Invalid argument to --group (missing id after :)"); |
392 |
} |
390 |
} |
393 |
uptr[0] = 0; |
391 |
uptr[0] = 0; |
394 |
uptr++; |
392 |
uptr++; |
395 |
t = (int)strtol(uptr, &tptr, 10); |
393 |
l = strtol(uptr, &tptr, 10); |
396 |
if (errno || t < 0 || *uptr == '\0' || |
394 |
if (l < 0 || l >= INT_MAX || *uptr == '\0' || |
397 |
tptr == NULL || *tptr != '\0') { |
395 |
tptr == NULL || *tptr != '\0') { |
398 |
lafe_errc(1, 0, "Invalid argument to --group (%s is not a number)", uptr); |
396 |
lafe_errc(1, 0, "Invalid argument to --group (%s is not a number)", uptr); |
399 |
} else { |
397 |
} else { |
400 |
bsdtar->gid = t; |
398 |
bsdtar->gid = (int)l; |
401 |
} |
399 |
} |
402 |
bsdtar->gname = bsdtar->argument; |
400 |
bsdtar->gname = bsdtar->argument; |
403 |
} else { |
401 |
} else { |
404 |
t = (int)strtol(bsdtar->argument, &tptr, 10); |
402 |
l = strtol(bsdtar->argument, &tptr, 10); |
405 |
if (errno || t < 0 || *(bsdtar->argument) == '\0' || |
403 |
if (l < 0 || l >= INT_MAX || *(bsdtar->argument) == '\0' || |
406 |
tptr == NULL || *tptr != '\0') { |
404 |
tptr == NULL || *tptr != '\0') { |
407 |
bsdtar->gname = bsdtar->argument; |
405 |
bsdtar->gname = bsdtar->argument; |
408 |
} else { |
406 |
} else { |
409 |
bsdtar->gid = t; |
407 |
bsdtar->gid = (int)l; |
410 |
bsdtar->gname = ""; |
408 |
bsdtar->gname = ""; |
411 |
} |
409 |
} |
412 |
} |
410 |
} |
Lines 662-692
main(int argc, char **argv)
Link Here
|
662 |
bsdtar->option_options = bsdtar->argument; |
660 |
bsdtar->option_options = bsdtar->argument; |
663 |
break; |
661 |
break; |
664 |
case OPTION_OWNER: /* GNU tar */ |
662 |
case OPTION_OWNER: /* GNU tar */ |
665 |
errno = 0; |
|
|
666 |
tptr = NULL; |
663 |
tptr = NULL; |
667 |
|
664 |
|
668 |
uptr = strchr(bsdtar->argument, ':'); |
665 |
uptr = strchr(bsdtar->argument, ':'); |
669 |
if(uptr != NULL) { |
666 |
if (uptr != NULL) { |
670 |
if(uptr[1] == 0) { |
667 |
if (uptr[1] == 0) { |
671 |
lafe_errc(1, 0, "Invalid argument to --owner (missing id after :)"); |
668 |
lafe_errc(1, 0, "Invalid argument to --owner (missing id after :)"); |
672 |
} |
669 |
} |
673 |
uptr[0] = 0; |
670 |
uptr[0] = 0; |
674 |
uptr++; |
671 |
uptr++; |
675 |
t = (int)strtol(uptr, &tptr, 10); |
672 |
l = strtol(uptr, &tptr, 10); |
676 |
if (errno || t < 0 || *uptr == '\0' || |
673 |
if (l < 0 || l >= INT_MAX || *uptr == '\0' || |
677 |
tptr == NULL || *tptr != '\0') { |
674 |
tptr == NULL || *tptr != '\0') { |
678 |
lafe_errc(1, 0, "Invalid argument to --owner (%s is not a number)", uptr); |
675 |
lafe_errc(1, 0, "Invalid argument to --owner (%s is not a number)", uptr); |
679 |
} else { |
676 |
} else { |
680 |
bsdtar->uid = t; |
677 |
bsdtar->uid = (int)l; |
681 |
} |
678 |
} |
682 |
bsdtar->uname = bsdtar->argument; |
679 |
bsdtar->uname = bsdtar->argument; |
683 |
} else { |
680 |
} else { |
684 |
t = (int)strtol(bsdtar->argument, &tptr, 10); |
681 |
l = strtol(bsdtar->argument, &tptr, 10); |
685 |
if (errno || t < 0 || *(bsdtar->argument) == '\0' || |
682 |
if (l < 0 || l >= INT_MAX || *(bsdtar->argument) == '\0' || |
686 |
tptr == NULL || *tptr != '\0') { |
683 |
tptr == NULL || *tptr != '\0') { |
687 |
bsdtar->uname = bsdtar->argument; |
684 |
bsdtar->uname = bsdtar->argument; |
688 |
} else { |
685 |
} else { |
689 |
bsdtar->uid = t; |
686 |
bsdtar->uid = (int)l; |
690 |
bsdtar->uname = ""; |
687 |
bsdtar->uname = ""; |
691 |
} |
688 |
} |
692 |
} |
689 |
} |
Lines 748-762
main(int argc, char **argv)
Link Here
|
748 |
bsdtar->extract_flags |= ARCHIVE_EXTRACT_OWNER; |
745 |
bsdtar->extract_flags |= ARCHIVE_EXTRACT_OWNER; |
749 |
break; |
746 |
break; |
750 |
case OPTION_STRIP_COMPONENTS: /* GNU tar 1.15 */ |
747 |
case OPTION_STRIP_COMPONENTS: /* GNU tar 1.15 */ |
751 |
errno = 0; |
|
|
752 |
tptr = NULL; |
748 |
tptr = NULL; |
753 |
t = (int)strtol(bsdtar->argument, &tptr, 10); |
749 |
l = strtol(bsdtar->argument, &tptr, 10); |
754 |
if (errno || t < 0 || *(bsdtar->argument) == '\0' || |
750 |
if (l < 0 || l > 100000L || *(bsdtar->argument) == '\0' || |
755 |
tptr == NULL || *tptr != '\0') { |
751 |
tptr == NULL || *tptr != '\0') { |
756 |
lafe_errc(1, 0, "Invalid argument to " |
752 |
lafe_errc(1, 0, "Invalid argument to " |
757 |
"--strip-components"); |
753 |
"--strip-components"); |
758 |
} |
754 |
} |
759 |
bsdtar->strip_components = t; |
755 |
bsdtar->strip_components = (int)l; |
760 |
break; |
756 |
break; |
761 |
case 'T': /* GNU tar */ |
757 |
case 'T': /* GNU tar */ |
762 |
bsdtar->names_from_file = bsdtar->argument; |
758 |
bsdtar->names_from_file = bsdtar->argument; |
Lines 776-789
main(int argc, char **argv)
Link Here
|
776 |
set_mode(bsdtar, opt); |
772 |
set_mode(bsdtar, opt); |
777 |
break; |
773 |
break; |
778 |
case OPTION_UID: /* cpio */ |
774 |
case OPTION_UID: /* cpio */ |
779 |
errno = 0; |
|
|
780 |
tptr = NULL; |
775 |
tptr = NULL; |
781 |
t = (int)strtol(bsdtar->argument, &tptr, 10); |
776 |
l = strtol(bsdtar->argument, &tptr, 10); |
782 |
if (errno || t < 0 || *(bsdtar->argument) == '\0' || |
777 |
if (l < 0 || l >= INT_MAX || *(bsdtar->argument) == '\0' || |
783 |
tptr == NULL || *tptr != '\0') { |
778 |
tptr == NULL || *tptr != '\0') { |
784 |
lafe_errc(1, 0, "Invalid argument to --uid"); |
779 |
lafe_errc(1, 0, "Invalid argument to --uid"); |
785 |
} |
780 |
} |
786 |
bsdtar->uid = t; |
781 |
bsdtar->uid = (int)l; |
787 |
break; |
782 |
break; |
788 |
case OPTION_UNAME: /* cpio */ |
783 |
case OPTION_UNAME: /* cpio */ |
789 |
bsdtar->uname = bsdtar->argument; |
784 |
bsdtar->uname = bsdtar->argument; |