aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/proc/base.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c
index 1c8b280146d7..8e139c90f9fd 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -2177,16 +2177,16 @@ static struct dentry *proc_map_files_lookup(struct inode *dir,
2177 goto out; 2177 goto out;
2178 2178
2179 result = ERR_PTR(-EACCES); 2179 result = ERR_PTR(-EACCES);
2180 if (lock_trace(task)) 2180 if (!ptrace_may_access(task, PTRACE_MODE_READ))
2181 goto out_put_task; 2181 goto out_put_task;
2182 2182
2183 result = ERR_PTR(-ENOENT); 2183 result = ERR_PTR(-ENOENT);
2184 if (dname_to_vma_addr(dentry, &vm_start, &vm_end)) 2184 if (dname_to_vma_addr(dentry, &vm_start, &vm_end))
2185 goto out_unlock; 2185 goto out_put_task;
2186 2186
2187 mm = get_task_mm(task); 2187 mm = get_task_mm(task);
2188 if (!mm) 2188 if (!mm)
2189 goto out_unlock; 2189 goto out_put_task;
2190 2190
2191 down_read(&mm->mmap_sem); 2191 down_read(&mm->mmap_sem);
2192 vma = find_exact_vma(mm, vm_start, vm_end); 2192 vma = find_exact_vma(mm, vm_start, vm_end);
@@ -2198,8 +2198,6 @@ static struct dentry *proc_map_files_lookup(struct inode *dir,
2198out_no_vma: 2198out_no_vma:
2199 up_read(&mm->mmap_sem); 2199 up_read(&mm->mmap_sem);
2200 mmput(mm); 2200 mmput(mm);
2201out_unlock:
2202 unlock_trace(task);
2203out_put_task: 2201out_put_task:
2204 put_task_struct(task); 2202 put_task_struct(task);
2205out: 2203out:
@@ -2233,7 +2231,7 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir)
2233 goto out; 2231 goto out;
2234 2232
2235 ret = -EACCES; 2233 ret = -EACCES;
2236 if (lock_trace(task)) 2234 if (!ptrace_may_access(task, PTRACE_MODE_READ))
2237 goto out_put_task; 2235 goto out_put_task;
2238 2236
2239 ret = 0; 2237 ret = 0;
@@ -2241,12 +2239,12 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir)
2241 case 0: 2239 case 0:
2242 ino = inode->i_ino; 2240 ino = inode->i_ino;
2243 if (filldir(dirent, ".", 1, 0, ino, DT_DIR) < 0) 2241 if (filldir(dirent, ".", 1, 0, ino, DT_DIR) < 0)
2244 goto out_unlock; 2242 goto out_put_task;
2245 filp->f_pos++; 2243 filp->f_pos++;
2246 case 1: 2244 case 1:
2247 ino = parent_ino(dentry); 2245 ino = parent_ino(dentry);
2248 if (filldir(dirent, "..", 2, 1, ino, DT_DIR) < 0) 2246 if (filldir(dirent, "..", 2, 1, ino, DT_DIR) < 0)
2249 goto out_unlock; 2247 goto out_put_task;
2250 filp->f_pos++; 2248 filp->f_pos++;
2251 default: 2249 default:
2252 { 2250 {
@@ -2257,7 +2255,7 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir)
2257 2255
2258 mm = get_task_mm(task); 2256 mm = get_task_mm(task);
2259 if (!mm) 2257 if (!mm)
2260 goto out_unlock; 2258 goto out_put_task;
2261 down_read(&mm->mmap_sem); 2259 down_read(&mm->mmap_sem);
2262 2260
2263 nr_files = 0; 2261 nr_files = 0;
@@ -2287,7 +2285,7 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir)
2287 flex_array_free(fa); 2285 flex_array_free(fa);
2288 up_read(&mm->mmap_sem); 2286 up_read(&mm->mmap_sem);
2289 mmput(mm); 2287 mmput(mm);
2290 goto out_unlock; 2288 goto out_put_task;
2291 } 2289 }
2292 for (i = 0, vma = mm->mmap, pos = 2; vma; 2290 for (i = 0, vma = mm->mmap, pos = 2; vma;
2293 vma = vma->vm_next) { 2291 vma = vma->vm_next) {
@@ -2332,8 +2330,6 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir)
2332 } 2330 }
2333 } 2331 }
2334 2332
2335out_unlock:
2336 unlock_trace(task);
2337out_put_task: 2333out_put_task:
2338 put_task_struct(task); 2334 put_task_struct(task);
2339out: 2335out: