Commit ef54ccb6 authored by Xiu Jianfeng's avatar Xiu Jianfeng Committed by Paul Moore

selinux: selinux_add_opt() callers free memory

The selinux_add_opt() function may need to allocate memory for the
mount options if none has already been allocated, but there is no
need to free that memory on error as the callers handle that.  Drop
the existing kfree() on error to help increase consistency in the
selinux_add_opt() error handling.

This patch also changes selinux_add_opt() to return -EINVAL when
the mount option value, @s, is NULL.  It currently return -ENOMEM.

Link: https://lore.kernel.org/lkml/20220611090550.135674-1-xiujianfeng@huawei.com/T/Suggested-by: default avatarPaul Moore <paul@paul-moore.com>
Signed-off-by: default avatarXiu Jianfeng <xiujianfeng@huawei.com>
[PM: fix subject, rework commit description language]
Signed-off-by: default avatarPaul Moore <paul@paul-moore.com>
parent 15ec76fb
...@@ -944,10 +944,12 @@ static int selinux_sb_clone_mnt_opts(const struct super_block *oldsb, ...@@ -944,10 +944,12 @@ static int selinux_sb_clone_mnt_opts(const struct super_block *oldsb,
return rc; return rc;
} }
/*
* NOTE: the caller is resposible for freeing the memory even if on error.
*/
static int selinux_add_opt(int token, const char *s, void **mnt_opts) static int selinux_add_opt(int token, const char *s, void **mnt_opts)
{ {
struct selinux_mnt_opts *opts = *mnt_opts; struct selinux_mnt_opts *opts = *mnt_opts;
bool is_alloc_opts = false;
u32 *dst_sid; u32 *dst_sid;
int rc; int rc;
...@@ -955,7 +957,7 @@ static int selinux_add_opt(int token, const char *s, void **mnt_opts) ...@@ -955,7 +957,7 @@ static int selinux_add_opt(int token, const char *s, void **mnt_opts)
/* eaten and completely ignored */ /* eaten and completely ignored */
return 0; return 0;
if (!s) if (!s)
return -ENOMEM; return -EINVAL;
if (!selinux_initialized(&selinux_state)) { if (!selinux_initialized(&selinux_state)) {
pr_warn("SELinux: Unable to set superblock options before the security server is initialized\n"); pr_warn("SELinux: Unable to set superblock options before the security server is initialized\n");
...@@ -967,7 +969,6 @@ static int selinux_add_opt(int token, const char *s, void **mnt_opts) ...@@ -967,7 +969,6 @@ static int selinux_add_opt(int token, const char *s, void **mnt_opts)
if (!opts) if (!opts)
return -ENOMEM; return -ENOMEM;
*mnt_opts = opts; *mnt_opts = opts;
is_alloc_opts = true;
} }
switch (token) { switch (token) {
...@@ -1002,10 +1003,6 @@ static int selinux_add_opt(int token, const char *s, void **mnt_opts) ...@@ -1002,10 +1003,6 @@ static int selinux_add_opt(int token, const char *s, void **mnt_opts)
return rc; return rc;
err: err:
if (is_alloc_opts) {
kfree(opts);
*mnt_opts = NULL;
}
pr_warn(SEL_MOUNT_FAIL_MSG); pr_warn(SEL_MOUNT_FAIL_MSG);
return -EINVAL; return -EINVAL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment