@@ -5145,6 +5145,16 @@ static abi_long do_read(abi_long arg1, abi_long arg2, abi_long arg3)
}
return ret;
}
+static abi_long do_write(abi_long arg1, abi_long arg2, abi_long arg3)
+{
+ abi_long ret;
+ void *p;
+ if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1)))
+ return -EFAULT;
+ ret = write(arg1, p, arg3);
+ unlock_user(p, arg2, 0);
+ return ret;
+}
/* do_syscall() should always have a single exit point at the end so
that actions, such as logging of syscall results, can be performed.
@@ -5173,10 +5183,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
ret = get_errno(do_read(arg1, arg2, arg3));
break;
case TARGET_NR_write:
- if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1)))
- goto efault;
- ret = get_errno(write(arg1, p, arg3));
- unlock_user(p, arg2, 0);
+ ret = get_errno(do_write(arg1, arg2, arg3));
break;
case TARGET_NR_open:
if (!(p = lock_user_string(arg1)))