Commit 206f0fa7598242e3e3b742e72d4743e9ea4eefd0

Authored by bellard
1 parent fd6ce8f6

pread/pwrite syscalls - use page_unprotect_range() in vital cases to avoid probl…

…ems if the kernel writes data in protected page (needed for self-modifying code support)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@164 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 6 additions and 2 deletions
linux-user/syscall.c
@@ -1137,6 +1137,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, @@ -1137,6 +1137,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
1137 ret = 0; /* avoid warning */ 1137 ret = 0; /* avoid warning */
1138 break; 1138 break;
1139 case TARGET_NR_read: 1139 case TARGET_NR_read:
  1140 + page_unprotect_range((void *)arg2, arg3);
1140 ret = get_errno(read(arg1, (void *)arg2, arg3)); 1141 ret = get_errno(read(arg1, (void *)arg2, arg3));
1141 break; 1142 break;
1142 case TARGET_NR_write: 1143 case TARGET_NR_write:
@@ -2191,9 +2192,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, @@ -2191,9 +2192,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
2191 case TARGET_NR_prctl: 2192 case TARGET_NR_prctl:
2192 goto unimplemented; 2193 goto unimplemented;
2193 case TARGET_NR_pread: 2194 case TARGET_NR_pread:
2194 - goto unimplemented; 2195 + page_unprotect_range((void *)arg2, arg3);
  2196 + ret = get_errno(pread(arg1, (void *)arg2, arg3, arg4));
  2197 + break;
2195 case TARGET_NR_pwrite: 2198 case TARGET_NR_pwrite:
2196 - goto unimplemented; 2199 + ret = get_errno(pwrite(arg1, (void *)arg2, arg3, arg4));
  2200 + break;
2197 case TARGET_NR_chown: 2201 case TARGET_NR_chown:
2198 ret = get_errno(chown((const char *)arg1, arg2, arg3)); 2202 ret = get_errno(chown((const char *)arg1, arg2, arg3));
2199 break; 2203 break;