diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-03-21 14:47:11 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-11 22:27:12 -0400 |
commit | 17d17e728224f69311675e2ff312e992b7cc7b1e (patch) | |
tree | d6c2384a803bb6fd761f2ad1ce4ad17b2d7f47aa | |
parent | b353a1f7bbd6c015e8563e902f7c78710348e28f (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.c | 35 |
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, | |||
283 | free_iovecs: | 279 | free_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, | |||
346 | free_iovecs: | 336 | free_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 | ||