[Libvirt-cim] [PATCH] acl_parsing: Fixing potential leaks
Chip Vincent
cvincent at linux.vnet.ibm.com
Tue Aug 16 22:21:14 UTC 2011
Very nice. Thank you.
+1 and pushed.
On 08/10/2011 03:53 PM, Eduardo Lima (Etrunko) wrote:
> # HG changeset patch
> # User Eduardo Lima (Etrunko)<eblima at br.ibm.com>
> # Date 1313005735 10800
> # Node ID 2b1b79a72ab0288d649399118dffce26fd05e066
> # Parent 8759e60c17c42101118f914215d071138340c70f
> acl_parsing: Fixing potential leaks
>
> Also adds missing checks for errors in some function calls.
>
> As reported in https://bugzilla.redhat.com/show_bug.cgi?id=728245
>
> line 144 - Function cleanup_filter does not free its parameter filter (this
> causes a lot of Coverity Resource leak warnings).
> line 397 - Dynamically allocated variable rule is not freed in function
> parse_acl_filter as a result of line #399.
> line 630 - Function "malloc" without NULL check.
> line 659 - Function "malloc" without NULL check.
>
> Signed-off-by: Eduardo Lima (Etrunko)<eblima at br.ibm.com>
>
> diff --git a/libxkutil/acl_parsing.c b/libxkutil/acl_parsing.c
> --- a/libxkutil/acl_parsing.c
> +++ b/libxkutil/acl_parsing.c
> @@ -139,6 +139,7 @@
> };
>
> rule->type = UNKNOWN_RULE;
> + free(rule);
> }
>
> void cleanup_filter(struct acl_filter *filter)
> @@ -152,10 +153,8 @@
> free(filter->name);
> free(filter->chain);
>
> - for (i = 0; i< filter->rule_ct; i++) {
> + for (i = 0; i< filter->rule_ct; i++)
> cleanup_rule(filter->rules[i]);
> - free(filter->rules[i]);
> - }
>
> free(filter->rules);
> filter->rule_ct = 0;
> @@ -401,14 +400,16 @@
> if (parse_acl_rule(child, rule) == 0)
> goto err;
>
> - append_filter_rule(filter, rule);
> + if (append_filter_rule(filter, rule) == 0)
> + goto err;
> }
> else if (XSTREQ(child->name, "filterref")) {
> filter_ref = get_attr_value(child, "filter");
> if (filter_ref == NULL)
> goto err;
>
> - append_filter_ref(filter, filter_ref);
> + if (append_filter_ref(filter, filter_ref) == 0)
> + goto err;
> }
> }
>
> @@ -440,14 +441,15 @@
> if (xmldoc == NULL)
> goto err;
>
> - *filter = malloc(sizeof(**filter));
> + *filter = calloc(1, sizeof(**filter));
> if (*filter == NULL)
> goto err;
>
> - memset(*filter, 0, sizeof(**filter));
> - parse_acl_filter(xmldoc->children, *filter);
> -
> - ret = 1;
> + ret = parse_acl_filter(xmldoc->children, *filter);
> + if (ret == 0) {
> + free(*filter);
> + *filter = NULL;
> + }
>
> err:
> xmlSetGenericErrorFunc(NULL, NULL);
> @@ -508,9 +510,7 @@
> if (xml == NULL)
> return 0;
>
> - get_filter_from_xml(xml, filter);
> -
> - return 1;
> + return get_filter_from_xml(xml, filter);
> #else
> return 0;
> #endif
> @@ -534,7 +534,8 @@
>
> virConnectListNWFilters(conn, names, count);
>
> - filters = malloc(count * sizeof(struct acl_filter));
> + filters = calloc(count, sizeof(*filters));
> +
> if (filters == NULL)
> goto err;
>
> @@ -542,7 +543,8 @@
> {
> struct acl_filter *filter = NULL;
>
> - get_filter_by_name(conn, names[i],&filter);
> + if (get_filter_by_name(conn, names[i],&filter) == 0)
> + break;
>
> memcpy(&filters[i], filter, sizeof(*filter));
> }
> @@ -630,6 +632,12 @@
> filter->rules =
> malloc((filter->rule_ct + 1) * sizeof(struct acl_rule *));
>
> + if (filter->rules == NULL) {
> + CU_DEBUG("Failed to allocate memory for new rule");
> + filter->rules = old_rules;
> + return 0;
> + }
> +
> memcpy(filter->rules,
> old_rules,
> filter->rule_ct * sizeof(struct acl_rule *));
> @@ -657,6 +665,13 @@
> old_refs = filter->refs;
>
> filter->refs = malloc((filter->ref_ct + 1) * sizeof(char *));
> +
> + if (filter->refs == NULL) {
> + CU_DEBUG("Failed to allocate memory for new ref");
> + filter->refs = old_refs;
> + return 0;
> + }
> +
> memcpy(filter->refs, old_refs, filter->ref_ct * sizeof(char *));
>
> filter->refs[filter->ref_ct] = name;
> @@ -682,8 +697,9 @@
> if (STREQC(old_refs[i], name)) {
> free(old_refs[i]);
> }
> - else
> - append_filter_ref(filter, old_refs[i]);
> + else if(append_filter_ref(filter, old_refs[i]) == 0) {
> + return 0;
> + }
> }
>
> return 1;
>
> _______________________________________________
> Libvirt-cim mailing list
> Libvirt-cim at redhat.com
> https://www.redhat.com/mailman/listinfo/libvirt-cim
--
Chip Vincent
Open Virtualization
IBM Linux Technology Center
cvincent at linux.vnet.ibm.com
More information about the Libvirt-cim
mailing list