diff options
author | Gen Zhang <blackgod016574@gmail.com> | 2019-06-12 16:28:21 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-06-19 09:00:01 +0300 |
commit | ea9a004020c96178f1307019c689d5f588414850 (patch) | |
tree | a4370c8f720d9c4bf24b6dc51ec564195c89d49e /security | |
parent | bc690120360b8e56a056dc031b2d29f713910686 (diff) | |
download | linux-ea9a004020c96178f1307019c689d5f588414850.tar.xz |
selinux: fix a missing-check bug in selinux_add_mnt_opt( )
commit e2e0e09758a6f7597de0f9b819647addfb71b6bd upstream.
In selinux_add_mnt_opt(), 'val' is allocated by kmemdup_nul(). It returns
NULL when fails. So 'val' should be checked. And 'mnt_opts' should be
freed when error.
Signed-off-by: Gen Zhang <blackgod016574@gmail.com>
Fixes: 757cbe597fe8 ("LSM: new method: ->sb_add_mnt_opt()")
Cc: <stable@vger.kernel.org>
[PM: fixed some indenting problems]
Signed-off-by: Paul Moore <paul@paul-moore.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'security')
-rw-r--r-- | security/selinux/hooks.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 28bff30c2f15..d5feb2a0125d 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -1048,15 +1048,24 @@ static int selinux_add_mnt_opt(const char *option, const char *val, int len, if (token == Opt_error) return -EINVAL; - if (token != Opt_seclabel) + if (token != Opt_seclabel) { val = kmemdup_nul(val, len, GFP_KERNEL); + if (!val) { + rc = -ENOMEM; + goto free_opt; + } + } rc = selinux_add_opt(token, val, mnt_opts); if (unlikely(rc)) { kfree(val); - if (*mnt_opts) { - selinux_free_mnt_opts(*mnt_opts); - *mnt_opts = NULL; - } + goto free_opt; + } + return rc; + +free_opt: + if (*mnt_opts) { + selinux_free_mnt_opts(*mnt_opts); + *mnt_opts = NULL; } return rc; } |