Commit b1e341ebb7fc177434e2fda728174fc0e962578e

Authored by ths
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,15 +3872,27 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
3872 #if TARGET_LONG_BITS == 32 3872 #if TARGET_LONG_BITS == 32
3873 case TARGET_NR_fcntl64: 3873 case TARGET_NR_fcntl64:
3874 { 3874 {
  3875 + int cmd;
3875 struct flock64 fl; 3876 struct flock64 fl;
3876 struct target_flock64 *target_fl; 3877 struct target_flock64 *target_fl;
3877 #ifdef TARGET_ARM 3878 #ifdef TARGET_ARM
3878 struct target_eabi_flock64 *target_efl; 3879 struct target_eabi_flock64 *target_efl;
3879 #endif 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 switch(arg2) { 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 if (ret == 0) { 3896 if (ret == 0) {
3885 #ifdef TARGET_ARM 3897 #ifdef TARGET_ARM
3886 if (((CPUARMState *)cpu_env)->eabi) { 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,8 +3917,8 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
3905 } 3917 }
3906 break; 3918 break;
3907 3919
3908 - case F_SETLK64:  
3909 - case F_SETLKW64: 3920 + case TARGET_F_SETLK64:
  3921 + case TARGET_F_SETLKW64:
3910 #ifdef TARGET_ARM 3922 #ifdef TARGET_ARM
3911 if (((CPUARMState *)cpu_env)->eabi) { 3923 if (((CPUARMState *)cpu_env)->eabi) {
3912 lock_user_struct(target_efl, arg3, 1); 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,10 +3939,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
3927 fl.l_pid = tswapl(target_fl->l_pid); 3939 fl.l_pid = tswapl(target_fl->l_pid);
3928 unlock_user_struct(target_fl, arg3, 0); 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 break; 3943 break;
3932 default: 3944 default:
3933 - ret = get_errno(do_fcntl(arg1, arg2, arg3)); 3945 + ret = get_errno(do_fcntl(arg1, cmd, arg3));
3934 break; 3946 break;
3935 } 3947 }
3936 break; 3948 break;