diff options
Diffstat (limited to 'lib/kstrtox.c')
| -rw-r--r-- | lib/kstrtox.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/kstrtox.c b/lib/kstrtox.c index a235f3cc471c..2dbae88090ac 100644 --- a/lib/kstrtox.c +++ b/lib/kstrtox.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/math64.h> | 17 | #include <linux/math64.h> |
| 18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
| 19 | #include <linux/types.h> | 19 | #include <linux/types.h> |
| 20 | #include <asm/uaccess.h> | ||
| 20 | 21 | ||
| 21 | static inline char _tolower(const char c) | 22 | static inline char _tolower(const char c) |
| 22 | { | 23 | { |
| @@ -222,3 +223,28 @@ int kstrtos8(const char *s, unsigned int base, s8 *res) | |||
| 222 | return 0; | 223 | return 0; |
| 223 | } | 224 | } |
| 224 | EXPORT_SYMBOL(kstrtos8); | 225 | EXPORT_SYMBOL(kstrtos8); |
| 226 | |||
| 227 | #define kstrto_from_user(f, g, type) \ | ||
| 228 | int f(const char __user *s, size_t count, unsigned int base, type *res) \ | ||
| 229 | { \ | ||
| 230 | /* sign, base 2 representation, newline, terminator */ \ | ||
| 231 | char buf[1 + sizeof(type) * 8 + 1 + 1]; \ | ||
| 232 | \ | ||
| 233 | count = min(count, sizeof(buf) - 1); \ | ||
| 234 | if (copy_from_user(buf, s, count)) \ | ||
| 235 | return -EFAULT; \ | ||
| 236 | buf[count] = '\0'; \ | ||
| 237 | return g(buf, base, res); \ | ||
| 238 | } \ | ||
| 239 | EXPORT_SYMBOL(f) | ||
| 240 | |||
| 241 | kstrto_from_user(kstrtoull_from_user, kstrtoull, unsigned long long); | ||
| 242 | kstrto_from_user(kstrtoll_from_user, kstrtoll, long long); | ||
| 243 | kstrto_from_user(kstrtoul_from_user, kstrtoul, unsigned long); | ||
| 244 | kstrto_from_user(kstrtol_from_user, kstrtol, long); | ||
| 245 | kstrto_from_user(kstrtouint_from_user, kstrtouint, unsigned int); | ||
| 246 | kstrto_from_user(kstrtoint_from_user, kstrtoint, int); | ||
| 247 | kstrto_from_user(kstrtou16_from_user, kstrtou16, u16); | ||
| 248 | kstrto_from_user(kstrtos16_from_user, kstrtos16, s16); | ||
| 249 | kstrto_from_user(kstrtou8_from_user, kstrtou8, u8); | ||
| 250 | kstrto_from_user(kstrtos8_from_user, kstrtos8, s8); | ||
