|
@@ -2162,16 +2162,16 @@ static struct dentry *proc_map_files_lookup(struct inode *dir,
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
result = ERR_PTR(-EACCES);
|
|
result = ERR_PTR(-EACCES);
|
|
- if (lock_trace(task))
|
|
|
|
|
|
+ if (!ptrace_may_access(task, PTRACE_MODE_READ))
|
|
goto out_put_task;
|
|
goto out_put_task;
|
|
|
|
|
|
result = ERR_PTR(-ENOENT);
|
|
result = ERR_PTR(-ENOENT);
|
|
if (dname_to_vma_addr(dentry, &vm_start, &vm_end))
|
|
if (dname_to_vma_addr(dentry, &vm_start, &vm_end))
|
|
- goto out_unlock;
|
|
|
|
|
|
+ goto out_put_task;
|
|
|
|
|
|
mm = get_task_mm(task);
|
|
mm = get_task_mm(task);
|
|
if (!mm)
|
|
if (!mm)
|
|
- goto out_unlock;
|
|
|
|
|
|
+ goto out_put_task;
|
|
|
|
|
|
down_read(&mm->mmap_sem);
|
|
down_read(&mm->mmap_sem);
|
|
vma = find_exact_vma(mm, vm_start, vm_end);
|
|
vma = find_exact_vma(mm, vm_start, vm_end);
|
|
@@ -2183,8 +2183,6 @@ static struct dentry *proc_map_files_lookup(struct inode *dir,
|
|
out_no_vma:
|
|
out_no_vma:
|
|
up_read(&mm->mmap_sem);
|
|
up_read(&mm->mmap_sem);
|
|
mmput(mm);
|
|
mmput(mm);
|
|
-out_unlock:
|
|
|
|
- unlock_trace(task);
|
|
|
|
out_put_task:
|
|
out_put_task:
|
|
put_task_struct(task);
|
|
put_task_struct(task);
|
|
out:
|
|
out:
|
|
@@ -2218,7 +2216,7 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
ret = -EACCES;
|
|
ret = -EACCES;
|
|
- if (lock_trace(task))
|
|
|
|
|
|
+ if (!ptrace_may_access(task, PTRACE_MODE_READ))
|
|
goto out_put_task;
|
|
goto out_put_task;
|
|
|
|
|
|
ret = 0;
|
|
ret = 0;
|
|
@@ -2226,12 +2224,12 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
|
case 0:
|
|
case 0:
|
|
ino = inode->i_ino;
|
|
ino = inode->i_ino;
|
|
if (filldir(dirent, ".", 1, 0, ino, DT_DIR) < 0)
|
|
if (filldir(dirent, ".", 1, 0, ino, DT_DIR) < 0)
|
|
- goto out_unlock;
|
|
|
|
|
|
+ goto out_put_task;
|
|
filp->f_pos++;
|
|
filp->f_pos++;
|
|
case 1:
|
|
case 1:
|
|
ino = parent_ino(dentry);
|
|
ino = parent_ino(dentry);
|
|
if (filldir(dirent, "..", 2, 1, ino, DT_DIR) < 0)
|
|
if (filldir(dirent, "..", 2, 1, ino, DT_DIR) < 0)
|
|
- goto out_unlock;
|
|
|
|
|
|
+ goto out_put_task;
|
|
filp->f_pos++;
|
|
filp->f_pos++;
|
|
default:
|
|
default:
|
|
{
|
|
{
|
|
@@ -2242,7 +2240,7 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
|
|
|
|
|
mm = get_task_mm(task);
|
|
mm = get_task_mm(task);
|
|
if (!mm)
|
|
if (!mm)
|
|
- goto out_unlock;
|
|
|
|
|
|
+ goto out_put_task;
|
|
down_read(&mm->mmap_sem);
|
|
down_read(&mm->mmap_sem);
|
|
|
|
|
|
nr_files = 0;
|
|
nr_files = 0;
|
|
@@ -2272,7 +2270,7 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
|
flex_array_free(fa);
|
|
flex_array_free(fa);
|
|
up_read(&mm->mmap_sem);
|
|
up_read(&mm->mmap_sem);
|
|
mmput(mm);
|
|
mmput(mm);
|
|
- goto out_unlock;
|
|
|
|
|
|
+ goto out_put_task;
|
|
}
|
|
}
|
|
for (i = 0, vma = mm->mmap, pos = 2; vma;
|
|
for (i = 0, vma = mm->mmap, pos = 2; vma;
|
|
vma = vma->vm_next) {
|
|
vma = vma->vm_next) {
|
|
@@ -2317,8 +2315,6 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-out_unlock:
|
|
|
|
- unlock_trace(task);
|
|
|
|
out_put_task:
|
|
out_put_task:
|
|
put_task_struct(task);
|
|
put_task_struct(task);
|
|
out:
|
|
out:
|