mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-30 02:21:15 +00:00
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: Renaud Lottiaux <renaud.lottiaux@kerlabs.com> Signed-off-by: Louis Rilling <louis.rilling@kerlabs.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
b4f90189dc
commit
df279ca896
1 changed files with 4 additions and 2 deletions
|
@ -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)
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue