aboutsummaryrefslogtreecommitdiffstats
path: root/arch/openrisc
diff options
context:
space:
mode:
authorJonas Bonn <jonas@southpole.se>2012-05-27 04:25:47 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-05-28 00:00:32 -0400
commitb48b2c3e50433ff6f7e46186daa7f986bd960215 (patch)
tree9a10b2130582f99df5ae7eae0b959425e791118c /arch/openrisc
parent1629372caaaf7ef744d3b983be56b99468a68ff8 (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/Kconfig1
-rw-r--r--arch/openrisc/include/asm/uaccess.h30
-rw-r--r--arch/openrisc/lib/string.S47
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
24config MMU 25config 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
319extern long strncpy_from_user(char *dest, const char __user *src, long count); 319extern long strncpy_from_user(char *dest, const char __user *src, long count);
320 320
321/* 321extern __must_check long strlen_user(const char __user *str);
322 * Return the size of a string (including the ending 0) 322extern __must_check long strnlen_user(const char __user *str, long n);
323 *
324 * Return 0 for error
325 */
326
327extern 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 */
337static 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
1232: l.sfeq r11,r4
124 l.bf 1f
125 l.addi r11,r11,1
1268: 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
1341:
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"
14199:
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