drivers: net: tulip: Fix set but not used with W=1
[platform/kernel/linux-starfive.git] / lib / kstrtox.c
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);