Message ID | 20220930044843.32647-1-jiasheng@iscas.ac.cn (mailing list archive) |
---|---|
State | Accepted |
Commit | 9e6fd874c7bb47b6a4295abc4c81b2f41b97e970 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: prestera: acl: Add check for kmemdup | expand |
> ---------------------------------------------------------------------- > As the kemdup could return NULL, it should be better to check the return > value and return error if fails. > Moreover, the return value of prestera_acl_ruleset_keymask_set() should > be checked by cascade. > > Fixes: 604ba230902d ("net: prestera: flower template support") > Signed-off-by: Jiasheng Jiang <jiasheng@iscas.ac.cn> > --- > drivers/net/ethernet/marvell/prestera/prestera_acl.c | 8 ++++++-- > drivers/net/ethernet/marvell/prestera/prestera_acl.h | 4 ++-- > drivers/net/ethernet/marvell/prestera/prestera_flower.c | 6 +++++- > 3 files changed, 13 insertions(+), 5 deletions(-) > > diff --git a/drivers/net/ethernet/marvell/prestera/prestera_acl.c b/drivers/net/ethernet/marvell/prestera/prestera_acl.c > index 3d4b85f2d541..f6b2933859d0 100644 > --- a/drivers/net/ethernet/marvell/prestera/prestera_acl.c > +++ b/drivers/net/ethernet/marvell/prestera/prestera_acl.c > @@ -178,10 +178,14 @@ prestera_acl_ruleset_create(struct prestera_acl *acl, > return ERR_PTR(err); > } > > -void prestera_acl_ruleset_keymask_set(struct prestera_acl_ruleset *ruleset, > - void *keymask) > +int prestera_acl_ruleset_keymask_set(struct prestera_acl_ruleset *ruleset, > + void *keymask) > { > ruleset->keymask = kmemdup(keymask, ACL_KEYMASK_SIZE, GFP_KERNEL); > + if (!ruleset->keymask) > + return -ENOMEM; > + > + return 0; > } > > int prestera_acl_ruleset_offload(struct prestera_acl_ruleset *ruleset) > diff --git a/drivers/net/ethernet/marvell/prestera/prestera_acl.h b/drivers/net/ethernet/marvell/prestera/prestera_acl.h > index 03fc5b9dc925..131bfbc87cd7 100644 > --- a/drivers/net/ethernet/marvell/prestera/prestera_acl.h > +++ b/drivers/net/ethernet/marvell/prestera/prestera_acl.h > @@ -185,8 +185,8 @@ struct prestera_acl_ruleset * > prestera_acl_ruleset_lookup(struct prestera_acl *acl, > struct prestera_flow_block *block, > u32 chain_index); > -void prestera_acl_ruleset_keymask_set(struct prestera_acl_ruleset *ruleset, > - void *keymask); > +int prestera_acl_ruleset_keymask_set(struct prestera_acl_ruleset *ruleset, > + void *keymask); > bool prestera_acl_ruleset_is_offload(struct prestera_acl_ruleset *ruleset); > int prestera_acl_ruleset_offload(struct prestera_acl_ruleset *ruleset); > void prestera_acl_ruleset_put(struct prestera_acl_ruleset *ruleset); > diff --git a/drivers/net/ethernet/marvell/prestera/prestera_flower.c b/drivers/net/ethernet/marvell/prestera/prestera_flower.c > index 19d3b55c578e..cf551a8379ac 100644 > --- a/drivers/net/ethernet/marvell/prestera/prestera_flower.c > +++ b/drivers/net/ethernet/marvell/prestera/prestera_flower.c > @@ -452,7 +452,9 @@ int prestera_flower_tmplt_create(struct prestera_flow_block *block, > } > > /* preserve keymask/template to this ruleset */ > - prestera_acl_ruleset_keymask_set(ruleset, rule.re_key.match.mask); > + err = prestera_acl_ruleset_keymask_set(ruleset, rule.re_key.match.mask); > + if (err) > + goto err_ruleset_keymask_set; > > /* skip error, as it is not possible to reject template operation, > * so, keep the reference to the ruleset for rules to be added > @@ -468,6 +470,8 @@ int prestera_flower_tmplt_create(struct prestera_flow_block *block, > list_add_rcu(&template->list, &block->template_list); > return 0; > > +err_ruleset_keymask_set: > + prestera_acl_ruleset_put(ruleset); > err_ruleset_get: > kfree(template); > err_malloc: Reviewed-by: Taras Chornyi<tchornyi@marvell.com>
Hello: This patch was applied to netdev/net.git (master) by David S. Miller <davem@davemloft.net>: On Fri, 30 Sep 2022 12:48:43 +0800 you wrote: > As the kemdup could return NULL, it should be better to check the return > value and return error if fails. > Moreover, the return value of prestera_acl_ruleset_keymask_set() should > be checked by cascade. > > Fixes: 604ba230902d ("net: prestera: flower template support") > Signed-off-by: Jiasheng Jiang <jiasheng@iscas.ac.cn> > > [...] Here is the summary with links: - net: prestera: acl: Add check for kmemdup https://git.kernel.org/netdev/net/c/9e6fd874c7bb You are awesome, thank you!
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_acl.c b/drivers/net/ethernet/marvell/prestera/prestera_acl.c index 3d4b85f2d541..f6b2933859d0 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_acl.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_acl.c @@ -178,10 +178,14 @@ prestera_acl_ruleset_create(struct prestera_acl *acl, return ERR_PTR(err); } -void prestera_acl_ruleset_keymask_set(struct prestera_acl_ruleset *ruleset, - void *keymask) +int prestera_acl_ruleset_keymask_set(struct prestera_acl_ruleset *ruleset, + void *keymask) { ruleset->keymask = kmemdup(keymask, ACL_KEYMASK_SIZE, GFP_KERNEL); + if (!ruleset->keymask) + return -ENOMEM; + + return 0; } int prestera_acl_ruleset_offload(struct prestera_acl_ruleset *ruleset) diff --git a/drivers/net/ethernet/marvell/prestera/prestera_acl.h b/drivers/net/ethernet/marvell/prestera/prestera_acl.h index 03fc5b9dc925..131bfbc87cd7 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_acl.h +++ b/drivers/net/ethernet/marvell/prestera/prestera_acl.h @@ -185,8 +185,8 @@ struct prestera_acl_ruleset * prestera_acl_ruleset_lookup(struct prestera_acl *acl, struct prestera_flow_block *block, u32 chain_index); -void prestera_acl_ruleset_keymask_set(struct prestera_acl_ruleset *ruleset, - void *keymask); +int prestera_acl_ruleset_keymask_set(struct prestera_acl_ruleset *ruleset, + void *keymask); bool prestera_acl_ruleset_is_offload(struct prestera_acl_ruleset *ruleset); int prestera_acl_ruleset_offload(struct prestera_acl_ruleset *ruleset); void prestera_acl_ruleset_put(struct prestera_acl_ruleset *ruleset); diff --git a/drivers/net/ethernet/marvell/prestera/prestera_flower.c b/drivers/net/ethernet/marvell/prestera/prestera_flower.c index 19d3b55c578e..cf551a8379ac 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_flower.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_flower.c @@ -452,7 +452,9 @@ int prestera_flower_tmplt_create(struct prestera_flow_block *block, } /* preserve keymask/template to this ruleset */ - prestera_acl_ruleset_keymask_set(ruleset, rule.re_key.match.mask); + err = prestera_acl_ruleset_keymask_set(ruleset, rule.re_key.match.mask); + if (err) + goto err_ruleset_keymask_set; /* skip error, as it is not possible to reject template operation, * so, keep the reference to the ruleset for rules to be added @@ -468,6 +470,8 @@ int prestera_flower_tmplt_create(struct prestera_flow_block *block, list_add_rcu(&template->list, &block->template_list); return 0; +err_ruleset_keymask_set: + prestera_acl_ruleset_put(ruleset); err_ruleset_get: kfree(template); err_malloc:
As the kemdup could return NULL, it should be better to check the return value and return error if fails. Moreover, the return value of prestera_acl_ruleset_keymask_set() should be checked by cascade. Fixes: 604ba230902d ("net: prestera: flower template support") Signed-off-by: Jiasheng Jiang <jiasheng@iscas.ac.cn> --- drivers/net/ethernet/marvell/prestera/prestera_acl.c | 8 ++++++-- drivers/net/ethernet/marvell/prestera/prestera_acl.h | 4 ++-- drivers/net/ethernet/marvell/prestera/prestera_flower.c | 6 +++++- 3 files changed, 13 insertions(+), 5 deletions(-)