Skip to content

Commit

Permalink
mm: use mm->exe_file instead of first VM_EXECUTABLE vma->vm_file
Browse files Browse the repository at this point in the history
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 <[email protected]>
Acked-by: Chris Metcalf <[email protected]>			[arch/tile]
Acked-by: Tetsuo Handa <[email protected]>	[tomoyo]
Cc: Alexander Viro <[email protected]>
Cc: Carsten Otte <[email protected]>
Cc: Cyrill Gorcunov <[email protected]>
Cc: Eric Paris <[email protected]>
Cc: H. Peter Anvin <[email protected]>
Cc: Hugh Dickins <[email protected]>
Cc: Ingo Molnar <[email protected]>
Acked-by: James Morris <[email protected]>
Cc: Jason Baron <[email protected]>
Cc: Kentaro Takeda <[email protected]>
Cc: Matt Helsley <[email protected]>
Cc: Nick Piggin <[email protected]>
Cc: Oleg Nesterov <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Robert Richter <[email protected]>
Cc: Suresh Siddha <[email protected]>
Cc: Venkatesh Pallipadi <[email protected]>
Acked-by: Linus Torvalds <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
koct9i authored and torvalds committed Oct 9, 2012
1 parent 0b173bc commit 2dd8ad8
Show file tree
Hide file tree
Showing 6 changed files with 19 additions and 57 deletions.
15 changes: 4 additions & 11 deletions arch/powerpc/oprofile/cell/spu_task_sync.c
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ static inline unsigned long fast_get_dcookie(struct path *path)
return cookie;
}

/* Look up the dcookie for the task's first VM_EXECUTABLE mapping,
/* Look up the dcookie for the task's mm->exe_file,
* which corresponds loosely to "application name". Also, determine
* the offset for the SPU ELF object. If computed offset is
* non-zero, it implies an embedded SPU object; otherwise, it's a
Expand All @@ -321,7 +321,6 @@ get_exec_dcookie_and_offset(struct spu *spu, unsigned int *offsetp,
{
unsigned long app_cookie = 0;
unsigned int my_offset = 0;
struct file *app = NULL;
struct vm_area_struct *vma;
struct mm_struct *mm = spu->mm;

Expand All @@ -330,16 +329,10 @@ get_exec_dcookie_and_offset(struct spu *spu, unsigned int *offsetp,

down_read(&mm->mmap_sem);

for (vma = mm->mmap; vma; vma = vma->vm_next) {
if (!vma->vm_file)
continue;
if (!(vma->vm_flags & VM_EXECUTABLE))
continue;
app_cookie = fast_get_dcookie(&vma->vm_file->f_path);
if (mm->exe_file) {
app_cookie = fast_get_dcookie(&mm->exe_file->f_path);
pr_debug("got dcookie for %s\n",
vma->vm_file->f_dentry->d_name.name);
app = vma->vm_file;
break;
mm->exe_file->f_dentry->d_name.name);
}

for (vma = mm->mmap; vma; vma = vma->vm_next) {
Expand Down
19 changes: 7 additions & 12 deletions arch/tile/mm/elf.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,14 @@ static void sim_notify_exec(const char *binary_name)
} while (c);
}

static int notify_exec(void)
static int notify_exec(struct mm_struct *mm)
{
int retval = 0; /* failure */
struct vm_area_struct *vma = current->mm->mmap;
while (vma) {
if ((vma->vm_flags & VM_EXECUTABLE) && vma->vm_file)
break;
vma = vma->vm_next;
}
if (vma) {

if (mm->exe_file) {
char *buf = (char *) __get_free_page(GFP_KERNEL);
if (buf) {
char *path = d_path(&vma->vm_file->f_path,
char *path = d_path(&mm->exe_file->f_path,
buf, PAGE_SIZE);
if (!IS_ERR(path)) {
sim_notify_exec(path);
Expand Down Expand Up @@ -106,16 +101,16 @@ int arch_setup_additional_pages(struct linux_binprm *bprm,
unsigned long vdso_base;
int retval = 0;

down_write(&mm->mmap_sem);

/*
* Notify the simulator that an exec just occurred.
* If we can't find the filename of the mapping, just use
* whatever was passed as the linux_binprm filename.
*/
if (!notify_exec())
if (!notify_exec(mm))
sim_notify_exec(bprm->filename);

down_write(&mm->mmap_sem);

/*
* MAYWRITE to allow gdb to COW and set breakpoints
*/
Expand Down
17 changes: 3 additions & 14 deletions drivers/oprofile/buffer_sync.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,29 +216,18 @@ static inline unsigned long fast_get_dcookie(struct path *path)
}


/* Look up the dcookie for the task's first VM_EXECUTABLE mapping,
/* Look up the dcookie for the task's mm->exe_file,
* which corresponds loosely to "application name". This is
* not strictly necessary but allows oprofile to associate
* shared-library samples with particular applications
*/
static unsigned long get_exec_dcookie(struct mm_struct *mm)
{
unsigned long cookie = NO_COOKIE;
struct vm_area_struct *vma;

if (!mm)
goto out;

for (vma = mm->mmap; vma; vma = vma->vm_next) {
if (!vma->vm_file)
continue;
if (!(vma->vm_flags & VM_EXECUTABLE))
continue;
cookie = fast_get_dcookie(&vma->vm_file->f_path);
break;
}
if (mm && mm->exe_file)
cookie = fast_get_dcookie(&mm->exe_file->f_path);

out:
return cookie;
}

Expand Down
13 changes: 2 additions & 11 deletions kernel/auditsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1151,7 +1151,6 @@ void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk)
const struct cred *cred;
char name[sizeof(tsk->comm)];
struct mm_struct *mm = tsk->mm;
struct vm_area_struct *vma;
char *tty;

if (!ab)
Expand Down Expand Up @@ -1191,16 +1190,8 @@ void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk)

if (mm) {
down_read(&mm->mmap_sem);
vma = mm->mmap;
while (vma) {
if ((vma->vm_flags & VM_EXECUTABLE) &&
vma->vm_file) {
audit_log_d_path(ab, " exe=",
&vma->vm_file->f_path);
break;
}
vma = vma->vm_next;
}
if (mm->exe_file)
audit_log_d_path(ab, " exe=", &mm->exe_file->f_path);
up_read(&mm->mmap_sem);
}
audit_log_task_context(ab);
Expand Down
3 changes: 1 addition & 2 deletions kernel/fork.c
Original file line number Diff line number Diff line change
Expand Up @@ -656,8 +656,7 @@ struct file *get_mm_exe_file(struct mm_struct *mm)
{
struct file *exe_file;

/* We need mmap_sem to protect against races with removal of
* VM_EXECUTABLE vmas */
/* We need mmap_sem to protect against races with removal of exe_file */
down_read(&mm->mmap_sem);
exe_file = mm->exe_file;
if (exe_file)
Expand Down
9 changes: 2 additions & 7 deletions security/tomoyo/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -949,18 +949,13 @@ bool tomoyo_path_matches_pattern(const struct tomoyo_path_info *filename,
const char *tomoyo_get_exe(void)
{
struct mm_struct *mm = current->mm;
struct vm_area_struct *vma;
const char *cp = NULL;

if (!mm)
return NULL;
down_read(&mm->mmap_sem);
for (vma = mm->mmap; vma; vma = vma->vm_next) {
if ((vma->vm_flags & VM_EXECUTABLE) && vma->vm_file) {
cp = tomoyo_realpath_from_path(&vma->vm_file->f_path);
break;
}
}
if (mm->exe_file)
cp = tomoyo_realpath_from_path(&mm->exe_file->f_path);
up_read(&mm->mmap_sem);
return cp;
}
Expand Down

0 comments on commit 2dd8ad8

Please sign in to comment.