The return value of openat was being translated by get_errno() twice. Fixed by removing calls of get_errno() in do_syscall() and keeping those in do_openat().
Signed-off-by: Timothy Edward Baldwin <t.e.baldwi...@members.leeds.ac.uk> --- linux-user/syscall.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index c213588..df9b2ca 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -5764,17 +5764,17 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, case TARGET_NR_open: if (!(p = lock_user_string(arg1))) goto efault; - ret = get_errno(do_openat(cpu_env, AT_FDCWD, p, - target_to_host_bitmask(arg2, fcntl_flags_tbl), - arg3)); + ret = do_openat(cpu_env, AT_FDCWD, p, + target_to_host_bitmask(arg2, fcntl_flags_tbl), + arg3); unlock_user(p, arg1, 0); break; case TARGET_NR_openat: if (!(p = lock_user_string(arg2))) goto efault; - ret = get_errno(do_openat(cpu_env, arg1, p, - target_to_host_bitmask(arg3, fcntl_flags_tbl), - arg4)); + ret = do_openat(cpu_env, arg1, p, + target_to_host_bitmask(arg3, fcntl_flags_tbl), + arg4); unlock_user(p, arg2, 0); break; case TARGET_NR_close: -- 2.1.4