Changeset 3232 in MondoRescue for branches/3.2/mindi-busybox/libbb/bb_strtonum.c
- Timestamp:
- Jan 1, 2014, 12:47:38 AM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/3.2/mindi-busybox/libbb/bb_strtonum.c
r2725 r3232 37 37 } 38 38 39 static unsigned long long handle_errors(unsigned long long v, char **endp , char *endptr)39 static unsigned long long handle_errors(unsigned long long v, char **endp) 40 40 { 41 if (endp) *endp = endptr;41 char next_ch = **endp; 42 42 43 43 /* errno is already set to ERANGE by strtoXXX if value overflowed */ 44 if ( endptr[0]) {44 if (next_ch) { 45 45 /* "1234abcg" or out-of-range? */ 46 if (isalnum( endptr[0]) || errno)46 if (isalnum(next_ch) || errno) 47 47 return ret_ERANGE(); 48 48 /* good number, just suspicious terminator */ … … 58 58 char *endptr; 59 59 60 if (!endp) endp = &endptr; 61 *endp = (char*) arg; 62 60 63 /* strtoul(" -4200000000") returns 94967296, errno 0 (!) */ 61 64 /* I don't think that this is right. Preventing this... */ … … 64 67 /* not 100% correct for lib func, but convenient for the caller */ 65 68 errno = 0; 66 v = strtoull(arg, &endptr, base);67 return handle_errors(v, endp , endptr);69 v = strtoull(arg, endp, base); 70 return handle_errors(v, endp); 68 71 } 69 72 … … 72 75 unsigned long long v; 73 76 char *endptr; 77 char first; 78 79 if (!endp) endp = &endptr; 80 *endp = (char*) arg; 74 81 75 82 /* Check for the weird "feature": 76 83 * a "-" string is apparently a valid "number" for strto[u]l[l]! 77 84 * It returns zero and errno is 0! :( */ 78 charfirst = (arg[0] != '-' ? arg[0] : arg[1]);85 first = (arg[0] != '-' ? arg[0] : arg[1]); 79 86 if (!isalnum(first)) return ret_ERANGE(); 80 87 81 88 errno = 0; 82 v = strtoll(arg, &endptr, base);83 return handle_errors(v, endp , endptr);89 v = strtoll(arg, endp, base); 90 return handle_errors(v, endp); 84 91 } 85 92 … … 90 97 char *endptr; 91 98 99 if (!endp) endp = &endptr; 100 *endp = (char*) arg; 101 92 102 if (!isalnum(arg[0])) return ret_ERANGE(); 93 103 errno = 0; 94 v = strtoul(arg, &endptr, base);95 return handle_errors(v, endp , endptr);104 v = strtoul(arg, endp, base); 105 return handle_errors(v, endp); 96 106 } 97 107 … … 100 110 long v; 101 111 char *endptr; 112 char first; 102 113 103 char first = (arg[0] != '-' ? arg[0] : arg[1]); 114 if (!endp) endp = &endptr; 115 *endp = (char*) arg; 116 117 first = (arg[0] != '-' ? arg[0] : arg[1]); 104 118 if (!isalnum(first)) return ret_ERANGE(); 105 119 106 120 errno = 0; 107 v = strtol(arg, &endptr, base);108 return handle_errors(v, endp , endptr);121 v = strtol(arg, endp, base); 122 return handle_errors(v, endp); 109 123 } 110 124 #endif … … 116 130 char *endptr; 117 131 132 if (!endp) endp = &endptr; 133 *endp = (char*) arg; 134 118 135 if (!isalnum(arg[0])) return ret_ERANGE(); 119 136 errno = 0; 120 v = strtoul(arg, &endptr, base);137 v = strtoul(arg, endp, base); 121 138 if (v > UINT_MAX) return ret_ERANGE(); 122 return handle_errors(v, endp , endptr);139 return handle_errors(v, endp); 123 140 } 124 141 … … 127 144 long v; 128 145 char *endptr; 146 char first; 129 147 130 char first = (arg[0] != '-' ? arg[0] : arg[1]); 148 if (!endp) endp = &endptr; 149 *endp = (char*) arg; 150 151 first = (arg[0] != '-' ? arg[0] : arg[1]); 131 152 if (!isalnum(first)) return ret_ERANGE(); 132 153 133 154 errno = 0; 134 v = strtol(arg, &endptr, base);155 v = strtol(arg, endp, base); 135 156 if (v > INT_MAX) return ret_ERANGE(); 136 157 if (v < INT_MIN) return ret_ERANGE(); 137 return handle_errors(v, endp , endptr);158 return handle_errors(v, endp); 138 159 } 139 160 #endif
Note:
See TracChangeset
for help on using the changeset viewer.