Commit 9ee1fa2ca9d925e53f5609b35fe29d719abae980
1 parent
03acab66
move get_errno() inside do_fcntl()
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3591 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
25 additions
and
35 deletions
linux-user/syscall.c
... | ... | @@ -2478,7 +2478,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) |
2478 | 2478 | fl.l_len = tswapl(target_fl->l_len); |
2479 | 2479 | fl.l_pid = tswapl(target_fl->l_pid); |
2480 | 2480 | unlock_user_struct(target_fl, arg, 0); |
2481 | - ret = fcntl(fd, cmd, &fl); | |
2481 | + ret = get_errno(fcntl(fd, cmd, &fl)); | |
2482 | 2482 | if (ret == 0) { |
2483 | 2483 | if (!lock_user_struct(VERIFY_WRITE, target_fl, arg, 0)) |
2484 | 2484 | return -TARGET_EFAULT; |
... | ... | @@ -2501,7 +2501,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) |
2501 | 2501 | fl.l_len = tswapl(target_fl->l_len); |
2502 | 2502 | fl.l_pid = tswapl(target_fl->l_pid); |
2503 | 2503 | unlock_user_struct(target_fl, arg, 0); |
2504 | - ret = fcntl(fd, cmd, &fl); | |
2504 | + ret = get_errno(fcntl(fd, cmd, &fl)); | |
2505 | 2505 | break; |
2506 | 2506 | |
2507 | 2507 | case TARGET_F_GETLK64: |
... | ... | @@ -2513,7 +2513,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) |
2513 | 2513 | fl64.l_len = tswapl(target_fl64->l_len); |
2514 | 2514 | fl64.l_pid = tswap16(target_fl64->l_pid); |
2515 | 2515 | unlock_user_struct(target_fl64, arg, 0); |
2516 | - ret = fcntl(fd, cmd >> 1, &fl64); | |
2516 | + ret = get_errno(fcntl(fd, cmd >> 1, &fl64)); | |
2517 | 2517 | if (ret == 0) { |
2518 | 2518 | if (!lock_user_struct(VERIFY_WRITE, target_fl64, arg, 0)) |
2519 | 2519 | return -TARGET_EFAULT; |
... | ... | @@ -2524,7 +2524,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) |
2524 | 2524 | target_fl64->l_pid = tswapl(fl64.l_pid); |
2525 | 2525 | unlock_user_struct(target_fl64, arg, 1); |
2526 | 2526 | } |
2527 | - break; | |
2527 | + break; | |
2528 | 2528 | case TARGET_F_SETLK64: |
2529 | 2529 | case TARGET_F_SETLKW64: |
2530 | 2530 | if (!lock_user_struct(VERIFY_READ, target_fl64, arg, 1)) |
... | ... | @@ -2535,20 +2535,22 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) |
2535 | 2535 | fl64.l_len = tswapl(target_fl64->l_len); |
2536 | 2536 | fl64.l_pid = tswap16(target_fl64->l_pid); |
2537 | 2537 | unlock_user_struct(target_fl64, arg, 0); |
2538 | - ret = fcntl(fd, cmd >> 1, &fl64); | |
2538 | + ret = get_errno(fcntl(fd, cmd >> 1, &fl64)); | |
2539 | 2539 | break; |
2540 | 2540 | |
2541 | 2541 | case F_GETFL: |
2542 | - ret = fcntl(fd, cmd, arg); | |
2543 | - ret = host_to_target_bitmask(ret, fcntl_flags_tbl); | |
2542 | + ret = get_errno(fcntl(fd, cmd, arg)); | |
2543 | + if (ret >= 0) { | |
2544 | + ret = host_to_target_bitmask(ret, fcntl_flags_tbl); | |
2545 | + } | |
2544 | 2546 | break; |
2545 | 2547 | |
2546 | 2548 | case F_SETFL: |
2547 | - ret = fcntl(fd, cmd, target_to_host_bitmask(arg, fcntl_flags_tbl)); | |
2549 | + ret = get_errno(fcntl(fd, cmd, target_to_host_bitmask(arg, fcntl_flags_tbl))); | |
2548 | 2550 | break; |
2549 | 2551 | |
2550 | 2552 | default: |
2551 | - ret = fcntl(fd, cmd, arg); | |
2553 | + ret = get_errno(fcntl(fd, cmd, arg)); | |
2552 | 2554 | break; |
2553 | 2555 | } |
2554 | 2556 | return ret; |
... | ... | @@ -3209,7 +3211,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, |
3209 | 3211 | ret = do_ioctl(arg1, arg2, arg3); |
3210 | 3212 | break; |
3211 | 3213 | case TARGET_NR_fcntl: |
3212 | - ret = get_errno(do_fcntl(arg1, arg2, arg3)); | |
3214 | + ret = do_fcntl(arg1, arg2, arg3); | |
3213 | 3215 | break; |
3214 | 3216 | #ifdef TARGET_NR_mpx |
3215 | 3217 | case TARGET_NR_mpx: |
... | ... | @@ -4988,10 +4990,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, |
4988 | 4990 | case TARGET_F_GETLK64: |
4989 | 4991 | #ifdef TARGET_ARM |
4990 | 4992 | if (((CPUARMState *)cpu_env)->eabi) { |
4991 | - if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1)) { | |
4992 | - ret = -TARGET_EFAULT; | |
4993 | - goto fail; | |
4994 | - } | |
4993 | + if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1)) | |
4994 | + goto efault; | |
4995 | 4995 | fl.l_type = tswap16(target_efl->l_type); |
4996 | 4996 | fl.l_whence = tswap16(target_efl->l_whence); |
4997 | 4997 | fl.l_start = tswap64(target_efl->l_start); |
... | ... | @@ -5001,10 +5001,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, |
5001 | 5001 | } else |
5002 | 5002 | #endif |
5003 | 5003 | { |
5004 | - if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) { | |
5005 | - ret = -TARGET_EFAULT; | |
5006 | - goto fail; | |
5007 | - } | |
5004 | + if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) | |
5005 | + goto efault; | |
5008 | 5006 | fl.l_type = tswap16(target_fl->l_type); |
5009 | 5007 | fl.l_whence = tswap16(target_fl->l_whence); |
5010 | 5008 | fl.l_start = tswap64(target_fl->l_start); |
... | ... | @@ -5016,10 +5014,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, |
5016 | 5014 | if (ret == 0) { |
5017 | 5015 | #ifdef TARGET_ARM |
5018 | 5016 | if (((CPUARMState *)cpu_env)->eabi) { |
5019 | - if (!lock_user_struct(VERIFY_WRITE, target_efl, arg3, 0)) { | |
5020 | - ret = -TARGET_EFAULT; | |
5021 | - goto fail; | |
5022 | - } | |
5017 | + if (!lock_user_struct(VERIFY_WRITE, target_efl, arg3, 0)) | |
5018 | + goto efault; | |
5023 | 5019 | target_efl->l_type = tswap16(fl.l_type); |
5024 | 5020 | target_efl->l_whence = tswap16(fl.l_whence); |
5025 | 5021 | target_efl->l_start = tswap64(fl.l_start); |
... | ... | @@ -5029,10 +5025,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, |
5029 | 5025 | } else |
5030 | 5026 | #endif |
5031 | 5027 | { |
5032 | - if (!lock_user_struct(VERIFY_WRITE, target_fl, arg3, 0)) { | |
5033 | - ret = -TARGET_EFAULT; | |
5034 | - goto fail; | |
5035 | - } | |
5028 | + if (!lock_user_struct(VERIFY_WRITE, target_fl, arg3, 0)) | |
5029 | + goto efault; | |
5036 | 5030 | target_fl->l_type = tswap16(fl.l_type); |
5037 | 5031 | target_fl->l_whence = tswap16(fl.l_whence); |
5038 | 5032 | target_fl->l_start = tswap64(fl.l_start); |
... | ... | @@ -5047,10 +5041,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, |
5047 | 5041 | case TARGET_F_SETLKW64: |
5048 | 5042 | #ifdef TARGET_ARM |
5049 | 5043 | if (((CPUARMState *)cpu_env)->eabi) { |
5050 | - if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1)) { | |
5051 | - ret = -TARGET_EFAULT; | |
5052 | - goto fail; | |
5053 | - } | |
5044 | + if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1)) | |
5045 | + goto efault; | |
5054 | 5046 | fl.l_type = tswap16(target_efl->l_type); |
5055 | 5047 | fl.l_whence = tswap16(target_efl->l_whence); |
5056 | 5048 | fl.l_start = tswap64(target_efl->l_start); |
... | ... | @@ -5060,10 +5052,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, |
5060 | 5052 | } else |
5061 | 5053 | #endif |
5062 | 5054 | { |
5063 | - if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) { | |
5064 | - ret = -TARGET_EFAULT; | |
5065 | - goto fail; | |
5066 | - } | |
5055 | + if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) | |
5056 | + goto efault; | |
5067 | 5057 | fl.l_type = tswap16(target_fl->l_type); |
5068 | 5058 | fl.l_whence = tswap16(target_fl->l_whence); |
5069 | 5059 | fl.l_start = tswap64(target_fl->l_start); |
... | ... | @@ -5074,7 +5064,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, |
5074 | 5064 | ret = get_errno(fcntl(arg1, cmd, &fl)); |
5075 | 5065 | break; |
5076 | 5066 | default: |
5077 | - ret = get_errno(do_fcntl(arg1, cmd, arg3)); | |
5067 | + ret = do_fcntl(arg1, cmd, arg3); | |
5078 | 5068 | break; |
5079 | 5069 | } |
5080 | 5070 | break; | ... | ... |