Commit 5813427b1ddcd74c39f49563c12f1f4a6dba5cea
1 parent
e126cf13
fcntl() remaining fix, by Stuart Anderson.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2559 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
34 additions
and
0 deletions
linux-user/syscall.c
| @@ -1793,6 +1793,13 @@ static long do_fcntl(int fd, int cmd, target_ulong arg) | @@ -1793,6 +1793,13 @@ static long do_fcntl(int fd, int cmd, target_ulong arg) | ||
| 1793 | 1793 | ||
| 1794 | switch(cmd) { | 1794 | switch(cmd) { |
| 1795 | case TARGET_F_GETLK: | 1795 | case TARGET_F_GETLK: |
| 1796 | + lock_user_struct(target_fl, arg, 1); | ||
| 1797 | + fl.l_type = tswap16(target_fl->l_type); | ||
| 1798 | + fl.l_whence = tswap16(target_fl->l_whence); | ||
| 1799 | + fl.l_start = tswapl(target_fl->l_start); | ||
| 1800 | + fl.l_len = tswapl(target_fl->l_len); | ||
| 1801 | + fl.l_pid = tswapl(target_fl->l_pid); | ||
| 1802 | + unlock_user_struct(target_fl, arg, 0); | ||
| 1796 | ret = fcntl(fd, cmd, &fl); | 1803 | ret = fcntl(fd, cmd, &fl); |
| 1797 | if (ret == 0) { | 1804 | if (ret == 0) { |
| 1798 | lock_user_struct(target_fl, arg, 0); | 1805 | lock_user_struct(target_fl, arg, 0); |
| @@ -1818,6 +1825,13 @@ static long do_fcntl(int fd, int cmd, target_ulong arg) | @@ -1818,6 +1825,13 @@ static long do_fcntl(int fd, int cmd, target_ulong arg) | ||
| 1818 | break; | 1825 | break; |
| 1819 | 1826 | ||
| 1820 | case TARGET_F_GETLK64: | 1827 | case TARGET_F_GETLK64: |
| 1828 | + lock_user_struct(target_fl64, arg, 1); | ||
| 1829 | + fl64.l_type = tswap16(target_fl64->l_type) >> 1; | ||
| 1830 | + fl64.l_whence = tswap16(target_fl64->l_whence); | ||
| 1831 | + fl64.l_start = tswapl(target_fl64->l_start); | ||
| 1832 | + fl64.l_len = tswapl(target_fl64->l_len); | ||
| 1833 | + fl64.l_pid = tswap16(target_fl64->l_pid); | ||
| 1834 | + unlock_user_struct(target_fl64, arg, 0); | ||
| 1821 | ret = fcntl(fd, cmd >> 1, &fl64); | 1835 | ret = fcntl(fd, cmd >> 1, &fl64); |
| 1822 | if (ret == 0) { | 1836 | if (ret == 0) { |
| 1823 | lock_user_struct(target_fl64, arg, 0); | 1837 | lock_user_struct(target_fl64, arg, 0); |
| @@ -3896,6 +3910,26 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -3896,6 +3910,26 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 3896 | 3910 | ||
| 3897 | switch(arg2) { | 3911 | switch(arg2) { |
| 3898 | case TARGET_F_GETLK64: | 3912 | case TARGET_F_GETLK64: |
| 3913 | +#ifdef TARGET_ARM | ||
| 3914 | + if (((CPUARMState *)cpu_env)->eabi) { | ||
| 3915 | + lock_user_struct(target_efl, arg3, 1); | ||
| 3916 | + fl.l_type = tswap16(target_efl->l_type); | ||
| 3917 | + fl.l_whence = tswap16(target_efl->l_whence); | ||
| 3918 | + fl.l_start = tswap64(target_efl->l_start); | ||
| 3919 | + fl.l_len = tswap64(target_efl->l_len); | ||
| 3920 | + fl.l_pid = tswapl(target_efl->l_pid); | ||
| 3921 | + unlock_user_struct(target_efl, arg3, 0); | ||
| 3922 | + } else | ||
| 3923 | +#endif | ||
| 3924 | + { | ||
| 3925 | + lock_user_struct(target_fl, arg3, 1); | ||
| 3926 | + fl.l_type = tswap16(target_fl->l_type); | ||
| 3927 | + fl.l_whence = tswap16(target_fl->l_whence); | ||
| 3928 | + fl.l_start = tswap64(target_fl->l_start); | ||
| 3929 | + fl.l_len = tswap64(target_fl->l_len); | ||
| 3930 | + fl.l_pid = tswapl(target_fl->l_pid); | ||
| 3931 | + unlock_user_struct(target_fl, arg3, 0); | ||
| 3932 | + } | ||
| 3899 | ret = get_errno(fcntl(arg1, cmd, &fl)); | 3933 | ret = get_errno(fcntl(arg1, cmd, &fl)); |
| 3900 | if (ret == 0) { | 3934 | if (ret == 0) { |
| 3901 | #ifdef TARGET_ARM | 3935 | #ifdef TARGET_ARM |