diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2006-11-27 14:43:21 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2006-11-27 14:43:21 +0000 |
commit | d686a045c8134d3a42fa5cc6b2e09118e08d603f (patch) | |
tree | 38f509fc9556f68f758c77b06b480cc33b2725eb | |
parent | 8a0a83d503a7971895254efa9e79cf15ba1850d4 (diff) | |
download | busybox-w32-d686a045c8134d3a42fa5cc6b2e09118e08d603f.tar.gz busybox-w32-d686a045c8134d3a42fa5cc6b2e09118e08d603f.tar.bz2 busybox-w32-d686a045c8134d3a42fa5cc6b2e09118e08d603f.zip |
safe_strtoXX interface proved to be a bit unconvenient.
Remove it, introduce saner bb_strtoXX.
Saved ~350 bytes.
-rw-r--r-- | coreutils/expr.c | 2 | ||||
-rw-r--r-- | coreutils/printf.c | 31 | ||||
-rw-r--r-- | e2fsprogs/mke2fs.c | 54 | ||||
-rw-r--r-- | e2fsprogs/tune2fs.c | 32 | ||||
-rw-r--r-- | include/libbb.h | 33 | ||||
-rw-r--r-- | include/xatonum.h | 51 | ||||
-rw-r--r-- | libbb/Kbuild | 2 | ||||
-rw-r--r-- | libbb/procps.c | 3 | ||||
-rw-r--r-- | libbb/safe_strtol.c | 147 | ||||
-rw-r--r-- | libbb/xatonum.c | 32 | ||||
-rw-r--r-- | libbb/xatonum_template.c | 10 | ||||
-rw-r--r-- | loginutils/getty.c | 4 | ||||
-rw-r--r-- | networking/ftpgetput.c | 3 | ||||
-rw-r--r-- | networking/udhcp/files.c | 6 | ||||
-rw-r--r-- | networking/wget.c | 12 | ||||
-rw-r--r-- | procps/renice.c | 3 |
16 files changed, 145 insertions, 280 deletions
diff --git a/coreutils/expr.c b/coreutils/expr.c index 854a657f9..191473446 100644 --- a/coreutils/expr.c +++ b/coreutils/expr.c | |||
@@ -49,6 +49,8 @@ typedef long arith_t; | |||
49 | #define STRTOL(s, e, b) strtol(s, e, b) | 49 | #define STRTOL(s, e, b) strtol(s, e, b) |
50 | #endif | 50 | #endif |
51 | 51 | ||
52 | /* TODO: use bb_strtol[l]? It's easier to check for errors... */ | ||
53 | |||
52 | /* A value is.... */ | 54 | /* A value is.... */ |
53 | struct valinfo { | 55 | struct valinfo { |
54 | TYPE type; /* Which kind. */ | 56 | TYPE type; /* Which kind. */ |
diff --git a/coreutils/printf.c b/coreutils/printf.c index 1511034a1..0e818354f 100644 --- a/coreutils/printf.c +++ b/coreutils/printf.c | |||
@@ -44,38 +44,55 @@ static int print_formatted(char *format, int argc, char **argv); | |||
44 | static void print_direc(char *start, size_t length, | 44 | static void print_direc(char *start, size_t length, |
45 | int field_width, int precision, char *argument); | 45 | int field_width, int precision, char *argument); |
46 | 46 | ||
47 | typedef int (*converter)(char *arg, void *result); | 47 | typedef void (*converter)(char *arg, void *result); |
48 | 48 | ||
49 | static void multiconvert(char *arg, void *result, converter convert) | 49 | static void multiconvert(char *arg, void *result, converter convert) |
50 | { | 50 | { |
51 | char s[16]; | 51 | char s[16]; |
52 | if (*arg == '"' || *arg == '\'') { | 52 | if (*arg == '"' || *arg == '\'') { |
53 | sprintf(s, "%d", (unsigned)arg[1]); | 53 | sprintf(s, "%d", (unsigned char)arg[1]); |
54 | arg = s; | 54 | arg = s; |
55 | } | 55 | } |
56 | if (convert(arg, result)) | 56 | convert(arg, result); |
57 | if (errno) /* Huh, looks strange... bug? */ | ||
57 | fputs(arg, stderr); | 58 | fputs(arg, stderr); |
58 | } | 59 | } |
59 | 60 | ||
61 | static void conv_strtoul(char *arg, void *result) | ||
62 | { | ||
63 | *(unsigned long*)result = bb_strtoul(arg, NULL, 10); | ||
64 | } | ||
65 | static void conv_strtol(char *arg, void *result) | ||
66 | { | ||
67 | *(long*)result = bb_strtol(arg, NULL, 10); | ||
68 | } | ||
69 | static void conv_strtod(char *arg, void *result) | ||
70 | { | ||
71 | char *end; | ||
72 | /* Well, this one allows leading whitespace... so what */ | ||
73 | /* What I like much less is that "-" is accepted too! :( */ | ||
74 | *(double*)result = strtod(arg, &end); | ||
75 | if (end[0]) errno = ERANGE; | ||
76 | } | ||
77 | |||
60 | static unsigned long my_xstrtoul(char *arg) | 78 | static unsigned long my_xstrtoul(char *arg) |
61 | { | 79 | { |
62 | unsigned long result; | 80 | unsigned long result; |
63 | 81 | multiconvert(arg, &result, conv_strtoul); | |
64 | multiconvert(arg, &result, (converter)safe_strtoul); | ||
65 | return result; | 82 | return result; |
66 | } | 83 | } |
67 | 84 | ||
68 | static long my_xstrtol(char *arg) | 85 | static long my_xstrtol(char *arg) |
69 | { | 86 | { |
70 | long result; | 87 | long result; |
71 | multiconvert(arg, &result, (converter)safe_strtol); | 88 | multiconvert(arg, &result, conv_strtol); |
72 | return result; | 89 | return result; |
73 | } | 90 | } |
74 | 91 | ||
75 | static double my_xstrtod(char *arg) | 92 | static double my_xstrtod(char *arg) |
76 | { | 93 | { |
77 | double result; | 94 | double result; |
78 | multiconvert(arg, &result, (converter)safe_strtod); | 95 | multiconvert(arg, &result, conv_strtod); |
79 | return result; | 96 | return result; |
80 | } | 97 | } |
81 | 98 | ||
diff --git a/e2fsprogs/mke2fs.c b/e2fsprogs/mke2fs.c index 1c4f1541e..f25ecfb6c 100644 --- a/e2fsprogs/mke2fs.c +++ b/e2fsprogs/mke2fs.c | |||
@@ -673,7 +673,7 @@ static void show_stats(ext2_filsys fs) | |||
673 | static int set_os(struct ext2_super_block *sb, char *os) | 673 | static int set_os(struct ext2_super_block *sb, char *os) |
674 | { | 674 | { |
675 | if (isdigit (*os)) { | 675 | if (isdigit (*os)) { |
676 | sb->s_creator_os = atoi (os); | 676 | sb->s_creator_os = atoi(os); |
677 | return 1; | 677 | return 1; |
678 | } | 678 | } |
679 | 679 | ||
@@ -790,7 +790,7 @@ static __u32 ok_features[3] = { | |||
790 | 790 | ||
791 | static int PRS(int argc, char *argv[]) | 791 | static int PRS(int argc, char *argv[]) |
792 | { | 792 | { |
793 | int b, c; | 793 | int c; |
794 | int size; | 794 | int size; |
795 | char * tmp; | 795 | char * tmp; |
796 | int blocksize = 0; | 796 | int blocksize = 0; |
@@ -848,54 +848,32 @@ static int PRS(int argc, char *argv[]) | |||
848 | "b:cE:f:g:i:jl:m:no:qr:R:s:tvI:J:ST:FL:M:N:O:V")) != EOF) { | 848 | "b:cE:f:g:i:jl:m:no:qr:R:s:tvI:J:ST:FL:M:N:O:V")) != EOF) { |
849 | switch (c) { | 849 | switch (c) { |
850 | case 'b': | 850 | case 'b': |
851 | if (safe_strtoi(optarg, &blocksize)) | 851 | blocksize = xatou_range(optarg, EXT2_MIN_BLOCK_SIZE, EXT2_MAX_BLOCK_SIZE); |
852 | goto BLOCKSIZE_ERROR; | ||
853 | b = (blocksize > 0) ? blocksize : -blocksize; | ||
854 | if (b < EXT2_MIN_BLOCK_SIZE || | ||
855 | b > EXT2_MAX_BLOCK_SIZE) { | ||
856 | BLOCKSIZE_ERROR: | ||
857 | bb_error_msg_and_die("invalid block size - %s", optarg); | ||
858 | } | ||
859 | mke2fs_warning_msg((blocksize > 4096), | 852 | mke2fs_warning_msg((blocksize > 4096), |
860 | "blocksize %d not usable on most systems", | 853 | "blocksize %d not usable on most systems", |
861 | blocksize); | 854 | blocksize); |
862 | if (blocksize > 0) | 855 | param.s_log_block_size = |
863 | param.s_log_block_size = | 856 | int_log2(blocksize >> EXT2_MIN_BLOCK_LOG_SIZE); |
864 | int_log2(blocksize >> | ||
865 | EXT2_MIN_BLOCK_LOG_SIZE); | ||
866 | break; | 857 | break; |
867 | case 'c': /* Check for bad blocks */ | 858 | case 'c': /* Check for bad blocks */ |
868 | case 't': /* deprecated */ | 859 | case 't': /* deprecated */ |
869 | cflag++; | 860 | cflag++; |
870 | break; | 861 | break; |
871 | case 'f': | 862 | case 'f': |
872 | if (safe_strtoi(optarg, &size) || size < EXT2_MIN_BLOCK_SIZE || size > EXT2_MAX_BLOCK_SIZE ){ | 863 | size = xatou_range(optarg, EXT2_MIN_BLOCK_SIZE, EXT2_MAX_BLOCK_SIZE); |
873 | bb_error_msg_and_die("invalid fragment size - %s", optarg); | ||
874 | } | ||
875 | param.s_log_frag_size = | 864 | param.s_log_frag_size = |
876 | int_log2(size >> EXT2_MIN_BLOCK_LOG_SIZE); | 865 | int_log2(size >> EXT2_MIN_BLOCK_LOG_SIZE); |
877 | mke2fs_warning_msg(1, "fragments not supported. Ignoring -f option"); | 866 | mke2fs_warning_msg(1, "fragments not supported. Ignoring -f option"); |
878 | break; | 867 | break; |
879 | case 'g': | 868 | case 'g': |
880 | { | 869 | param.s_blocks_per_group = xatou32(optarg); |
881 | int foo; | ||
882 | if (safe_strtoi(optarg, &foo)) { | ||
883 | bb_error_msg_and_die("Illegal number for blocks per group"); | ||
884 | } | ||
885 | param.s_blocks_per_group = foo; | ||
886 | } | ||
887 | if ((param.s_blocks_per_group % 8) != 0) { | 870 | if ((param.s_blocks_per_group % 8) != 0) { |
888 | bb_error_msg_and_die("blocks per group must be multiple of 8"); | 871 | bb_error_msg_and_die("blocks per group must be multiple of 8"); |
889 | } | 872 | } |
890 | break; | 873 | break; |
891 | case 'i': | 874 | case 'i': |
892 | if (safe_strtoi(optarg, &inode_ratio) | 875 | /* Huh? is "* 1024" correct? */ |
893 | || inode_ratio < EXT2_MIN_BLOCK_SIZE | 876 | inode_ratio = xatou_range(optarg, EXT2_MIN_BLOCK_SIZE, EXT2_MAX_BLOCK_SIZE * 1024); |
894 | || inode_ratio > EXT2_MAX_BLOCK_SIZE * 1024) { | ||
895 | bb_error_msg_and_die("invalid inode ratio %s (min %d/max %d)", | ||
896 | optarg, EXT2_MIN_BLOCK_SIZE, | ||
897 | EXT2_MAX_BLOCK_SIZE); | ||
898 | } | ||
899 | break; | 877 | break; |
900 | case 'J': | 878 | case 'J': |
901 | parse_journal_opts(&journal_device, &journal_flags, &journal_size, optarg); | 879 | parse_journal_opts(&journal_device, &journal_flags, &journal_size, optarg); |
@@ -910,9 +888,7 @@ BLOCKSIZE_ERROR: | |||
910 | bad_blocks_filename = optarg; | 888 | bad_blocks_filename = optarg; |
911 | break; | 889 | break; |
912 | case 'm': | 890 | case 'm': |
913 | if (safe_strtoi(optarg, &reserved_ratio) || reserved_ratio > 50 ) { | 891 | reserved_ratio = xatou_range(optarg, 0, 50); |
914 | bb_error_msg_and_die("invalid reserved blocks percent - %s", optarg); | ||
915 | } | ||
916 | break; | 892 | break; |
917 | case 'n': | 893 | case 'n': |
918 | noaction++; | 894 | noaction++; |
@@ -921,7 +897,7 @@ BLOCKSIZE_ERROR: | |||
921 | creator_os = optarg; | 897 | creator_os = optarg; |
922 | break; | 898 | break; |
923 | case 'r': | 899 | case 'r': |
924 | param.s_rev_level = atoi(optarg); | 900 | param.s_rev_level = xatoi_u(optarg); |
925 | if (param.s_rev_level == EXT2_GOOD_OLD_REV) { | 901 | if (param.s_rev_level == EXT2_GOOD_OLD_REV) { |
926 | param.s_feature_incompat = 0; | 902 | param.s_feature_incompat = 0; |
927 | param.s_feature_compat = 0; | 903 | param.s_feature_compat = 0; |
@@ -929,7 +905,7 @@ BLOCKSIZE_ERROR: | |||
929 | } | 905 | } |
930 | break; | 906 | break; |
931 | case 's': /* deprecated */ | 907 | case 's': /* deprecated */ |
932 | if (atoi(optarg)) | 908 | if (xatou(optarg)) |
933 | param.s_feature_ro_compat |= | 909 | param.s_feature_ro_compat |= |
934 | EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER; | 910 | EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER; |
935 | else | 911 | else |
@@ -938,13 +914,11 @@ BLOCKSIZE_ERROR: | |||
938 | break; | 914 | break; |
939 | #ifdef EXT2_DYNAMIC_REV | 915 | #ifdef EXT2_DYNAMIC_REV |
940 | case 'I': | 916 | case 'I': |
941 | if (safe_strtoi(optarg, &inode_size)) { | 917 | inode_size = xatoi_u(optarg); |
942 | bb_error_msg_and_die("invalid inode size - %s", optarg); | ||
943 | } | ||
944 | break; | 918 | break; |
945 | #endif | 919 | #endif |
946 | case 'N': | 920 | case 'N': |
947 | num_inodes = atoi(optarg); | 921 | num_inodes = xatoi_u(optarg); |
948 | break; | 922 | break; |
949 | case 'v': | 923 | case 'v': |
950 | quiet = 0; | 924 | quiet = 0; |
diff --git a/e2fsprogs/tune2fs.c b/e2fsprogs/tune2fs.c index d22deede2..c8dfc6927 100644 --- a/e2fsprogs/tune2fs.c +++ b/e2fsprogs/tune2fs.c | |||
@@ -54,7 +54,8 @@ static int m_flag, M_flag, r_flag, s_flag = -1, u_flag, U_flag, T_flag; | |||
54 | static time_t last_check_time; | 54 | static time_t last_check_time; |
55 | static int print_label; | 55 | static int print_label; |
56 | static int max_mount_count, mount_count, mount_flags; | 56 | static int max_mount_count, mount_count, mount_flags; |
57 | static unsigned long interval, reserved_ratio, reserved_blocks; | 57 | static unsigned long interval, reserved_blocks; |
58 | static unsigned reserved_ratio; | ||
58 | static unsigned long resgid, resuid; | 59 | static unsigned long resgid, resuid; |
59 | static unsigned short errors; | 60 | static unsigned short errors; |
60 | static int open_flag; | 61 | static int open_flag; |
@@ -410,19 +411,14 @@ static void parse_tune2fs_options(int argc, char **argv) | |||
410 | switch (c) | 411 | switch (c) |
411 | { | 412 | { |
412 | case 'c': | 413 | case 'c': |
413 | if (safe_strtoi(optarg, &max_mount_count) || max_mount_count > 16000) { | 414 | max_mount_count = xatou_range(optarg, 0, 16000); |
414 | goto MOUNTS_COUNT_ERROR; | ||
415 | } | ||
416 | if (max_mount_count == 0) | 415 | if (max_mount_count == 0) |
417 | max_mount_count = -1; | 416 | max_mount_count = -1; |
418 | c_flag = 1; | 417 | c_flag = 1; |
419 | open_flag = EXT2_FLAG_RW; | 418 | open_flag = EXT2_FLAG_RW; |
420 | break; | 419 | break; |
421 | case 'C': | 420 | case 'C': |
422 | if (safe_strtoi(optarg, &mount_count) || mount_count > 16000) { | 421 | mount_count = xatou_range(optarg, 0, 16000); |
423 | MOUNTS_COUNT_ERROR: | ||
424 | bb_error_msg_and_die("bad mounts count - %s", optarg); | ||
425 | } | ||
426 | C_flag = 1; | 422 | C_flag = 1; |
427 | open_flag = EXT2_FLAG_RW; | 423 | open_flag = EXT2_FLAG_RW; |
428 | break; | 424 | break; |
@@ -443,13 +439,14 @@ MOUNTS_COUNT_ERROR: | |||
443 | f_flag = 1; | 439 | f_flag = 1; |
444 | break; | 440 | break; |
445 | case 'g': | 441 | case 'g': |
446 | if (safe_strtoul(optarg, &resgid)) | 442 | resgid = bb_strtoul(optarg, NULL, 10); |
443 | if (errno) | ||
447 | resgid = bb_xgetgrnam(optarg); | 444 | resgid = bb_xgetgrnam(optarg); |
448 | g_flag = 1; | 445 | g_flag = 1; |
449 | open_flag = EXT2_FLAG_RW; | 446 | open_flag = EXT2_FLAG_RW; |
450 | break; | 447 | break; |
451 | case 'i': | 448 | case 'i': |
452 | interval = strtoul (optarg, &tmp, 0); | 449 | interval = strtoul(optarg, &tmp, 0); |
453 | switch (*tmp) { | 450 | switch (*tmp) { |
454 | case 's': | 451 | case 's': |
455 | tmp++; | 452 | tmp++; |
@@ -497,9 +494,7 @@ MOUNTS_COUNT_ERROR: | |||
497 | EXT2_FLAG_JOURNAL_DEV_OK; | 494 | EXT2_FLAG_JOURNAL_DEV_OK; |
498 | break; | 495 | break; |
499 | case 'm': | 496 | case 'm': |
500 | if(safe_strtoul(optarg, &reserved_ratio) || reserved_ratio > 50) { | 497 | reserved_ratio = xatou_range(optarg, 0, 50); |
501 | bb_error_msg_and_die("bad reserved block ratio - %s", optarg); | ||
502 | } | ||
503 | m_flag = 1; | 498 | m_flag = 1; |
504 | open_flag = EXT2_FLAG_RW; | 499 | open_flag = EXT2_FLAG_RW; |
505 | break; | 500 | break; |
@@ -524,9 +519,7 @@ MOUNTS_COUNT_ERROR: | |||
524 | open_flag = EXT2_FLAG_RW; | 519 | open_flag = EXT2_FLAG_RW; |
525 | break; | 520 | break; |
526 | case 'r': | 521 | case 'r': |
527 | if(safe_strtoul(optarg, &reserved_blocks)) { | 522 | reserved_blocks = xatoul(optarg); |
528 | bb_error_msg_and_die("bad reserved blocks count - %s", optarg); | ||
529 | } | ||
530 | r_flag = 1; | 523 | r_flag = 1; |
531 | open_flag = EXT2_FLAG_RW; | 524 | open_flag = EXT2_FLAG_RW; |
532 | break; | 525 | break; |
@@ -540,7 +533,8 @@ MOUNTS_COUNT_ERROR: | |||
540 | open_flag = EXT2_FLAG_RW; | 533 | open_flag = EXT2_FLAG_RW; |
541 | break; | 534 | break; |
542 | case 'u': | 535 | case 'u': |
543 | if (safe_strtoul(optarg, &resuid)) | 536 | resuid = bb_strtoul(optarg, NULL, 10); |
537 | if (errno) | ||
544 | resuid = bb_xgetpwnam(optarg); | 538 | resuid = bb_xgetpwnam(optarg); |
545 | u_flag = 1; | 539 | u_flag = 1; |
546 | open_flag = EXT2_FLAG_RW; | 540 | open_flag = EXT2_FLAG_RW; |
@@ -646,9 +640,9 @@ int tune2fs_main(int argc, char **argv) | |||
646 | } | 640 | } |
647 | if (m_flag) { | 641 | if (m_flag) { |
648 | sb->s_r_blocks_count = (sb->s_blocks_count / 100) | 642 | sb->s_r_blocks_count = (sb->s_blocks_count / 100) |
649 | * reserved_ratio; | 643 | * reserved_ratio; |
650 | ext2fs_mark_super_dirty(fs); | 644 | ext2fs_mark_super_dirty(fs); |
651 | printf("Setting reserved blocks percentage to %lu (%u blocks)\n", | 645 | printf("Setting reserved blocks percentage to %u (%u blocks)\n", |
652 | reserved_ratio, sb->s_r_blocks_count); | 646 | reserved_ratio, sb->s_r_blocks_count); |
653 | } | 647 | } |
654 | if (r_flag) { | 648 | if (r_flag) { |
diff --git a/include/libbb.h b/include/libbb.h index e93031231..63748c85d 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
@@ -85,30 +85,31 @@ | |||
85 | /* CONFIG_LFS is on */ | 85 | /* CONFIG_LFS is on */ |
86 | # if ULONG_MAX > 0xffffffff | 86 | # if ULONG_MAX > 0xffffffff |
87 | /* "long" is long enough on this system */ | 87 | /* "long" is long enough on this system */ |
88 | # define STRTOOFF strtol | 88 | # define XSTRTOOFF xstrtoul |
89 | # define SAFE_STRTOOFF safe_strtol | 89 | /* usage: sz = BB_STRTOOFF(s, NULL, 10); if (errno || sz < 0) die(); */ |
90 | # define XSTRTOUOFF xstrtoul | 90 | # define BB_STRTOOFF bb_strtoul |
91 | # define STRTOOFF strtoul | ||
91 | /* usage: printf("size: %"OFF_FMT"d (%"OFF_FMT"x)\n", sz, sz); */ | 92 | /* usage: printf("size: %"OFF_FMT"d (%"OFF_FMT"x)\n", sz, sz); */ |
92 | # define OFF_FMT "l" | 93 | # define OFF_FMT "l" |
93 | # else | 94 | # else |
94 | /* "long" is too short, need "long long" */ | 95 | /* "long" is too short, need "long long" */ |
95 | # define STRTOOFF strtoll | 96 | # define XSTRTOOFF xstrtoull |
96 | # define SAFE_STRTOOFF safe_strtoll | 97 | # define BB_STRTOOFF bb_strtoull |
97 | # define XSTRTOUOFF xstrtoull | 98 | # define STRTOOFF strtoull |
98 | # define OFF_FMT "ll" | 99 | # define OFF_FMT "ll" |
99 | # endif | 100 | # endif |
100 | #else | 101 | #else |
101 | # if 0 /* #if UINT_MAX == 0xffffffff */ | 102 | # if 0 /* #if UINT_MAX == 0xffffffff */ |
102 | /* Doesn't work. off_t is a long. gcc will throw warnings on printf("%d", off_t) | 103 | /* Doesn't work. off_t is a long. gcc will throw warnings on printf("%d", off_t) |
103 | * even if long==int on this arch. Crap... */ | 104 | * even if long==int on this arch. Crap... */ |
105 | # define XSTRTOOFF xstrtou | ||
106 | # define BB_STRTOOFF bb_strtoi | ||
104 | # define STRTOOFF strtol | 107 | # define STRTOOFF strtol |
105 | # define SAFE_STRTOOFF safe_strtoi | ||
106 | # define XSTRTOUOFF xstrtou | ||
107 | # define OFF_FMT "" | 108 | # define OFF_FMT "" |
108 | # else | 109 | # else |
110 | # define XSTRTOOFF xstrtoul | ||
111 | # define BB_STRTOOFF bb_strtol | ||
109 | # define STRTOOFF strtol | 112 | # define STRTOOFF strtol |
110 | # define SAFE_STRTOOFF safe_strtol | ||
111 | # define XSTRTOUOFF xstrtoul | ||
112 | # define OFF_FMT "l" | 113 | # define OFF_FMT "l" |
113 | # endif | 114 | # endif |
114 | #endif | 115 | #endif |
@@ -299,18 +300,6 @@ extern char *utoa(unsigned n); | |||
299 | extern void itoa_to_buf(int n, char *buf, unsigned buflen); | 300 | extern void itoa_to_buf(int n, char *buf, unsigned buflen); |
300 | extern char *itoa(int n); | 301 | extern char *itoa(int n); |
301 | 302 | ||
302 | // FIXME: the prototype doesn't match libc strtoXX -> confusion | ||
303 | // FIXME: alot of unchecked strtoXXX are still in tree | ||
304 | // FIXME: atoi_or_else(str, N)? | ||
305 | extern int safe_strtoi(const char *arg, int* value); | ||
306 | extern int safe_strtou(const char *arg, unsigned* value); | ||
307 | extern int safe_strtod(const char *arg, double* value); | ||
308 | extern int safe_strtol(const char *arg, long* value); | ||
309 | extern int safe_strtoll(const char *arg, long long* value); | ||
310 | extern int safe_strtoul(const char *arg, unsigned long* value); | ||
311 | extern int safe_strtoull(const char *arg, unsigned long long* value); | ||
312 | extern int safe_strtou32(const char *arg, uint32_t* value); | ||
313 | |||
314 | struct suffix_mult { | 303 | struct suffix_mult { |
315 | const char *suffix; | 304 | const char *suffix; |
316 | unsigned mult; | 305 | unsigned mult; |
diff --git a/include/xatonum.h b/include/xatonum.h index 46e49b0eb..585d84623 100644 --- a/include/xatonum.h +++ b/include/xatonum.h | |||
@@ -104,3 +104,54 @@ extern inline uint32_t xatou32(const char *numstr) | |||
104 | return xatoul(numstr); | 104 | return xatoul(numstr); |
105 | return BUG_xatou32_unimplemented(); | 105 | return BUG_xatou32_unimplemented(); |
106 | } | 106 | } |
107 | |||
108 | /* Non-aborting kind of convertors */ | ||
109 | |||
110 | unsigned long long bb_strtoull(const char *arg, char **endp, int base); | ||
111 | long long bb_strtoll(const char *arg, char **endp, int base); | ||
112 | |||
113 | #if ULONG_MAX == ULLONG_MAX | ||
114 | extern inline | ||
115 | unsigned long bb_strtoul(const char *arg, char **endp, int base) | ||
116 | { return bb_strtoull(arg, endp, base); } | ||
117 | extern inline | ||
118 | unsigned long bb_strtol(const char *arg, char **endp, int base) | ||
119 | { return bb_strtoll(arg, endp, base); } | ||
120 | #else | ||
121 | unsigned long bb_strtoul(const char *arg, char **endp, int base); | ||
122 | long bb_strtol(const char *arg, char **endp, int base); | ||
123 | #endif | ||
124 | |||
125 | #if UINT_MAX == ULLONG_MAX | ||
126 | extern inline | ||
127 | unsigned long bb_strtou(const char *arg, char **endp, int base) | ||
128 | { return bb_strtoull(arg, endp, base); } | ||
129 | extern inline | ||
130 | unsigned long bb_strtoi(const char *arg, char **endp, int base) | ||
131 | { return bb_strtoll(arg, endp, base); } | ||
132 | #elif UINT_MAX == ULONG_MAX | ||
133 | extern inline | ||
134 | unsigned long bb_strtou(const char *arg, char **endp, int base) | ||
135 | { return bb_strtoul(arg, endp, base); } | ||
136 | extern inline | ||
137 | unsigned long bb_strtoi(const char *arg, char **endp, int base) | ||
138 | { return bb_strtol(arg, endp, base); } | ||
139 | #else | ||
140 | unsigned long bb_strtou(const char *arg, char **endp, int base); | ||
141 | long bb_strtoi(const char *arg, char **endp, int base); | ||
142 | #endif | ||
143 | |||
144 | int BUG_bb_strtou32_unimplemented(void); | ||
145 | extern inline | ||
146 | uint32_t bb_strtou32(const char *arg, char **endp, int base) | ||
147 | { | ||
148 | if (sizeof(uint32_t) == sizeof(unsigned)) | ||
149 | return bb_strtou(arg, endp, base); | ||
150 | if (sizeof(uint32_t) == sizeof(unsigned long)) | ||
151 | return bb_strtoul(arg, endp, base); | ||
152 | return BUG_bb_strtou32_unimplemented(); | ||
153 | } | ||
154 | |||
155 | /* Floating point */ | ||
156 | |||
157 | /* double bb_strtod(const char *arg, char **endp); */ | ||
diff --git a/libbb/Kbuild b/libbb/Kbuild index 550723cea..c15615302 100644 --- a/libbb/Kbuild +++ b/libbb/Kbuild | |||
@@ -10,6 +10,7 @@ lib-y += ask_confirmation.o | |||
10 | lib-y += bb_askpass.o | 10 | lib-y += bb_askpass.o |
11 | lib-y += bb_do_delay.o | 11 | lib-y += bb_do_delay.o |
12 | lib-y += bb_pwd.o | 12 | lib-y += bb_pwd.o |
13 | lib-y += bb_strtonum.o | ||
13 | lib-y += change_identity.o | 14 | lib-y += change_identity.o |
14 | lib-y += chomp.o | 15 | lib-y += chomp.o |
15 | lib-y += compare_string_array.o | 16 | lib-y += compare_string_array.o |
@@ -67,7 +68,6 @@ lib-y += remove_file.o | |||
67 | lib-y += restricted_shell.o | 68 | lib-y += restricted_shell.o |
68 | lib-y += run_shell.o | 69 | lib-y += run_shell.o |
69 | lib-y += safe_strncpy.o | 70 | lib-y += safe_strncpy.o |
70 | lib-y += safe_strtol.o | ||
71 | lib-y += safe_write.o | 71 | lib-y += safe_write.o |
72 | lib-y += setup_environment.o | 72 | lib-y += setup_environment.o |
73 | lib-y += sha1.o | 73 | lib-y += sha1.o |
diff --git a/libbb/procps.c b/libbb/procps.c index ee4f5e53f..017710ff4 100644 --- a/libbb/procps.c +++ b/libbb/procps.c | |||
@@ -119,7 +119,8 @@ procps_status_t* procps_scan(procps_status_t* sp, int flags) | |||
119 | free_procps_scan(sp); | 119 | free_procps_scan(sp); |
120 | return NULL; | 120 | return NULL; |
121 | } | 121 | } |
122 | if (safe_strtou(entry->d_name, &pid)) | 122 | pid = bb_strtou(entry->d_name, NULL, 10); |
123 | if (errno) | ||
123 | continue; | 124 | continue; |
124 | 125 | ||
125 | /* After this point we have to break, not continue | 126 | /* After this point we have to break, not continue |
diff --git a/libbb/safe_strtol.c b/libbb/safe_strtol.c deleted file mode 100644 index d3bb29cdd..000000000 --- a/libbb/safe_strtol.c +++ /dev/null | |||
@@ -1,147 +0,0 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * Utility routines. | ||
4 | * | ||
5 | * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> | ||
6 | * | ||
7 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. | ||
8 | */ | ||
9 | |||
10 | #include <assert.h> | ||
11 | #include "libbb.h" | ||
12 | |||
13 | int safe_strtod(const char *arg, double* value) | ||
14 | { | ||
15 | char *endptr; | ||
16 | int errno_save = errno; | ||
17 | |||
18 | assert(arg!=NULL); | ||
19 | errno = 0; | ||
20 | *value = strtod(arg, &endptr); | ||
21 | if (errno != 0 || *endptr != '\0' || endptr == arg) { | ||
22 | return 1; | ||
23 | } | ||
24 | errno = errno_save; | ||
25 | return 0; | ||
26 | } | ||
27 | |||
28 | int safe_strtoull(const char *arg, unsigned long long* value) | ||
29 | { | ||
30 | char *endptr; | ||
31 | int errno_save = errno; | ||
32 | |||
33 | assert(arg!=NULL); | ||
34 | if (!isdigit(arg[0])) /* strtouXX takes minus signs w/o error! :( */ | ||
35 | return 1; | ||
36 | errno = 0; | ||
37 | *value = strtoull(arg, &endptr, 0); | ||
38 | if (errno != 0 || *endptr != '\0' || endptr == arg) { | ||
39 | return 1; | ||
40 | } | ||
41 | errno = errno_save; | ||
42 | return 0; | ||
43 | } | ||
44 | |||
45 | int safe_strtoll(const char *arg, long long* value) | ||
46 | { | ||
47 | char *endptr; | ||
48 | int errno_save = errno; | ||
49 | |||
50 | assert(arg!=NULL); | ||
51 | errno = 0; | ||
52 | *value = strtoll(arg, &endptr, 0); | ||
53 | if (errno != 0 || *endptr != '\0' || endptr == arg) { | ||
54 | return 1; | ||
55 | } | ||
56 | errno = errno_save; | ||
57 | return 0; | ||
58 | } | ||
59 | |||
60 | int safe_strtoul(const char *arg, unsigned long* value) | ||
61 | { | ||
62 | char *endptr; | ||
63 | int errno_save = errno; | ||
64 | |||
65 | assert(arg!=NULL); | ||
66 | if (!isdigit(arg[0])) /* strtouXX takes minus signs w/o error! :( */ | ||
67 | return 1; | ||
68 | errno = 0; | ||
69 | *value = strtoul(arg, &endptr, 0); | ||
70 | if (errno != 0 || *endptr != '\0' || endptr == arg) { | ||
71 | return 1; | ||
72 | } | ||
73 | errno = errno_save; | ||
74 | return 0; | ||
75 | } | ||
76 | |||
77 | int safe_strtol(const char *arg, long* value) | ||
78 | { | ||
79 | char *endptr; | ||
80 | int errno_save = errno; | ||
81 | |||
82 | assert(arg!=NULL); | ||
83 | errno = 0; | ||
84 | *value = strtol(arg, &endptr, 0); | ||
85 | if (errno != 0 || *endptr != '\0' || endptr == arg) { | ||
86 | return 1; | ||
87 | } | ||
88 | errno = errno_save; | ||
89 | return 0; | ||
90 | } | ||
91 | |||
92 | /* TODO: This is what uclibc is doing. Try to do the same? */ | ||
93 | |||
94 | #if 0 | ||
95 | #if defined __HAVE_ELF__ | ||
96 | |||
97 | # define strong_alias(name, aliasname) _strong_alias(name, aliasname) | ||
98 | # define _strong_alias(name, aliasname) \ | ||
99 | extern __typeof (name) aliasname __attribute__ ((alias (#name))); | ||
100 | |||
101 | #else /* !defined __HAVE_ELF__ */ | ||
102 | |||
103 | # define strong_alias(name, aliasname) _strong_alias (name, aliasname) | ||
104 | # define _strong_alias(name, aliasname) \ | ||
105 | __asm__(".global " __C_SYMBOL_PREFIX__ #aliasname "\n" \ | ||
106 | ".set " __C_SYMBOL_PREFIX__ #aliasname "," __C_SYMBOL_PREFIX__ #name); | ||
107 | |||
108 | #endif | ||
109 | #endif | ||
110 | |||
111 | int safe_strtoi(const char *arg, int* value) | ||
112 | { | ||
113 | int error; | ||
114 | long lvalue; | ||
115 | if (sizeof(long) == sizeof(int)) | ||
116 | return safe_strtol(arg, (long*)value); | ||
117 | lvalue = *value; | ||
118 | error = safe_strtol(arg, &lvalue); | ||
119 | if (lvalue < INT_MIN || lvalue > INT_MAX) | ||
120 | return 1; | ||
121 | *value = (int) lvalue; | ||
122 | return error; | ||
123 | } | ||
124 | |||
125 | int safe_strtou(const char *arg, unsigned* value) | ||
126 | { | ||
127 | int error; | ||
128 | unsigned long lvalue; | ||
129 | if (sizeof(unsigned long) == sizeof(unsigned)) | ||
130 | return safe_strtoul(arg, (unsigned long*)value); | ||
131 | lvalue = *value; | ||
132 | error = safe_strtoul(arg, &lvalue); | ||
133 | if (lvalue > UINT_MAX) | ||
134 | return 1; | ||
135 | *value = (unsigned) lvalue; | ||
136 | return error; | ||
137 | } | ||
138 | |||
139 | int BUG_safe_strtou32_unimplemented(void); | ||
140 | int safe_strtou32(const char *arg, uint32_t* value) | ||
141 | { | ||
142 | if (sizeof(uint32_t) == sizeof(unsigned)) | ||
143 | return safe_strtou(arg, (unsigned*)value); | ||
144 | if (sizeof(uint32_t) == sizeof(unsigned long)) | ||
145 | return safe_strtoul(arg, (unsigned long*)value); | ||
146 | return BUG_safe_strtou32_unimplemented(); | ||
147 | } | ||
diff --git a/libbb/xatonum.c b/libbb/xatonum.c index 0d487dd9b..35607c317 100644 --- a/libbb/xatonum.c +++ b/libbb/xatonum.c | |||
@@ -19,15 +19,6 @@ | |||
19 | #define XSTR_TYPE_MIN LLONG_MIN | 19 | #define XSTR_TYPE_MIN LLONG_MIN |
20 | #define XSTR_STRTOU strtoull | 20 | #define XSTR_STRTOU strtoull |
21 | #include "xatonum_template.c" | 21 | #include "xatonum_template.c" |
22 | #undef type | ||
23 | #undef xstrtou | ||
24 | #undef xstrto | ||
25 | #undef xatou | ||
26 | #undef xato | ||
27 | #undef XSTR_UTYPE_MAX | ||
28 | #undef XSTR_TYPE_MAX | ||
29 | #undef XSTR_TYPE_MIN | ||
30 | #undef XSTR_STRTOU | ||
31 | 22 | ||
32 | #if ULONG_MAX != ULLONG_MAX | 23 | #if ULONG_MAX != ULLONG_MAX |
33 | #define type long | 24 | #define type long |
@@ -40,15 +31,6 @@ | |||
40 | #define XSTR_TYPE_MIN LONG_MIN | 31 | #define XSTR_TYPE_MIN LONG_MIN |
41 | #define XSTR_STRTOU strtoul | 32 | #define XSTR_STRTOU strtoul |
42 | #include "xatonum_template.c" | 33 | #include "xatonum_template.c" |
43 | #undef type | ||
44 | #undef xstrtou | ||
45 | #undef xstrto | ||
46 | #undef xatou | ||
47 | #undef xato | ||
48 | #undef XSTR_UTYPE_MAX | ||
49 | #undef XSTR_TYPE_MAX | ||
50 | #undef XSTR_TYPE_MIN | ||
51 | #undef XSTR_STRTOU | ||
52 | #endif | 34 | #endif |
53 | 35 | ||
54 | #if UINT_MAX != ULONG_MAX | 36 | #if UINT_MAX != ULONG_MAX |
@@ -72,15 +54,6 @@ extern inline unsigned bb_strtoui(const char *str, char **end, int b) | |||
72 | /* libc has no strtoui, so we need to create/use our own */ | 54 | /* libc has no strtoui, so we need to create/use our own */ |
73 | #define XSTR_STRTOU bb_strtoui | 55 | #define XSTR_STRTOU bb_strtoui |
74 | #include "xatonum_template.c" | 56 | #include "xatonum_template.c" |
75 | #undef type | ||
76 | #undef xstrtou | ||
77 | #undef xstrto | ||
78 | #undef xatou | ||
79 | #undef xato | ||
80 | #undef XSTR_UTYPE_MAX | ||
81 | #undef XSTR_TYPE_MAX | ||
82 | #undef XSTR_TYPE_MIN | ||
83 | #undef XSTR_STRTOU | ||
84 | #endif | 57 | #endif |
85 | 58 | ||
86 | /* A few special cases */ | 59 | /* A few special cases */ |
@@ -90,11 +63,6 @@ int xatoi_u(const char *numstr) | |||
90 | return xatou_range(numstr, 0, INT_MAX); | 63 | return xatou_range(numstr, 0, INT_MAX); |
91 | } | 64 | } |
92 | 65 | ||
93 | uint32_t xatou32(const char *numstr) | ||
94 | { | ||
95 | return xatoul_range(numstr, 0, 0xffffffff); | ||
96 | } | ||
97 | |||
98 | uint16_t xatou16(const char *numstr) | 66 | uint16_t xatou16(const char *numstr) |
99 | { | 67 | { |
100 | return xatou_range(numstr, 0, 0xffff); | 68 | return xatou_range(numstr, 0, 0xffff); |
diff --git a/libbb/xatonum_template.c b/libbb/xatonum_template.c index 245586a5a..53ba544eb 100644 --- a/libbb/xatonum_template.c +++ b/libbb/xatonum_template.c | |||
@@ -173,3 +173,13 @@ type xato()(const char *numstr) | |||
173 | { | 173 | { |
174 | return xstrto(_range_sfx)(numstr, 10, XSTR_TYPE_MIN, XSTR_TYPE_MAX, NULL); | 174 | return xstrto(_range_sfx)(numstr, 10, XSTR_TYPE_MIN, XSTR_TYPE_MAX, NULL); |
175 | } | 175 | } |
176 | |||
177 | #undef type | ||
178 | #undef xstrtou | ||
179 | #undef xstrto | ||
180 | #undef xatou | ||
181 | #undef xato | ||
182 | #undef XSTR_UTYPE_MAX | ||
183 | #undef XSTR_TYPE_MAX | ||
184 | #undef XSTR_TYPE_MIN | ||
185 | #undef XSTR_STRTOU | ||
diff --git a/loginutils/getty.c b/loginutils/getty.c index 0c269de98..a85e52306 100644 --- a/loginutils/getty.c +++ b/loginutils/getty.c | |||
@@ -147,8 +147,8 @@ static FILE *dbf; | |||
147 | static int bcode(const char *s) | 147 | static int bcode(const char *s) |
148 | { | 148 | { |
149 | int r; | 149 | int r; |
150 | unsigned value; | 150 | unsigned value = bb_strtou(s, NULL, 10); |
151 | if (safe_strtou((char *)s, &value)) { | 151 | if (errno) { |
152 | return -1; | 152 | return -1; |
153 | } | 153 | } |
154 | r = tty_value_to_baud(value); | 154 | r = tty_value_to_baud(value); |
diff --git a/networking/ftpgetput.c b/networking/ftpgetput.c index fa1854903..3773f9937 100644 --- a/networking/ftpgetput.c +++ b/networking/ftpgetput.c | |||
@@ -124,7 +124,8 @@ int ftp_receive(ftp_host_info_t *server, FILE *control_stream, | |||
124 | fd_data = xconnect_ftpdata(server, buf); | 124 | fd_data = xconnect_ftpdata(server, buf); |
125 | 125 | ||
126 | if (ftpcmd("SIZE ", server_path, control_stream, buf) == 213) { | 126 | if (ftpcmd("SIZE ", server_path, control_stream, buf) == 213) { |
127 | if (SAFE_STRTOOFF(buf + 4, &filesize)) | 127 | filesize = BB_STRTOOFF(buf + 4, NULL, 10); |
128 | if (errno || filesize < 0) | ||
128 | bb_error_msg_and_die("SIZE error: %s", buf + 4); | 129 | bb_error_msg_and_die("SIZE error: %s", buf + 4); |
129 | } else { | 130 | } else { |
130 | filesize = -1; | 131 | filesize = -1; |
diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c index 829d7e960..5e399e1f8 100644 --- a/networking/udhcp/files.c +++ b/networking/udhcp/files.c | |||
@@ -64,7 +64,8 @@ static int read_str(const char *line, void *arg) | |||
64 | 64 | ||
65 | static int read_u32(const char *line, void *arg) | 65 | static int read_u32(const char *line, void *arg) |
66 | { | 66 | { |
67 | return safe_strtou32(line, (uint32_t*)arg) == 0; | 67 | *((uint32_t*)arg) = bb_strtou32(line, NULL, 10); |
68 | return errno == 0; | ||
68 | } | 69 | } |
69 | 70 | ||
70 | 71 | ||
@@ -101,7 +102,8 @@ static void attach_option(struct option_set **opt_list, | |||
101 | struct option_set *existing, *new, **curr; | 102 | struct option_set *existing, *new, **curr; |
102 | 103 | ||
103 | /* add it to an existing option */ | 104 | /* add it to an existing option */ |
104 | if ((existing = find_option(*opt_list, option->code))) { | 105 | existing = find_option(*opt_list, option->code); |
106 | if (existing) { | ||
105 | DEBUG("Attaching option %s to existing member of list", option->name); | 107 | DEBUG("Attaching option %s to existing member of list", option->name); |
106 | if (option->flags & OPTION_LIST) { | 108 | if (option->flags & OPTION_LIST) { |
107 | if (existing->data[OPT_LEN] + length <= 255) { | 109 | if (existing->data[OPT_LEN] + length <= 255) { |
diff --git a/networking/wget.c b/networking/wget.c index 1e51ce96b..49ebda73c 100644 --- a/networking/wget.c +++ b/networking/wget.c | |||
@@ -335,7 +335,8 @@ int wget_main(int argc, char **argv) | |||
335 | */ | 335 | */ |
336 | while ((s = gethdr(buf, sizeof(buf), sfp, &n)) != NULL) { | 336 | while ((s = gethdr(buf, sizeof(buf), sfp, &n)) != NULL) { |
337 | if (strcasecmp(buf, "content-length") == 0) { | 337 | if (strcasecmp(buf, "content-length") == 0) { |
338 | if (SAFE_STRTOOFF(s, &content_len) || content_len < 0) { | 338 | content_len = BB_STRTOOFF(s, NULL, 10); |
339 | if (errno || content_len < 0) { | ||
339 | bb_error_msg_and_die("content-length %s is garbage", s); | 340 | bb_error_msg_and_die("content-length %s is garbage", s); |
340 | } | 341 | } |
341 | got_clen = 1; | 342 | got_clen = 1; |
@@ -402,7 +403,8 @@ int wget_main(int argc, char **argv) | |||
402 | * Querying file size | 403 | * Querying file size |
403 | */ | 404 | */ |
404 | if (ftpcmd("SIZE ", target.path, sfp, buf) == 213) { | 405 | if (ftpcmd("SIZE ", target.path, sfp, buf) == 213) { |
405 | if (SAFE_STRTOOFF(buf+4, &content_len) || content_len < 0) { | 406 | content_len = BB_STRTOOFF(buf+4, NULL, 10); |
407 | if (errno || content_len < 0) { | ||
406 | bb_error_msg_and_die("SIZE value is garbage"); | 408 | bb_error_msg_and_die("SIZE value is garbage"); |
407 | } | 409 | } |
408 | got_clen = 1; | 410 | got_clen = 1; |
@@ -437,7 +439,7 @@ int wget_main(int argc, char **argv) | |||
437 | } | 439 | } |
438 | 440 | ||
439 | if (ftpcmd("RETR ", target.path, sfp, buf) > 150) | 441 | if (ftpcmd("RETR ", target.path, sfp, buf) > 150) |
440 | bb_error_msg_and_die("bad response to %s: %s", "RETR", buf); | 442 | bb_error_msg_and_die("bad response to RETR: %s", buf); |
441 | } | 443 | } |
442 | 444 | ||
443 | 445 | ||
@@ -446,7 +448,7 @@ int wget_main(int argc, char **argv) | |||
446 | */ | 448 | */ |
447 | if (chunked) { | 449 | if (chunked) { |
448 | fgets(buf, sizeof(buf), dfp); | 450 | fgets(buf, sizeof(buf), dfp); |
449 | content_len = STRTOOFF(buf, (char **) NULL, 16); | 451 | content_len = STRTOOFF(buf, NULL, 16); |
450 | /* FIXME: error check?? */ | 452 | /* FIXME: error check?? */ |
451 | } | 453 | } |
452 | 454 | ||
@@ -480,7 +482,7 @@ int wget_main(int argc, char **argv) | |||
480 | if (chunked) { | 482 | if (chunked) { |
481 | safe_fgets(buf, sizeof(buf), dfp); /* This is a newline */ | 483 | safe_fgets(buf, sizeof(buf), dfp); /* This is a newline */ |
482 | safe_fgets(buf, sizeof(buf), dfp); | 484 | safe_fgets(buf, sizeof(buf), dfp); |
483 | content_len = STRTOOFF(buf, (char **) NULL, 16); | 485 | content_len = STRTOOFF(buf, NULL, 16); |
484 | /* FIXME: error check? */ | 486 | /* FIXME: error check? */ |
485 | if (content_len == 0) { | 487 | if (content_len == 0) { |
486 | chunked = 0; /* all done! */ | 488 | chunked = 0; /* all done! */ |
diff --git a/procps/renice.c b/procps/renice.c index 65674a4ee..08e0dc264 100644 --- a/procps/renice.c +++ b/procps/renice.c | |||
@@ -87,7 +87,8 @@ int renice_main(int argc, char **argv) | |||
87 | } | 87 | } |
88 | who = p->pw_uid; | 88 | who = p->pw_uid; |
89 | } else { | 89 | } else { |
90 | if (safe_strtou(arg, &who)) { | 90 | who = bb_strtou(arg, NULL, 10); |
91 | if (errno) { | ||
91 | bb_error_msg("bad value: %s", arg); | 92 | bb_error_msg("bad value: %s", arg); |
92 | goto HAD_ERROR; | 93 | goto HAD_ERROR; |
93 | } | 94 | } |