ipc: create_ipc_ns: drop mqueue mount on sysctl setup failure

If setup_mq_sysctls(ns) fails after mq_init_ns(ns) succeeds, the error
path skipped releasing the internal kernel mqueue mount kept in
ns->mq_mnt. That leaves the vfsmount/superblock referenced until final
namespace teardown, i.e. a resource leak on this rare failure edge.

Unwind it by calling mntput(ns->mq_mnt) before dropping user_ns and
freeing the IPC namespace. This mirrors the normal ordering used in
free_ipc_ns().

Link: https://lkml.kernel.org/r/[email protected]
Signed-off-by: Vlad Kulikov <[email protected]>
Reviewed-by: Jan Kara <[email protected]>
Cc: Aleksa Sarai <[email protected]>
Cc: Christian Brauner <[email protected]>
Cc: David Hildenbrand <[email protected]>
Cc: Ma Wupeng <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
This commit is contained in:
Vlad Kulikov authored and Andrew Morton committed 2025-11-12 10:00:15 -08:00
1 parent aa5b6a72cc
commit 7229d74e5e
1 file changed
+5 -4
+5 -4
View File
@@ -75,10 +75,10 @@ static struct ipc_namespace *create_ipc_ns(struct user_namespace *user_ns,
err = -ENOMEM;
if (!setup_mq_sysctls(ns))
goto fail_put;
goto fail_mq_mount;
if (!setup_ipc_sysctls(ns))
goto fail_mq;
goto fail_mq_sysctls;
err = msg_init_ns(ns);
if (err)
@@ -92,9 +92,10 @@ static struct ipc_namespace *create_ipc_ns(struct user_namespace *user_ns,
fail_ipc:
retire_ipc_sysctls(ns);
fail_mq:
fail_mq_sysctls:
retire_mq_sysctls(ns);
fail_mq_mount:
mntput(ns->mq_mnt);
fail_put:
put_user_ns(ns->user_ns);
ns_common_free(ns);