aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-03-21 14:47:11 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2015-04-11 22:27:12 -0400
commit17d17e728224f69311675e2ff312e992b7cc7b1e (patch)
treed6c2384a803bb6fd761f2ad1ce4ad17b2d7f47aa
parentb353a1f7bbd6c015e8563e902f7c78710348e28f (diff)
process_vm_access: switch to {compat_,}import_iovec()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--mm/process_vm_access.c35
1 files changed, 12 insertions, 23 deletions
diff --git a/mm/process_vm_access.c b/mm/process_vm_access.c
index b1597690530c..e88d071648c2 100644
--- a/mm/process_vm_access.c
+++ b/mm/process_vm_access.c
@@ -257,22 +257,18 @@ static ssize_t process_vm_rw(pid_t pid,
257 struct iovec *iov_r = iovstack_r; 257 struct iovec *iov_r = iovstack_r;
258 struct iov_iter iter; 258 struct iov_iter iter;
259 ssize_t rc; 259 ssize_t rc;
260 int dir = vm_write ? WRITE : READ;
260 261
261 if (flags != 0) 262 if (flags != 0)
262 return -EINVAL; 263 return -EINVAL;
263 264
264 /* Check iovecs */ 265 /* Check iovecs */
265 if (vm_write) 266 rc = import_iovec(dir, lvec, liovcnt, UIO_FASTIOV, &iov_l, &iter);
266 rc = rw_copy_check_uvector(WRITE, lvec, liovcnt, UIO_FASTIOV, 267 if (rc < 0)
267 iovstack_l, &iov_l); 268 return rc;
268 else 269 if (!iov_iter_count(&iter))
269 rc = rw_copy_check_uvector(READ, lvec, liovcnt, UIO_FASTIOV,
270 iovstack_l, &iov_l);
271 if (rc <= 0)
272 goto free_iovecs; 270 goto free_iovecs;
273 271
274 iov_iter_init(&iter, vm_write ? WRITE : READ, iov_l, liovcnt, rc);
275
276 rc = rw_copy_check_uvector(CHECK_IOVEC_ONLY, rvec, riovcnt, UIO_FASTIOV, 272 rc = rw_copy_check_uvector(CHECK_IOVEC_ONLY, rvec, riovcnt, UIO_FASTIOV,
277 iovstack_r, &iov_r); 273 iovstack_r, &iov_r);
278 if (rc <= 0) 274 if (rc <= 0)
@@ -283,8 +279,7 @@ static ssize_t process_vm_rw(pid_t pid,
283free_iovecs: 279free_iovecs:
284 if (iov_r != iovstack_r) 280 if (iov_r != iovstack_r)
285 kfree(iov_r); 281 kfree(iov_r);
286 if (iov_l != iovstack_l) 282 kfree(iov_l);
287 kfree(iov_l);
288 283
289 return rc; 284 return rc;
290} 285}
@@ -320,21 +315,16 @@ compat_process_vm_rw(compat_pid_t pid,
320 struct iovec *iov_r = iovstack_r; 315 struct iovec *iov_r = iovstack_r;
321 struct iov_iter iter; 316 struct iov_iter iter;
322 ssize_t rc = -EFAULT; 317 ssize_t rc = -EFAULT;
318 int dir = vm_write ? WRITE : READ;
323 319
324 if (flags != 0) 320 if (flags != 0)
325 return -EINVAL; 321 return -EINVAL;
326 322
327 if (vm_write) 323 rc = compat_import_iovec(dir, lvec, liovcnt, UIO_FASTIOV, &iov_l, &iter);
328 rc = compat_rw_copy_check_uvector(WRITE, lvec, liovcnt, 324 if (rc < 0)
329 UIO_FASTIOV, iovstack_l, 325 return rc;
330 &iov_l); 326 if (!iov_iter_count(&iter))
331 else
332 rc = compat_rw_copy_check_uvector(READ, lvec, liovcnt,
333 UIO_FASTIOV, iovstack_l,
334 &iov_l);
335 if (rc <= 0)
336 goto free_iovecs; 327 goto free_iovecs;
337 iov_iter_init(&iter, vm_write ? WRITE : READ, iov_l, liovcnt, rc);
338 rc = compat_rw_copy_check_uvector(CHECK_IOVEC_ONLY, rvec, riovcnt, 328 rc = compat_rw_copy_check_uvector(CHECK_IOVEC_ONLY, rvec, riovcnt,
339 UIO_FASTIOV, iovstack_r, 329 UIO_FASTIOV, iovstack_r,
340 &iov_r); 330 &iov_r);
@@ -346,8 +336,7 @@ compat_process_vm_rw(compat_pid_t pid,
346free_iovecs: 336free_iovecs:
347 if (iov_r != iovstack_r) 337 if (iov_r != iovstack_r)
348 kfree(iov_r); 338 kfree(iov_r);
349 if (iov_l != iovstack_l) 339 kfree(iov_l);
350 kfree(iov_l);
351 return rc; 340 return rc;
352} 341}
353 342