Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Jonas Bonn and committed by
Linus Torvalds
b48b2c3e 1629372c

+3 -75
+1
arch/openrisc/Kconfig
··· 20 20 select GENERIC_ATOMIC64 21 21 select GENERIC_CLOCKEVENTS 22 22 select GENERIC_STRNCPY_FROM_USER 23 + select GENERIC_STRNLEN_USER 23 24 24 25 config MMU 25 26 def_bool y
+2 -28
arch/openrisc/include/asm/uaccess.h
··· 318 318 319 319 extern long strncpy_from_user(char *dest, const char __user *src, long count); 320 320 321 - /* 322 - * Return the size of a string (including the ending 0) 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) 321 + extern __must_check long strlen_user(const char __user *str); 322 + extern __must_check long strnlen_user(const char __user *str, long n); 349 323 350 324 #endif /* __ASM_OPENRISC_UACCESS_H */
-47
arch/openrisc/lib/string.S
··· 103 103 .section __ex_table, "a" 104 104 .long 9b, 99b // write fault 105 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