[PATCH -next] selinux: Fix potential memory leak in selinux_add_opt

From: Xiu Jianfeng
Date: Sat Jun 11 2022 - 05:07:57 EST


In the entry of selinux_add_opt, *mnt_opts may be assigned to new
allocated memory, and also may be freed and reset at the end of the
function. however, if security_context_str_to_sid failed, it returns
directly and skips the procedure for free and reset, even if it may be
handled at the caller of this function, It is better to handle it
inside.

Fixes: 70f4169ab421 ("selinux: parse contexts for mount options early")
Signed-off-by: Xiu Jianfeng <xiujianfeng@xxxxxxxxxx>
---
security/selinux/hooks.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index 4af4986d3893..3d67c1dab2c6 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -949,7 +949,7 @@ 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;
u32 *dst_sid;
- int rc;
+ int rc = -EINVAL;

if (token == Opt_seclabel)
/* eaten and completely ignored */
@@ -993,13 +993,15 @@ static int selinux_add_opt(int token, const char *s, void **mnt_opts)
break;
default:
WARN_ON(1);
- return -EINVAL;
+ goto err;
}
rc = security_context_str_to_sid(&selinux_state, s, dst_sid, GFP_KERNEL);
- if (rc)
+ if (rc) {
pr_warn("SELinux: security_context_str_to_sid (%s) failed with errno=%d\n",
s, rc);
- return rc;
+ goto err;
+ }
+ return 0;

err:
if (is_alloc_opts) {
@@ -1007,7 +1009,7 @@ static int selinux_add_opt(int token, const char *s, void **mnt_opts)
*mnt_opts = NULL;
}
pr_warn(SEL_MOUNT_FAIL_MSG);
- return -EINVAL;
+ return rc;
}

static int show_sid(struct seq_file *m, u32 sid)
--
2.17.1