From d2eaabdfdfb428f0a41071c47ff98b6af57cb494 Mon Sep 17 00:00:00 2001 From: Robin Getz Date: Thu, 4 Jun 2009 00:32:59 +0000 Subject: [PATCH] --- yaml --- r: 148584 b: refs/heads/master c: a8372b5ca618d4ea41b3c7ac3cef8dd6efa68bc6 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/blackfin/include/asm/uaccess.h | 25 ++++++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index fb3c12316fed..fc9717e04984 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 685a694f0653b7db49f663b2cd6953695214fb30 +refs/heads/master: a8372b5ca618d4ea41b3c7ac3cef8dd6efa68bc6 diff --git a/trunk/arch/blackfin/include/asm/uaccess.h b/trunk/arch/blackfin/include/asm/uaccess.h index 3248033531e6..97729be98948 100644 --- a/trunk/arch/blackfin/include/asm/uaccess.h +++ b/trunk/arch/blackfin/include/asm/uaccess.h @@ -233,16 +233,29 @@ strncpy_from_user(char *dst, const char *src, long count) } /* - * Return the size of a string (including the ending 0) + * Get the size of a string in user space. + * src: The string to measure + * n: The maximum valid length * - * Return 0 on exception, a value greater than N if too long + * Get the size of a NUL-terminated string in user space. + * + * Returns the size of the string INCLUDING the terminating NUL. + * On exception, returns 0. + * If the string is too long, returns a value greater than n. */ -static inline long strnlen_user(const char *src, long n) +static inline long __must_check strnlen_user(const char *src, long n) { - return (strlen(src) + 1); + if (!access_ok(VERIFY_READ, src, 1)) + return 0; + return strnlen(src, n) + 1; } -#define strlen_user(str) strnlen_user(str, 32767) +static inline long __must_check strlen_user(const char *src) +{ + if (!access_ok(VERIFY_READ, src, 1)) + return 0; + return strlen(src) + 1; +} /* * Zero Userspace @@ -251,6 +264,8 @@ static inline long strnlen_user(const char *src, long n) static inline unsigned long __must_check __clear_user(void *to, unsigned long n) { + if (!access_ok(VERIFY_WRITE, to, n)) + return n; memset(to, 0, n); return 0; }