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; | ... | ... |