1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Convert integer string representation to an integer. 4 * If an integer doesn't fit into specified type, -E is returned. 5 * 6 * Integer starts with optional sign. 7 * kstrtou*() functions do not accept sign "-". 8 * 9 * Radix 0 means autodetection: leading "0x" implies radix 16, 10 * leading "0" implies radix 8, otherwise radix is 10. 11 * Autodetection hints work after optional sign, but not before. 12 * 13 * If -E is returned, result is not touched. 14 */ 15 #include <linux/ctype.h> 16 #include <linux/errno.h> 17 #include <linux/kernel.h> 18 #include <linux/math64.h> 19 #include <linux/export.h> 20 #include <linux/types.h> 21 #include <linux/uaccess.h> 22 #include "kstrtox.h" 23 24 const char *_parse_integer_fixup_radix(const char *s, unsigned int *base) 25 { 26 if (*base == 0) { 27 if (s[0] == '0') { 28 if (_tolower(s[1]) == 'x' && isxdigit(s[2])) 29 *base = 16; 30 else 31 *base = 8; 32 } else 33 *base = 10; 34 } 35 if (*base == 16 && s[0] == '0' && _tolower(s[1]) == 'x') 36 s += 2; 37 return s; 38 } 39 40 /* 41 * Convert non-negative integer string representation in explicitly given radix 42 * to an integer. 43 * Return number of characters consumed maybe or-ed with overflow bit. 44 * If overflow occurs, result integer (incorrect) is still returned. 45 * 46 * Don't you dare use this function. 47 */ 48 unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long *p) 49 { 50 unsigned long long res; 51 unsigned int rv; 52 53 res = 0; 54 rv = 0; 55 while (1) { 56 unsigned int c = *s; 57 unsigned int lc = c | 0x20; /* don't tolower() this line */ 58 unsigned int val; 59 60 if ('0' <= c && c <= '9') 61 val = c - '0'; 62 else if ('a' <= lc && lc <= 'f') 63 val = lc - 'a' + 10; 64 else 65 break; 66 67 if (val >= base) 68 break; 69 /* 70 * Check for overflow only if we are within range of 71 * it in the max base we support (16) 72 */ 73 if (unlikely(res & (~0ull << 60))) { 74 if (res > div_u64(ULLONG_MAX - val, base)) 75 rv |= KSTRTOX_OVERFLOW; 76 } 77 res = res * base + val; 78 rv++; 79 s++; 80 } 81 *p = res; 82 return rv; 83 } 84 85 static int _kstrtoull(const char *s, unsigned int base, unsigned long long *res) 86 { 87 unsigned long long _res; 88 unsigned int rv; 89 90 s = _parse_integer_fixup_radix(s, &base); 91 rv = _parse_integer(s, base, &_res); 92 if (rv & KSTRTOX_OVERFLOW) 93 return -ERANGE; 94 if (rv == 0) 95 return -EINVAL; 96 s += rv; 97 if (*s == '\n') 98 s++; 99 if (*s) 100 return -EINVAL; 101 *res = _res; 102 return 0; 103 } 104 105 /** 106 * kstrtoull - convert a string to an unsigned long long 107 * @s: The start of the string. The string must be null-terminated, and may also 108 * include a single newline before its terminating null. The first character 109 * may also be a plus sign, but not a minus sign. 110 * @base: The number base to use. The maximum supported base is 16. If base is 111 * given as 0, then the base of the string is automatically detected with the 112 * conventional semantics - If it begins with 0x the number will be parsed as a 113 * hexadecimal (case insensitive), if it otherwise begins with 0, it will be 114 * parsed as an octal number. Otherwise it will be parsed as a decimal. 115 * @res: Where to write the result of the conversion on success. 116 * 117 * Returns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. 118 * Preferred over simple_strtoull(). Return code must be checked. 119 */ 120 int kstrtoull(const char *s, unsigned int base, unsigned long long *res) 121 { 122 if (s[0] == '+') 123 s++; 124 return _kstrtoull(s, base, res); 125 } 126 EXPORT_SYMBOL(kstrtoull); 127 128 /** 129 * kstrtoll - convert a string to a long long 130 * @s: The start of the string. The string must be null-terminated, and may also 131 * include a single newline before its terminating null. The first character 132 * may also be a plus sign or a minus sign. 133 * @base: The number base to use. The maximum supported base is 16. If base is 134 * given as 0, then the base of the string is automatically detected with the 135 * conventional semantics - If it begins with 0x the number will be parsed as a 136 * hexadecimal (case insensitive), if it otherwise begins with 0, it will be 137 * parsed as an octal number. Otherwise it will be parsed as a decimal. 138 * @res: Where to write the result of the conversion on success. 139 * 140 * Returns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. 141 * Preferred over simple_strtoll(). Return code must be checked. 142 */ 143 int kstrtoll(const char *s, unsigned int base, long long *res) 144 { 145 unsigned long long tmp; 146 int rv; 147 148 if (s[0] == '-') { 149 rv = _kstrtoull(s + 1, base, &tmp); 150 if (rv < 0) 151 return rv; 152 if ((long long)-tmp > 0) 153 return -ERANGE; 154 *res = -tmp; 155 } else { 156 rv = kstrtoull(s, base, &tmp); 157 if (rv < 0) 158 return rv; 159 if ((long long)tmp < 0) 160 return -ERANGE; 161 *res = tmp; 162 } 163 return 0; 164 } 165 EXPORT_SYMBOL(kstrtoll); 166 167 /* Internal, do not use. */ 168 int _kstrtoul(const char *s, unsigned int base, unsigned long *res) 169 { 170 unsigned long long tmp; 171 int rv; 172 173 rv = kstrtoull(s, base, &tmp); 174 if (rv < 0) 175 return rv; 176 if (tmp != (unsigned long)tmp) 177 return -ERANGE; 178 *res = tmp; 179 return 0; 180 } 181 EXPORT_SYMBOL(_kstrtoul); 182 183 /* Internal, do not use. */ 184 int _kstrtol(const char *s, unsigned int base, long *res) 185 { 186 long long tmp; 187 int rv; 188 189 rv = kstrtoll(s, base, &tmp); 190 if (rv < 0) 191 return rv; 192 if (tmp != (long)tmp) 193 return -ERANGE; 194 *res = tmp; 195 return 0; 196 } 197 EXPORT_SYMBOL(_kstrtol); 198 199 /** 200 * kstrtouint - convert a string to an unsigned int 201 * @s: The start of the string. The string must be null-terminated, and may also 202 * include a single newline before its terminating null. The first character 203 * may also be a plus sign, but not a minus sign. 204 * @base: The number base to use. The maximum supported base is 16. If base is 205 * given as 0, then the base of the string is automatically detected with the 206 * conventional semantics - If it begins with 0x the number will be parsed as a 207 * hexadecimal (case insensitive), if it otherwise begins with 0, it will be 208 * parsed as an octal number. Otherwise it will be parsed as a decimal. 209 * @res: Where to write the result of the conversion on success. 210 * 211 * Returns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. 212 * Preferred over simple_strtoul(). Return code must be checked. 213 */ 214 int kstrtouint(const char *s, unsigned int base, unsigned int *res) 215 { 216 unsigned long long tmp; 217 int rv; 218 219 rv = kstrtoull(s, base, &tmp); 220 if (rv < 0) 221 return rv; 222 if (tmp != (unsigned int)tmp) 223 return -ERANGE; 224 *res = tmp; 225 return 0; 226 } 227 EXPORT_SYMBOL(kstrtouint); 228 229 /** 230 * kstrtoint - convert a string to an int 231 * @s: The start of the string. The string must be null-terminated, and may also 232 * include a single newline before its terminating null. The first character 233 * may also be a plus sign or a minus sign. 234 * @base: The number base to use. The maximum supported base is 16. If base is 235 * given as 0, then the base of the string is automatically detected with the 236 * conventional semantics - If it begins with 0x the number will be parsed as a 237 * hexadecimal (case insensitive), if it otherwise begins with 0, it will be 238 * parsed as an octal number. Otherwise it will be parsed as a decimal. 239 * @res: Where to write the result of the conversion on success. 240 * 241 * Returns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. 242 * Preferred over simple_strtol(). Return code must be checked. 243 */ 244 int kstrtoint(const char *s, unsigned int base, int *res) 245 { 246 long long tmp; 247 int rv; 248 249 rv = kstrtoll(s, base, &tmp); 250 if (rv < 0) 251 return rv; 252 if (tmp != (int)tmp) 253 return -ERANGE; 254 *res = tmp; 255 return 0; 256 } 257 EXPORT_SYMBOL(kstrtoint); 258 259 int kstrtou16(const char *s, unsigned int base, u16 *res) 260 { 261 unsigned long long tmp; 262 int rv; 263 264 rv = kstrtoull(s, base, &tmp); 265 if (rv < 0) 266 return rv; 267 if (tmp != (u16)tmp) 268 return -ERANGE; 269 *res = tmp; 270 return 0; 271 } 272 EXPORT_SYMBOL(kstrtou16); 273 274 int kstrtos16(const char *s, unsigned int base, s16 *res) 275 { 276 long long tmp; 277 int rv; 278 279 rv = kstrtoll(s, base, &tmp); 280 if (rv < 0) 281 return rv; 282 if (tmp != (s16)tmp) 283 return -ERANGE; 284 *res = tmp; 285 return 0; 286 } 287 EXPORT_SYMBOL(kstrtos16); 288 289 int kstrtou8(const char *s, unsigned int base, u8 *res) 290 { 291 unsigned long long tmp; 292 int rv; 293 294 rv = kstrtoull(s, base, &tmp); 295 if (rv < 0) 296 return rv; 297 if (tmp != (u8)tmp) 298 return -ERANGE; 299 *res = tmp; 300 return 0; 301 } 302 EXPORT_SYMBOL(kstrtou8); 303 304 int kstrtos8(const char *s, unsigned int base, s8 *res) 305 { 306 long long tmp; 307 int rv; 308 309 rv = kstrtoll(s, base, &tmp); 310 if (rv < 0) 311 return rv; 312 if (tmp != (s8)tmp) 313 return -ERANGE; 314 *res = tmp; 315 return 0; 316 } 317 EXPORT_SYMBOL(kstrtos8); 318 319 /** 320 * kstrtobool - convert common user inputs into boolean values 321 * @s: input string 322 * @res: result 323 * 324 * This routine returns 0 iff the first character is one of 'Yy1Nn0', or 325 * [oO][NnFf] for "on" and "off". Otherwise it will return -EINVAL. Value 326 * pointed to by res is updated upon finding a match. 327 */ 328 int kstrtobool(const char *s, bool *res) 329 { 330 if (!s) 331 return -EINVAL; 332 333 switch (s[0]) { 334 case 'y': 335 case 'Y': 336 case '1': 337 *res = true; 338 return 0; 339 case 'n': 340 case 'N': 341 case '0': 342 *res = false; 343 return 0; 344 case 'o': 345 case 'O': 346 switch (s[1]) { 347 case 'n': 348 case 'N': 349 *res = true; 350 return 0; 351 case 'f': 352 case 'F': 353 *res = false; 354 return 0; 355 default: 356 break; 357 } 358 default: 359 break; 360 } 361 362 return -EINVAL; 363 } 364 EXPORT_SYMBOL(kstrtobool); 365 366 /* 367 * Since "base" would be a nonsense argument, this open-codes the 368 * _from_user helper instead of using the helper macro below. 369 */ 370 int kstrtobool_from_user(const char __user *s, size_t count, bool *res) 371 { 372 /* Longest string needed to differentiate, newline, terminator */ 373 char buf[4]; 374 375 count = min(count, sizeof(buf) - 1); 376 if (copy_from_user(buf, s, count)) 377 return -EFAULT; 378 buf[count] = '\0'; 379 return kstrtobool(buf, res); 380 } 381 EXPORT_SYMBOL(kstrtobool_from_user); 382 383 #define kstrto_from_user(f, g, type) \ 384 int f(const char __user *s, size_t count, unsigned int base, type *res) \ 385 { \ 386 /* sign, base 2 representation, newline, terminator */ \ 387 char buf[1 + sizeof(type) * 8 + 1 + 1]; \ 388 \ 389 count = min(count, sizeof(buf) - 1); \ 390 if (copy_from_user(buf, s, count)) \ 391 return -EFAULT; \ 392 buf[count] = '\0'; \ 393 return g(buf, base, res); \ 394 } \ 395 EXPORT_SYMBOL(f) 396 397 kstrto_from_user(kstrtoull_from_user, kstrtoull, unsigned long long); 398 kstrto_from_user(kstrtoll_from_user, kstrtoll, long long); 399 kstrto_from_user(kstrtoul_from_user, kstrtoul, unsigned long); 400 kstrto_from_user(kstrtol_from_user, kstrtol, long); 401 kstrto_from_user(kstrtouint_from_user, kstrtouint, unsigned int); 402 kstrto_from_user(kstrtoint_from_user, kstrtoint, int); 403 kstrto_from_user(kstrtou16_from_user, kstrtou16, u16); 404 kstrto_from_user(kstrtos16_from_user, kstrtos16, s16); 405 kstrto_from_user(kstrtou8_from_user, kstrtou8, u8); 406 kstrto_from_user(kstrtos8_from_user, kstrtos8, s8); 407