0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/compat.h>
0009 #include <linux/mm.h>
0010 #include <linux/uio.h>
0011 #include <linux/sched.h>
0012 #include <linux/sched/mm.h>
0013 #include <linux/highmem.h>
0014 #include <linux/ptrace.h>
0015 #include <linux/slab.h>
0016 #include <linux/syscalls.h>
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 static int process_vm_rw_pages(struct page **pages,
0028 unsigned offset,
0029 size_t len,
0030 struct iov_iter *iter,
0031 int vm_write)
0032 {
0033
0034 while (len && iov_iter_count(iter)) {
0035 struct page *page = *pages++;
0036 size_t copy = PAGE_SIZE - offset;
0037 size_t copied;
0038
0039 if (copy > len)
0040 copy = len;
0041
0042 if (vm_write)
0043 copied = copy_page_from_iter(page, offset, copy, iter);
0044 else
0045 copied = copy_page_to_iter(page, offset, copy, iter);
0046
0047 len -= copied;
0048 if (copied < copy && iov_iter_count(iter))
0049 return -EFAULT;
0050 offset = 0;
0051 }
0052 return 0;
0053 }
0054
0055
0056 #define PVM_MAX_KMALLOC_PAGES (PAGE_SIZE * 2)
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070 static int process_vm_rw_single_vec(unsigned long addr,
0071 unsigned long len,
0072 struct iov_iter *iter,
0073 struct page **process_pages,
0074 struct mm_struct *mm,
0075 struct task_struct *task,
0076 int vm_write)
0077 {
0078 unsigned long pa = addr & PAGE_MASK;
0079 unsigned long start_offset = addr - pa;
0080 unsigned long nr_pages;
0081 ssize_t rc = 0;
0082 unsigned long max_pages_per_loop = PVM_MAX_KMALLOC_PAGES
0083 / sizeof(struct pages *);
0084 unsigned int flags = 0;
0085
0086
0087 if (len == 0)
0088 return 0;
0089 nr_pages = (addr + len - 1) / PAGE_SIZE - addr / PAGE_SIZE + 1;
0090
0091 if (vm_write)
0092 flags |= FOLL_WRITE;
0093
0094 while (!rc && nr_pages && iov_iter_count(iter)) {
0095 int pinned_pages = min(nr_pages, max_pages_per_loop);
0096 int locked = 1;
0097 size_t bytes;
0098
0099
0100
0101
0102
0103
0104 mmap_read_lock(mm);
0105 pinned_pages = pin_user_pages_remote(mm, pa, pinned_pages,
0106 flags, process_pages,
0107 NULL, &locked);
0108 if (locked)
0109 mmap_read_unlock(mm);
0110 if (pinned_pages <= 0)
0111 return -EFAULT;
0112
0113 bytes = pinned_pages * PAGE_SIZE - start_offset;
0114 if (bytes > len)
0115 bytes = len;
0116
0117 rc = process_vm_rw_pages(process_pages,
0118 start_offset, bytes, iter,
0119 vm_write);
0120 len -= bytes;
0121 start_offset = 0;
0122 nr_pages -= pinned_pages;
0123 pa += pinned_pages * PAGE_SIZE;
0124
0125
0126 unpin_user_pages_dirty_lock(process_pages, pinned_pages,
0127 vm_write);
0128 }
0129
0130 return rc;
0131 }
0132
0133
0134
0135 #define PVM_MAX_PP_ARRAY_COUNT 16
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150 static ssize_t process_vm_rw_core(pid_t pid, struct iov_iter *iter,
0151 const struct iovec *rvec,
0152 unsigned long riovcnt,
0153 unsigned long flags, int vm_write)
0154 {
0155 struct task_struct *task;
0156 struct page *pp_stack[PVM_MAX_PP_ARRAY_COUNT];
0157 struct page **process_pages = pp_stack;
0158 struct mm_struct *mm;
0159 unsigned long i;
0160 ssize_t rc = 0;
0161 unsigned long nr_pages = 0;
0162 unsigned long nr_pages_iov;
0163 ssize_t iov_len;
0164 size_t total_len = iov_iter_count(iter);
0165
0166
0167
0168
0169
0170 for (i = 0; i < riovcnt; i++) {
0171 iov_len = rvec[i].iov_len;
0172 if (iov_len > 0) {
0173 nr_pages_iov = ((unsigned long)rvec[i].iov_base
0174 + iov_len)
0175 / PAGE_SIZE - (unsigned long)rvec[i].iov_base
0176 / PAGE_SIZE + 1;
0177 nr_pages = max(nr_pages, nr_pages_iov);
0178 }
0179 }
0180
0181 if (nr_pages == 0)
0182 return 0;
0183
0184 if (nr_pages > PVM_MAX_PP_ARRAY_COUNT) {
0185
0186
0187 process_pages = kmalloc(min_t(size_t, PVM_MAX_KMALLOC_PAGES,
0188 sizeof(struct pages *)*nr_pages),
0189 GFP_KERNEL);
0190
0191 if (!process_pages)
0192 return -ENOMEM;
0193 }
0194
0195
0196 task = find_get_task_by_vpid(pid);
0197 if (!task) {
0198 rc = -ESRCH;
0199 goto free_proc_pages;
0200 }
0201
0202 mm = mm_access(task, PTRACE_MODE_ATTACH_REALCREDS);
0203 if (!mm || IS_ERR(mm)) {
0204 rc = IS_ERR(mm) ? PTR_ERR(mm) : -ESRCH;
0205
0206
0207
0208
0209 if (rc == -EACCES)
0210 rc = -EPERM;
0211 goto put_task_struct;
0212 }
0213
0214 for (i = 0; i < riovcnt && iov_iter_count(iter) && !rc; i++)
0215 rc = process_vm_rw_single_vec(
0216 (unsigned long)rvec[i].iov_base, rvec[i].iov_len,
0217 iter, process_pages, mm, task, vm_write);
0218
0219
0220 total_len -= iov_iter_count(iter);
0221
0222
0223
0224
0225 if (total_len)
0226 rc = total_len;
0227
0228 mmput(mm);
0229
0230 put_task_struct:
0231 put_task_struct(task);
0232
0233 free_proc_pages:
0234 if (process_pages != pp_stack)
0235 kfree(process_pages);
0236 return rc;
0237 }
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253 static ssize_t process_vm_rw(pid_t pid,
0254 const struct iovec __user *lvec,
0255 unsigned long liovcnt,
0256 const struct iovec __user *rvec,
0257 unsigned long riovcnt,
0258 unsigned long flags, int vm_write)
0259 {
0260 struct iovec iovstack_l[UIO_FASTIOV];
0261 struct iovec iovstack_r[UIO_FASTIOV];
0262 struct iovec *iov_l = iovstack_l;
0263 struct iovec *iov_r;
0264 struct iov_iter iter;
0265 ssize_t rc;
0266 int dir = vm_write ? WRITE : READ;
0267
0268 if (flags != 0)
0269 return -EINVAL;
0270
0271
0272 rc = import_iovec(dir, lvec, liovcnt, UIO_FASTIOV, &iov_l, &iter);
0273 if (rc < 0)
0274 return rc;
0275 if (!iov_iter_count(&iter))
0276 goto free_iov_l;
0277 iov_r = iovec_from_user(rvec, riovcnt, UIO_FASTIOV, iovstack_r,
0278 in_compat_syscall());
0279 if (IS_ERR(iov_r)) {
0280 rc = PTR_ERR(iov_r);
0281 goto free_iov_l;
0282 }
0283 rc = process_vm_rw_core(pid, &iter, iov_r, riovcnt, flags, vm_write);
0284 if (iov_r != iovstack_r)
0285 kfree(iov_r);
0286 free_iov_l:
0287 kfree(iov_l);
0288 return rc;
0289 }
0290
0291 SYSCALL_DEFINE6(process_vm_readv, pid_t, pid, const struct iovec __user *, lvec,
0292 unsigned long, liovcnt, const struct iovec __user *, rvec,
0293 unsigned long, riovcnt, unsigned long, flags)
0294 {
0295 return process_vm_rw(pid, lvec, liovcnt, rvec, riovcnt, flags, 0);
0296 }
0297
0298 SYSCALL_DEFINE6(process_vm_writev, pid_t, pid,
0299 const struct iovec __user *, lvec,
0300 unsigned long, liovcnt, const struct iovec __user *, rvec,
0301 unsigned long, riovcnt, unsigned long, flags)
0302 {
0303 return process_vm_rw(pid, lvec, liovcnt, rvec, riovcnt, flags, 1);
0304 }