From: Matthias Bolte Date: Wed, 27 Jul 2011 18:32:25 +0000 (+0200) Subject: rpc: Fix memory leak in remoteDomainSet*Parameters functions X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=8d2319cb9038bbb71dcb8079439bd5e506995e52;p=libvirt.git rpc: Fix memory leak in remoteDomainSet*Parameters functions Add a new helper remoteFreeTypedParameters and teach the generator to add it to the cleanup section. https://bugzilla.redhat.com/show_bug.cgi?id=725322 --- diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 0652e0ddbe..e5bfa4b1ab 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -1208,6 +1208,22 @@ done: return rv; } +/* Helper to free typed parameters. */ +static void +remoteFreeTypedParameters(remote_typed_param *args_params_val, + u_int args_params_len) +{ + u_int i; + + if (args_params_val == NULL) + return; + + for (i = 0; i < args_params_len; i++) + VIR_FREE(args_params_val[i].field); + + VIR_FREE(args_params_val); +} + /* Helper to serialize typed parameters. */ static int remoteSerializeTypedParameters(virTypedParameterPtr params, @@ -1264,11 +1280,7 @@ remoteSerializeTypedParameters(virTypedParameterPtr params, rv = 0; cleanup: - if (val) { - for (i = 0; i < nparams; i++) - VIR_FREE(val[i].field); - VIR_FREE(val); - } + remoteFreeTypedParameters(val, nparams); return rv; } diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl index ceeb1f548b..0d344e83f1 100755 --- a/src/rpc/gendispatch.pl +++ b/src/rpc/gendispatch.pl @@ -979,6 +979,7 @@ elsif ($opt_k) { my @args_check_list = (); my @setters_list = (); my @setters_list2 = (); + my @free_list = (); my $priv_src = "conn"; my $priv_name = "privateData"; my $call_args = "&args"; @@ -1105,6 +1106,7 @@ elsif ($opt_k) { " xdr_free((xdrproc_t)xdr_$call->{args}, (char *)&args);\n" . " goto done;\n" . " }"); + push(@free_list, " remoteFreeTypedParameters(args.params.params_val, args.params.params_len);\n"); } elsif ($args_member =~ m/^((?:unsigned )?int) (\S+);\s*\/\*\s*call-by-reference\s*\*\//) { my $type_name = "$1 *"; my $arg_name = $2; @@ -1500,6 +1502,9 @@ elsif ($opt_k) { print "\n"; print "done:\n"; + + print join("\n", @free_list); + print " remoteDriverUnlock(priv);\n"; print " return rv;\n"; print "}\n";