Commit 2dd8ad81e31d0d36a5d448329c646ab43eb17788

Authored by Konstantin Khlebnikov
Committed by Linus Torvalds
1 parent 0b173bc4da

mm: use mm->exe_file instead of first VM_EXECUTABLE vma->vm_file

Some security modules and oprofile still uses VM_EXECUTABLE for retrieving
a task's executable file.  After this patch they will use mm->exe_file
directly.  mm->exe_file is protected with mm->mmap_sem, so locking stays
the same.

Signed-off-by: Konstantin Khlebnikov <khlebnikov@openvz.org>
Acked-by: Chris Metcalf <cmetcalf@tilera.com>			[arch/tile]
Acked-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>	[tomoyo]
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Carsten Otte <cotte@de.ibm.com>
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Eric Paris <eparis@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Acked-by: James Morris <james.l.morris@oracle.com>
Cc: Jason Baron <jbaron@redhat.com>
Cc: Kentaro Takeda <takedakn@nttdata.co.jp>
Cc: Matt Helsley <matthltc@us.ibm.com>
Cc: Nick Piggin <npiggin@kernel.dk>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Robert Richter <robert.richter@amd.com>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
Cc: Venkatesh Pallipadi <venki@google.com>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 6 changed files with 19 additions and 57 deletions Side-by-side Diff

arch/powerpc/oprofile/cell/spu_task_sync.c
... ... @@ -304,7 +304,7 @@
304 304 return cookie;
305 305 }
306 306  
307   -/* Look up the dcookie for the task's first VM_EXECUTABLE mapping,
  307 +/* Look up the dcookie for the task's mm->exe_file,
308 308 * which corresponds loosely to "application name". Also, determine
309 309 * the offset for the SPU ELF object. If computed offset is
310 310 * non-zero, it implies an embedded SPU object; otherwise, it's a
... ... @@ -321,7 +321,6 @@
321 321 {
322 322 unsigned long app_cookie = 0;
323 323 unsigned int my_offset = 0;
324   - struct file *app = NULL;
325 324 struct vm_area_struct *vma;
326 325 struct mm_struct *mm = spu->mm;
327 326  
328 327  
... ... @@ -330,16 +329,10 @@
330 329  
331 330 down_read(&mm->mmap_sem);
332 331  
333   - for (vma = mm->mmap; vma; vma = vma->vm_next) {
334   - if (!vma->vm_file)
335   - continue;
336   - if (!(vma->vm_flags & VM_EXECUTABLE))
337   - continue;
338   - app_cookie = fast_get_dcookie(&vma->vm_file->f_path);
  332 + if (mm->exe_file) {
  333 + app_cookie = fast_get_dcookie(&mm->exe_file->f_path);
339 334 pr_debug("got dcookie for %s\n",
340   - vma->vm_file->f_dentry->d_name.name);
341   - app = vma->vm_file;
342   - break;
  335 + mm->exe_file->f_dentry->d_name.name);
343 336 }
344 337  
345 338 for (vma = mm->mmap; vma; vma = vma->vm_next) {
... ... @@ -36,19 +36,14 @@
36 36 } while (c);
37 37 }
38 38  
39   -static int notify_exec(void)
  39 +static int notify_exec(struct mm_struct *mm)
40 40 {
41 41 int retval = 0; /* failure */
42   - struct vm_area_struct *vma = current->mm->mmap;
43   - while (vma) {
44   - if ((vma->vm_flags & VM_EXECUTABLE) && vma->vm_file)
45   - break;
46   - vma = vma->vm_next;
47   - }
48   - if (vma) {
  42 +
  43 + if (mm->exe_file) {
49 44 char *buf = (char *) __get_free_page(GFP_KERNEL);
50 45 if (buf) {
51   - char *path = d_path(&vma->vm_file->f_path,
  46 + char *path = d_path(&mm->exe_file->f_path,
52 47 buf, PAGE_SIZE);
53 48 if (!IS_ERR(path)) {
54 49 sim_notify_exec(path);
55 50  
56 51  
... ... @@ -106,15 +101,15 @@
106 101 unsigned long vdso_base;
107 102 int retval = 0;
108 103  
  104 + down_write(&mm->mmap_sem);
  105 +
109 106 /*
110 107 * Notify the simulator that an exec just occurred.
111 108 * If we can't find the filename of the mapping, just use
112 109 * whatever was passed as the linux_binprm filename.
113 110 */
114   - if (!notify_exec())
  111 + if (!notify_exec(mm))
115 112 sim_notify_exec(bprm->filename);
116   -
117   - down_write(&mm->mmap_sem);
118 113  
119 114 /*
120 115 * MAYWRITE to allow gdb to COW and set breakpoints
drivers/oprofile/buffer_sync.c
... ... @@ -216,7 +216,7 @@
216 216 }
217 217  
218 218  
219   -/* Look up the dcookie for the task's first VM_EXECUTABLE mapping,
  219 +/* Look up the dcookie for the task's mm->exe_file,
220 220 * which corresponds loosely to "application name". This is
221 221 * not strictly necessary but allows oprofile to associate
222 222 * shared-library samples with particular applications
223 223  
224 224  
... ... @@ -224,21 +224,10 @@
224 224 static unsigned long get_exec_dcookie(struct mm_struct *mm)
225 225 {
226 226 unsigned long cookie = NO_COOKIE;
227   - struct vm_area_struct *vma;
228 227  
229   - if (!mm)
230   - goto out;
  228 + if (mm && mm->exe_file)
  229 + cookie = fast_get_dcookie(&mm->exe_file->f_path);
231 230  
232   - for (vma = mm->mmap; vma; vma = vma->vm_next) {
233   - if (!vma->vm_file)
234   - continue;
235   - if (!(vma->vm_flags & VM_EXECUTABLE))
236   - continue;
237   - cookie = fast_get_dcookie(&vma->vm_file->f_path);
238   - break;
239   - }
240   -
241   -out:
242 231 return cookie;
243 232 }
244 233  
... ... @@ -1151,7 +1151,6 @@
1151 1151 const struct cred *cred;
1152 1152 char name[sizeof(tsk->comm)];
1153 1153 struct mm_struct *mm = tsk->mm;
1154   - struct vm_area_struct *vma;
1155 1154 char *tty;
1156 1155  
1157 1156 if (!ab)
... ... @@ -1191,16 +1190,8 @@
1191 1190  
1192 1191 if (mm) {
1193 1192 down_read(&mm->mmap_sem);
1194   - vma = mm->mmap;
1195   - while (vma) {
1196   - if ((vma->vm_flags & VM_EXECUTABLE) &&
1197   - vma->vm_file) {
1198   - audit_log_d_path(ab, " exe=",
1199   - &vma->vm_file->f_path);
1200   - break;
1201   - }
1202   - vma = vma->vm_next;
1203   - }
  1193 + if (mm->exe_file)
  1194 + audit_log_d_path(ab, " exe=", &mm->exe_file->f_path);
1204 1195 up_read(&mm->mmap_sem);
1205 1196 }
1206 1197 audit_log_task_context(ab);
... ... @@ -656,8 +656,7 @@
656 656 {
657 657 struct file *exe_file;
658 658  
659   - /* We need mmap_sem to protect against races with removal of
660   - * VM_EXECUTABLE vmas */
  659 + /* We need mmap_sem to protect against races with removal of exe_file */
661 660 down_read(&mm->mmap_sem);
662 661 exe_file = mm->exe_file;
663 662 if (exe_file)
security/tomoyo/util.c
... ... @@ -949,18 +949,13 @@
949 949 const char *tomoyo_get_exe(void)
950 950 {
951 951 struct mm_struct *mm = current->mm;
952   - struct vm_area_struct *vma;
953 952 const char *cp = NULL;
954 953  
955 954 if (!mm)
956 955 return NULL;
957 956 down_read(&mm->mmap_sem);
958   - for (vma = mm->mmap; vma; vma = vma->vm_next) {
959   - if ((vma->vm_flags & VM_EXECUTABLE) && vma->vm_file) {
960   - cp = tomoyo_realpath_from_path(&vma->vm_file->f_path);
961   - break;
962   - }
963   - }
  957 + if (mm->exe_file)
  958 + cp = tomoyo_realpath_from_path(&mm->exe_file->f_path);
964 959 up_read(&mm->mmap_sem);
965 960 return cp;
966 961 }