mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 01:49:46 +00:00
statmount: don't call path_put() under namespace semaphore
[ Upstream commite8c84e2082] Massage statmount() and make sure we don't call path_put() under the namespace semaphore. If we put the last reference we're fscked. Fixes:46eae99ef7("add statmount(2) syscall") Cc: stable@vger.kernel.org # v6.8+ Signed-off-by: Christian Brauner <brauner@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
32c258aad4
commit
fa1974fad4
@@ -5200,7 +5200,6 @@ static int grab_requested_root(struct mnt_namespace *ns, struct path *root)
|
||||
static int do_statmount(struct kstatmount *s, u64 mnt_id, u64 mnt_ns_id,
|
||||
struct mnt_namespace *ns)
|
||||
{
|
||||
struct path root __free(path_put) = {};
|
||||
struct mount *m;
|
||||
int err;
|
||||
|
||||
@@ -5212,7 +5211,7 @@ static int do_statmount(struct kstatmount *s, u64 mnt_id, u64 mnt_ns_id,
|
||||
if (!s->mnt)
|
||||
return -ENOENT;
|
||||
|
||||
err = grab_requested_root(ns, &root);
|
||||
err = grab_requested_root(ns, &s->root);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -5221,15 +5220,13 @@ static int do_statmount(struct kstatmount *s, u64 mnt_id, u64 mnt_ns_id,
|
||||
* mounts to show users.
|
||||
*/
|
||||
m = real_mount(s->mnt);
|
||||
if (!is_path_reachable(m, m->mnt.mnt_root, &root) &&
|
||||
if (!is_path_reachable(m, m->mnt.mnt_root, &s->root) &&
|
||||
!ns_capable_noaudit(ns->user_ns, CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
err = security_sb_statfs(s->mnt->mnt_root);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
s->root = root;
|
||||
if (s->mask & STATMOUNT_SB_BASIC)
|
||||
statmount_sb_basic(s);
|
||||
|
||||
@@ -5406,6 +5403,7 @@ retry:
|
||||
if (!ret)
|
||||
ret = copy_statmount_to_user(ks);
|
||||
kvfree(ks->seq.buf);
|
||||
path_put(&ks->root);
|
||||
if (retry_statmount(ret, &seq_size))
|
||||
goto retry;
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user