|
@@ -241,60 +241,6 @@ int ptrace_detach(struct task_struct *child, unsigned int data)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Access another process' address space.
|
|
|
- * Source/target buffer must be kernel space,
|
|
|
- * Do not walk the page table directly, use get_user_pages
|
|
|
- */
|
|
|
-
|
|
|
-int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write)
|
|
|
-{
|
|
|
- struct mm_struct *mm;
|
|
|
- struct vm_area_struct *vma;
|
|
|
- struct page *page;
|
|
|
- void *old_buf = buf;
|
|
|
-
|
|
|
- mm = get_task_mm(tsk);
|
|
|
- if (!mm)
|
|
|
- return 0;
|
|
|
-
|
|
|
- down_read(&mm->mmap_sem);
|
|
|
- /* ignore errors, just check how much was sucessfully transfered */
|
|
|
- while (len) {
|
|
|
- int bytes, ret, offset;
|
|
|
- void *maddr;
|
|
|
-
|
|
|
- ret = get_user_pages(tsk, mm, addr, 1,
|
|
|
- write, 1, &page, &vma);
|
|
|
- if (ret <= 0)
|
|
|
- break;
|
|
|
-
|
|
|
- bytes = len;
|
|
|
- offset = addr & (PAGE_SIZE-1);
|
|
|
- if (bytes > PAGE_SIZE-offset)
|
|
|
- bytes = PAGE_SIZE-offset;
|
|
|
-
|
|
|
- maddr = kmap(page);
|
|
|
- if (write) {
|
|
|
- copy_to_user_page(vma, page, addr,
|
|
|
- maddr + offset, buf, bytes);
|
|
|
- set_page_dirty_lock(page);
|
|
|
- } else {
|
|
|
- copy_from_user_page(vma, page, addr,
|
|
|
- buf, maddr + offset, bytes);
|
|
|
- }
|
|
|
- kunmap(page);
|
|
|
- page_cache_release(page);
|
|
|
- len -= bytes;
|
|
|
- buf += bytes;
|
|
|
- addr += bytes;
|
|
|
- }
|
|
|
- up_read(&mm->mmap_sem);
|
|
|
- mmput(mm);
|
|
|
-
|
|
|
- return buf - old_buf;
|
|
|
-}
|
|
|
-
|
|
|
int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len)
|
|
|
{
|
|
|
int copied = 0;
|