diff options
Diffstat (limited to 'lib/strnlen_user.c')
-rw-r--r-- | lib/strnlen_user.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/lib/strnlen_user.c b/lib/strnlen_user.c index 3a5f2b366d84..2625943625d7 100644 --- a/lib/strnlen_user.c +++ b/lib/strnlen_user.c | |||
@@ -45,7 +45,7 @@ static inline long do_strnlen_user(const char __user *src, unsigned long count, | |||
45 | src -= align; | 45 | src -= align; |
46 | max += align; | 46 | max += align; |
47 | 47 | ||
48 | if (unlikely(__get_user(c,(unsigned long __user *)src))) | 48 | if (unlikely(unsafe_get_user(c,(unsigned long __user *)src))) |
49 | return 0; | 49 | return 0; |
50 | c |= aligned_byte_mask(align); | 50 | c |= aligned_byte_mask(align); |
51 | 51 | ||
@@ -61,7 +61,7 @@ static inline long do_strnlen_user(const char __user *src, unsigned long count, | |||
61 | if (unlikely(max <= sizeof(unsigned long))) | 61 | if (unlikely(max <= sizeof(unsigned long))) |
62 | break; | 62 | break; |
63 | max -= sizeof(unsigned long); | 63 | max -= sizeof(unsigned long); |
64 | if (unlikely(__get_user(c,(unsigned long __user *)(src+res)))) | 64 | if (unlikely(unsafe_get_user(c,(unsigned long __user *)(src+res)))) |
65 | return 0; | 65 | return 0; |
66 | } | 66 | } |
67 | res -= align; | 67 | res -= align; |
@@ -112,7 +112,12 @@ long strnlen_user(const char __user *str, long count) | |||
112 | src_addr = (unsigned long)str; | 112 | src_addr = (unsigned long)str; |
113 | if (likely(src_addr < max_addr)) { | 113 | if (likely(src_addr < max_addr)) { |
114 | unsigned long max = max_addr - src_addr; | 114 | unsigned long max = max_addr - src_addr; |
115 | return do_strnlen_user(str, count, max); | 115 | long retval; |
116 | |||
117 | user_access_begin(); | ||
118 | retval = do_strnlen_user(str, count, max); | ||
119 | user_access_end(); | ||
120 | return retval; | ||
116 | } | 121 | } |
117 | return 0; | 122 | return 0; |
118 | } | 123 | } |
@@ -141,7 +146,12 @@ long strlen_user(const char __user *str) | |||
141 | src_addr = (unsigned long)str; | 146 | src_addr = (unsigned long)str; |
142 | if (likely(src_addr < max_addr)) { | 147 | if (likely(src_addr < max_addr)) { |
143 | unsigned long max = max_addr - src_addr; | 148 | unsigned long max = max_addr - src_addr; |
144 | return do_strnlen_user(str, ~0ul, max); | 149 | long retval; |
150 | |||
151 | user_access_begin(); | ||
152 | retval = do_strnlen_user(str, ~0ul, max); | ||
153 | user_access_end(); | ||
154 | return retval; | ||
145 | } | 155 | } |
146 | return 0; | 156 | return 0; |
147 | } | 157 | } |