Commit df279ca8 authored by Renaud Lottiaux's avatar Renaud Lottiaux Committed by Linus Torvalds

bsdacct: fix access to invalid filp in acct_on()

The file opened in acct_on and freshly stored in the ns->bacct struct can
be closed in acct_file_reopen by a concurrent call after we release
acct_lock and before we call mntput(file->f_path.mnt).

Record file->f_path.mnt in a local variable and use this variable only.
Signed-off-by: default avatarRenaud Lottiaux <renaud.lottiaux@kerlabs.com>
Signed-off-by: default avatarLouis Rilling <louis.rilling@kerlabs.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent b4f90189
...@@ -215,6 +215,7 @@ static void acct_file_reopen(struct bsd_acct_struct *acct, struct file *file, ...@@ -215,6 +215,7 @@ static void acct_file_reopen(struct bsd_acct_struct *acct, struct file *file,
static int acct_on(char *name) static int acct_on(char *name)
{ {
struct file *file; struct file *file;
struct vfsmount *mnt;
int error; int error;
struct pid_namespace *ns; struct pid_namespace *ns;
struct bsd_acct_struct *acct = NULL; struct bsd_acct_struct *acct = NULL;
...@@ -256,11 +257,12 @@ static int acct_on(char *name) ...@@ -256,11 +257,12 @@ static int acct_on(char *name)
acct = NULL; acct = NULL;
} }
mnt_pin(file->f_path.mnt); mnt = file->f_path.mnt;
mnt_pin(mnt);
acct_file_reopen(ns->bacct, file, ns); acct_file_reopen(ns->bacct, file, ns);
spin_unlock(&acct_lock); spin_unlock(&acct_lock);
mntput(file->f_path.mnt); /* it's pinned, now give up active reference */ mntput(mnt); /* it's pinned, now give up active reference */
kfree(acct); kfree(acct);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment