Commit b1e341ebb7fc177434e2fda728174fc0e962578e
1 parent
dc3c9d21
fcntl64 fix, by Kirill A. Shutemov.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2517 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
18 additions
and
6 deletions
linux-user/syscall.c
... | ... | @@ -3872,15 +3872,27 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
3872 | 3872 | #if TARGET_LONG_BITS == 32 |
3873 | 3873 | case TARGET_NR_fcntl64: |
3874 | 3874 | { |
3875 | + int cmd; | |
3875 | 3876 | struct flock64 fl; |
3876 | 3877 | struct target_flock64 *target_fl; |
3877 | 3878 | #ifdef TARGET_ARM |
3878 | 3879 | struct target_eabi_flock64 *target_efl; |
3879 | 3880 | #endif |
3880 | 3881 | |
3882 | + switch(arg2){ | |
3883 | + case TARGET_F_GETLK64: | |
3884 | + cmd = F_GETLK64; | |
3885 | + case TARGET_F_SETLK64: | |
3886 | + cmd = F_SETLK64; | |
3887 | + case TARGET_F_SETLKW64: | |
3888 | + cmd = F_SETLK64; | |
3889 | + default: | |
3890 | + cmd = arg2; | |
3891 | + } | |
3892 | + | |
3881 | 3893 | switch(arg2) { |
3882 | - case F_GETLK64: | |
3883 | - ret = get_errno(fcntl(arg1, arg2, &fl)); | |
3894 | + case TARGET_F_GETLK64: | |
3895 | + ret = get_errno(fcntl(arg1, cmd, &fl)); | |
3884 | 3896 | if (ret == 0) { |
3885 | 3897 | #ifdef TARGET_ARM |
3886 | 3898 | if (((CPUARMState *)cpu_env)->eabi) { |
... | ... | @@ -3905,8 +3917,8 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
3905 | 3917 | } |
3906 | 3918 | break; |
3907 | 3919 | |
3908 | - case F_SETLK64: | |
3909 | - case F_SETLKW64: | |
3920 | + case TARGET_F_SETLK64: | |
3921 | + case TARGET_F_SETLKW64: | |
3910 | 3922 | #ifdef TARGET_ARM |
3911 | 3923 | if (((CPUARMState *)cpu_env)->eabi) { |
3912 | 3924 | lock_user_struct(target_efl, arg3, 1); |
... | ... | @@ -3927,10 +3939,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
3927 | 3939 | fl.l_pid = tswapl(target_fl->l_pid); |
3928 | 3940 | unlock_user_struct(target_fl, arg3, 0); |
3929 | 3941 | } |
3930 | - ret = get_errno(fcntl(arg1, arg2, &fl)); | |
3942 | + ret = get_errno(fcntl(arg1, cmd, &fl)); | |
3931 | 3943 | break; |
3932 | 3944 | default: |
3933 | - ret = get_errno(do_fcntl(arg1, arg2, arg3)); | |
3945 | + ret = get_errno(do_fcntl(arg1, cmd, arg3)); | |
3934 | 3946 | break; |
3935 | 3947 | } |
3936 | 3948 | break; | ... | ... |