Fix f_flags/f_mode in case of lookup_instantiate_filp() from open(pathname, 3)
Just set f_flags when shoving struct file into nameidata; don't postpone that until __dentry_open(). do_filp_open() has correct value; lookup_instantiate_filp() doesn't - we lose the difference between O_RDWR and 3 by that point. We still set .intent.open.flags, so no fs code needs to be changed. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -1640,6 +1640,7 @@ struct file *do_filp_open(int dfd, const char *pathname,
|
||||
if (filp == NULL)
|
||||
return ERR_PTR(-ENFILE);
|
||||
nd.intent.open.file = filp;
|
||||
filp->f_flags = open_flag;
|
||||
nd.intent.open.flags = flag;
|
||||
nd.intent.open.create_mode = 0;
|
||||
error = do_path_lookup(dfd, pathname,
|
||||
@@ -1685,6 +1686,7 @@ struct file *do_filp_open(int dfd, const char *pathname,
|
||||
if (filp == NULL)
|
||||
goto exit_parent;
|
||||
nd.intent.open.file = filp;
|
||||
filp->f_flags = open_flag;
|
||||
nd.intent.open.flags = flag;
|
||||
nd.intent.open.create_mode = mode;
|
||||
dir = nd.path.dentry;
|
||||
@@ -1725,7 +1727,7 @@ do_last:
|
||||
mnt_drop_write(nd.path.mnt);
|
||||
goto exit;
|
||||
}
|
||||
filp = nameidata_to_filp(&nd, open_flag);
|
||||
filp = nameidata_to_filp(&nd);
|
||||
mnt_drop_write(nd.path.mnt);
|
||||
if (nd.root.mnt)
|
||||
path_put(&nd.root);
|
||||
@@ -1789,7 +1791,7 @@ ok:
|
||||
mnt_drop_write(nd.path.mnt);
|
||||
goto exit;
|
||||
}
|
||||
filp = nameidata_to_filp(&nd, open_flag);
|
||||
filp = nameidata_to_filp(&nd);
|
||||
if (!IS_ERR(filp)) {
|
||||
error = ima_path_check(&filp->f_path, filp->f_mode &
|
||||
(MAY_READ | MAY_WRITE | MAY_EXEC));
|
||||
|
Reference in New Issue
Block a user