diff options
author | Anca Jeanina FLOAREA <anca.floarea@freescale.com> | 2013-06-17 12:24:53 (GMT) |
---|---|---|
committer | Fleming Andrew-AFLEMING <AFLEMING@freescale.com> | 2013-07-05 21:37:45 (GMT) |
commit | fa729e4c7a01b346fbbc923f8c11d5cc31c1ab10 (patch) | |
tree | c047d564a8481889a5624421b3691ebfec931734 /drivers/staging | |
parent | 56caef51e40d4494986d94175434ea89b62ca564 (diff) | |
download | linux-fsl-qoriq-fa729e4c7a01b346fbbc923f8c11d5cc31c1ab10.tar.xz |
dpa_offload: Fix memory leaks for Classifier counters
For compat mode, the DPA Stats wrapper needs to allocate kernel-space
memory to store the keys provided by the user-space application. After
the driver call was successful, the memory must be released.
Signed-off-by: Anca Jeanina FLOAREA <anca.floarea@freescale.com>
Change-Id: I489a73896f50da125e331dea6e459703cbdd2e76
Reviewed-on: http://git.am.freescale.net:8181/2986
Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com>
Reviewed-by: Zanoschi Aurelian-B43522 <Aurelian.Zanoschi@freescale.com>
Reviewed-by: Chereji Marian-Cornel-R27762 <marian.chereji@freescale.com>
Reviewed-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/fsl_dpa_offload/wrp_dpa_stats.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/drivers/staging/fsl_dpa_offload/wrp_dpa_stats.c b/drivers/staging/fsl_dpa_offload/wrp_dpa_stats.c index 1c89866..4903afc 100644 --- a/drivers/staging/fsl_dpa_offload/wrp_dpa_stats.c +++ b/drivers/staging/fsl_dpa_offload/wrp_dpa_stats.c @@ -966,28 +966,33 @@ static int do_ioctl_stats_compat_create_class_counter(void *args) return ret; break; case DPA_STATS_CNT_CLASSIF_TBL: - ret = dpa_stats_tbl_cls_compatcpy(&kprm_cls->classif_tbl_params, + { + struct dpa_stats_cls_cnt_classif_tbl *tbl = + &kprm_cls->classif_tbl_params; + + ret = dpa_stats_tbl_cls_compatcpy(tbl, &uprm_cls->classif_tbl_params, kprm_cls->class_members); if (!ret) break; - for (i = 0; i < kprm_cls->class_members; i++) { - struct dpa_stats_cls_cnt_classif_tbl *tbl = - &kprm_cls->classif_tbl_params; - - if (tbl->key_type == DPA_STATS_CLASSIF_SINGLE_KEY) { + if (tbl->key_type == DPA_STATS_CLASSIF_SINGLE_KEY) { + for (i = 0; i < kprm_cls->class_members; i++) { kfree(tbl->keys[i].byte); kfree(tbl->keys[i].mask); } + kfree(tbl->keys); - if (tbl->key_type == DPA_STATS_CLASSIF_PAIR_KEY) { + } else if (tbl->key_type == DPA_STATS_CLASSIF_PAIR_KEY) { + for (i = 0; i < kprm_cls->class_members; i++) { kfree(tbl->pairs[i].first_key.byte); kfree(tbl->pairs[i].first_key.mask); kfree(tbl->pairs[i].second_key.byte); kfree(tbl->pairs[i].second_key.mask); } + kfree(tbl->pairs); } return ret; + } case DPA_STATS_CNT_CLASSIF_NODE: ret = dpa_stats_ccnode_cls_compatcpy( &kprm_cls->classif_node_params, @@ -999,6 +1004,7 @@ static int do_ioctl_stats_compat_create_class_counter(void *args) kfree(kprm_cls->classif_node_params.keys[i].byte); kfree(kprm_cls->classif_node_params.keys[i].mask); } + kfree(kprm_cls->classif_node_params.keys); return ret; case DPA_STATS_CNT_IPSEC: ret = dpa_stats_ipsec_cls_compatcpy(&kprm_cls->ipsec_params, @@ -1040,18 +1046,21 @@ static int do_ioctl_stats_compat_create_class_counter(void *args) struct dpa_stats_cls_cnt_classif_tbl *tbl = &kprm_cls->classif_tbl_params; - for (i = 0; i < kprm_cls->class_members; i++) { - if (tbl->key_type == DPA_STATS_CLASSIF_SINGLE_KEY) { + if (tbl->key_type == DPA_STATS_CLASSIF_SINGLE_KEY) { + for (i = 0; i < kprm_cls->class_members; i++) { kfree(tbl->keys[i].byte); kfree(tbl->keys[i].mask); } + kfree(tbl->keys); - if (tbl->key_type == DPA_STATS_CLASSIF_PAIR_KEY) { + } else if (tbl->key_type == DPA_STATS_CLASSIF_PAIR_KEY) { + for (i = 0; i < kprm_cls->class_members; i++) { kfree(tbl->pairs[i].first_key.byte); kfree(tbl->pairs[i].first_key.mask); kfree(tbl->pairs[i].second_key.byte); kfree(tbl->pairs[i].second_key.mask); } + kfree(tbl->pairs); } break; } @@ -1060,6 +1069,7 @@ static int do_ioctl_stats_compat_create_class_counter(void *args) kfree(kprm_cls->classif_node_params.keys[i].byte); kfree(kprm_cls->classif_node_params.keys[i].mask); } + kfree(kprm_cls->classif_node_params.keys); break; case DPA_STATS_CNT_IPSEC: kfree(kprm_cls->ipsec_params.sa_id); |