From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:46237) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RtKSN-0007uY-Mi for qemu-devel@nongnu.org; Fri, 03 Feb 2012 09:49:49 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RtKSE-0001UP-WA for qemu-devel@nongnu.org; Fri, 03 Feb 2012 09:49:43 -0500 Received: from afflict.kos.to ([92.243.29.197]:49806) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RtKSE-0001Th-PW for qemu-devel@nongnu.org; Fri, 03 Feb 2012 09:49:34 -0500 From: riku.voipio@linaro.org Date: Fri, 3 Feb 2012 16:49:25 +0200 Message-Id: In-Reply-To: References: Subject: [Qemu-devel] [PATCH 12/19] linux-user: Allow NULL value pointer in setxattr and getxattr List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Maydell From: Peter Maydell It's valid to pass a NULL value pointer to setxattr, so don't fail this case EFAULT. Signed-off-by: Peter Maydell Signed-off-by: Riku Voipio --- linux-user/syscall.c | 24 ++++++++++++++++++------ 1 files changed, 18 insertions(+), 6 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 06b19e0..0a78a18 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -7809,11 +7809,17 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, break; case TARGET_NR_setxattr: { - void *p, *n, *v; + void *p, *n, *v = 0; + if (arg3) { + v = lock_user(VERIFY_READ, arg3, arg4, 1); + if (!v) { + ret = -TARGET_EFAULT; + break; + } + } p = lock_user_string(arg1); n = lock_user_string(arg2); - v = lock_user(VERIFY_READ, arg3, arg4, 1); - if (p && n && v) { + if (p && n) { ret = get_errno(setxattr(p, n, v, arg4, arg5)); } else { ret = -TARGET_EFAULT; @@ -7825,11 +7831,17 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, break; case TARGET_NR_getxattr: { - void *p, *n, *v; + void *p, *n, *v = 0; + if (arg3) { + v = lock_user(VERIFY_WRITE, arg3, arg4, 0); + if (!v) { + ret = -TARGET_EFAULT; + break; + } + } p = lock_user_string(arg1); n = lock_user_string(arg2); - v = lock_user(VERIFY_WRITE, arg3, arg4, 0); - if (p && n && v) { + if (p && n) { ret = get_errno(getxattr(p, n, v, arg4)); } else { ret = -TARGET_EFAULT; -- 1.7.5.4