summaryrefslogtreecommitdiff
path: root/drivers/staging/fsl_dpa_offload
diff options
context:
space:
mode:
authorAnca Jeanina FLOAREA <anca.floarea@freescale.com>2013-06-17 12:24:53 (GMT)
committerFleming Andrew-AFLEMING <AFLEMING@freescale.com>2013-07-05 21:37:45 (GMT)
commitfa729e4c7a01b346fbbc923f8c11d5cc31c1ab10 (patch)
treec047d564a8481889a5624421b3691ebfec931734 /drivers/staging/fsl_dpa_offload
parent56caef51e40d4494986d94175434ea89b62ca564 (diff)
downloadlinux-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/fsl_dpa_offload')
-rw-r--r--drivers/staging/fsl_dpa_offload/wrp_dpa_stats.c30
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);