selinux: fix potential memleak in selinux_add_opt()
authorBernard Zhao <bernard@vivo.com>
Fri, 10 Dec 2021 12:03:58 +0000 (04:03 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 27 Jan 2022 10:03:43 +0000 (11:03 +0100)
[ Upstream commit 2e08df3c7c4e4e74e3dd5104c100f0bf6288aaa8 ]

This patch try to fix potential memleak in error branch.

Fixes: ba6418623385 ("selinux: new helper - selinux_add_opt()")
Signed-off-by: Bernard Zhao <bernard@vivo.com>
[PM: tweak the subject line, add Fixes tag]
Signed-off-by: Paul Moore <paul@paul-moore.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
security/selinux/hooks.c

index 9309e62..baa12d1 100644 (file)
@@ -987,18 +987,22 @@ out:
 static int selinux_add_opt(int token, const char *s, void **mnt_opts)
 {
        struct selinux_mnt_opts *opts = *mnt_opts;
+       bool is_alloc_opts = false;
 
        if (token == Opt_seclabel)      /* eaten and completely ignored */
                return 0;
 
+       if (!s)
+               return -ENOMEM;
+
        if (!opts) {
                opts = kzalloc(sizeof(struct selinux_mnt_opts), GFP_KERNEL);
                if (!opts)
                        return -ENOMEM;
                *mnt_opts = opts;
+               is_alloc_opts = true;
        }
-       if (!s)
-               return -ENOMEM;
+
        switch (token) {
        case Opt_context:
                if (opts->context || opts->defcontext)
@@ -1023,6 +1027,10 @@ static int selinux_add_opt(int token, const char *s, void **mnt_opts)
        }
        return 0;
 Einval:
+       if (is_alloc_opts) {
+               kfree(opts);
+               *mnt_opts = NULL;
+       }
        pr_warn(SEL_MOUNT_FAIL_MSG);
        return -EINVAL;
 }