diff options
author | Jonas Bonn <jonas@southpole.se> | 2012-05-27 04:25:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-28 00:00:32 -0400 |
commit | b48b2c3e50433ff6f7e46186daa7f986bd960215 (patch) | |
tree | 9a10b2130582f99df5ae7eae0b959425e791118c /arch/openrisc | |
parent | 1629372caaaf7ef744d3b983be56b99468a68ff8 (diff) |
openrisc: use generic strnlen_user() function
The generic version is both easier to support and more correct.
Signed-off-by: Jonas Bonn <jonas@southpole.se>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/openrisc')
-rw-r--r-- | arch/openrisc/Kconfig | 1 | ||||
-rw-r--r-- | arch/openrisc/include/asm/uaccess.h | 30 | ||||
-rw-r--r-- | arch/openrisc/lib/string.S | 47 |
3 files changed, 3 insertions, 75 deletions
diff --git a/arch/openrisc/Kconfig b/arch/openrisc/Kconfig index 065623215c58..49765b53f637 100644 --- a/arch/openrisc/Kconfig +++ b/arch/openrisc/Kconfig | |||
@@ -20,6 +20,7 @@ config OPENRISC | |||
20 | select GENERIC_ATOMIC64 | 20 | select GENERIC_ATOMIC64 |
21 | select GENERIC_CLOCKEVENTS | 21 | select GENERIC_CLOCKEVENTS |
22 | select GENERIC_STRNCPY_FROM_USER | 22 | select GENERIC_STRNCPY_FROM_USER |
23 | select GENERIC_STRNLEN_USER | ||
23 | 24 | ||
24 | config MMU | 25 | config MMU |
25 | def_bool y | 26 | def_bool y |
diff --git a/arch/openrisc/include/asm/uaccess.h b/arch/openrisc/include/asm/uaccess.h index 04b93de92636..ab2e7a198a4c 100644 --- a/arch/openrisc/include/asm/uaccess.h +++ b/arch/openrisc/include/asm/uaccess.h | |||
@@ -318,33 +318,7 @@ clear_user(void *addr, unsigned long size) | |||
318 | 318 | ||
319 | extern long strncpy_from_user(char *dest, const char __user *src, long count); | 319 | extern long strncpy_from_user(char *dest, const char __user *src, long count); |
320 | 320 | ||
321 | /* | 321 | extern __must_check long strlen_user(const char __user *str); |
322 | * Return the size of a string (including the ending 0) | 322 | extern __must_check long strnlen_user(const char __user *str, long n); |
323 | * | ||
324 | * Return 0 for error | ||
325 | */ | ||
326 | |||
327 | extern int __strnlen_user(const char *str, long len, unsigned long top); | ||
328 | |||
329 | /* | ||
330 | * Returns the length of the string at str (including the null byte), | ||
331 | * or 0 if we hit a page we can't access, | ||
332 | * or something > len if we didn't find a null byte. | ||
333 | * | ||
334 | * The `top' parameter to __strnlen_user is to make sure that | ||
335 | * we can never overflow from the user area into kernel space. | ||
336 | */ | ||
337 | static inline long strnlen_user(const char __user *str, long len) | ||
338 | { | ||
339 | unsigned long top = (unsigned long)get_fs(); | ||
340 | unsigned long res = 0; | ||
341 | |||
342 | if (__addr_ok(str)) | ||
343 | res = __strnlen_user(str, len, top); | ||
344 | |||
345 | return res; | ||
346 | } | ||
347 | |||
348 | #define strlen_user(str) strnlen_user(str, TASK_SIZE-1) | ||
349 | 323 | ||
350 | #endif /* __ASM_OPENRISC_UACCESS_H */ | 324 | #endif /* __ASM_OPENRISC_UACCESS_H */ |
diff --git a/arch/openrisc/lib/string.S b/arch/openrisc/lib/string.S index 8ceb11ebafb9..c09fee7dec14 100644 --- a/arch/openrisc/lib/string.S +++ b/arch/openrisc/lib/string.S | |||
@@ -103,50 +103,3 @@ __clear_user: | |||
103 | .section __ex_table, "a" | 103 | .section __ex_table, "a" |
104 | .long 9b, 99b // write fault | 104 | .long 9b, 99b // write fault |
105 | .previous | 105 | .previous |
106 | |||
107 | |||
108 | /* | ||
109 | * extern int __strnlen_user(const char *str, long len, unsigned long top); | ||
110 | * | ||
111 | * | ||
112 | * RTRN: - length of a string including NUL termination character | ||
113 | * - on page fault 0 | ||
114 | */ | ||
115 | |||
116 | .global __strnlen_user | ||
117 | __strnlen_user: | ||
118 | l.addi r1,r1,-8 | ||
119 | l.sw 0(r1),r6 | ||
120 | l.sw 4(r1),r3 | ||
121 | |||
122 | l.addi r11,r0,0 | ||
123 | 2: l.sfeq r11,r4 | ||
124 | l.bf 1f | ||
125 | l.addi r11,r11,1 | ||
126 | 8: l.lbz r6,0(r3) | ||
127 | l.sfeq r6,r0 | ||
128 | l.bf 1f | ||
129 | l.sfgeu r3,r5 // are we over the top ? | ||
130 | l.bf 99f | ||
131 | l.j 2b | ||
132 | l.addi r3,r3,1 | ||
133 | |||
134 | 1: | ||
135 | l.lwz r6,0(r1) | ||
136 | l.lwz r3,4(r1) | ||
137 | l.jr r9 | ||
138 | l.addi r1,r1,8 | ||
139 | |||
140 | .section .fixup, "ax" | ||
141 | 99: | ||
142 | l.addi r11,r0,0 | ||
143 | |||
144 | l.lwz r6,0(r1) | ||
145 | l.lwz r3,4(r1) | ||
146 | l.jr r9 | ||
147 | l.addi r1,r1,8 | ||
148 | .previous | ||
149 | |||
150 | .section __ex_table, "a" | ||
151 | .long 8b, 99b // read fault | ||
152 | .previous | ||