Message ID | 20210416095303.530-1-hbut_tan@163.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | lsm:fix a missing-check bug in smack_sb_eat_lsm_opts() | expand |
On Fri, Apr 16, 2021 at 05:53:03PM +0800, Zhongjun Tan wrote: > @@ -710,13 +711,14 @@ static int smack_sb_eat_lsm_opts(char *options, void **mnt_opts) > token = match_opt_prefix(from, len, &arg); > if (token != Opt_error) { > arg = kmemdup_nul(arg, from + len - arg, GFP_KERNEL); > + if (!arg) { > + rc = -ENOMEM; > + goto free_mnt_opts; > rc = smack_add_opt(token, arg, mnt_opts); if (arg) rc = smack_add_opt(token, arg, mnt_opts); else rc = -ENOMEM; and no other changes are needed anywhere...
On Fri, 16 Apr 2021 13:36:01 +0000 Al Viro <viro@zeniv.linux.org.uk> wrote: > On Fri, Apr 16, 2021 at 05:53:03PM +0800, Zhongjun Tan wrote: > > > @@ -710,13 +711,14 @@ static int smack_sb_eat_lsm_opts(char > > *options, void **mnt_opts) token = match_opt_prefix(from, len, > > &arg); if (token != Opt_error) { > > arg = kmemdup_nul(arg, from + len - arg, > > GFP_KERNEL); > > + if (!arg) { > > + rc = -ENOMEM; > > + goto free_mnt_opts; > > rc = smack_add_opt(token, arg, mnt_opts); > > if (arg) > rc = smack_add_opt(token, arg, > mnt_opts); else > rc = -ENOMEM; > > and no other changes are needed anywhere... update patch v3 , just four codes and no other changes are needed.
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 223a6da..0d5439f 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -696,10 +696,11 @@ static int smack_sb_eat_lsm_opts(char *options, void **mnt_opts) { char *from = options, *to = options; bool first = true; + int rc; while (1) { char *next = strchr(from, ','); - int token, len, rc; + int token, len; char *arg = NULL; if (next) @@ -710,13 +711,14 @@ static int smack_sb_eat_lsm_opts(char *options, void **mnt_opts) token = match_opt_prefix(from, len, &arg); if (token != Opt_error) { arg = kmemdup_nul(arg, from + len - arg, GFP_KERNEL); + if (!arg) { + rc = -ENOMEM; + goto free_mnt_opts; rc = smack_add_opt(token, arg, mnt_opts); + } if (unlikely(rc)) { kfree(arg); - if (*mnt_opts) - smack_free_mnt_opts(*mnt_opts); - *mnt_opts = NULL; - return rc; + goto free_mnt_opts; } } else { if (!first) { // copy with preceding comma @@ -734,6 +736,13 @@ static int smack_sb_eat_lsm_opts(char *options, void **mnt_opts) } *to = '\0'; return 0; + +free_mnt_opts: + if (*mnt_opts) { + smack_free_mnt_opts(*mnt_opts); + *mnt_opts = NULL; + } + return rc; } /**