[Libguestfs] minor Hivex.xs leaks

Richard W.M. Jones rjones at redhat.com
Tue Jun 28 22:38:54 UTC 2011


On Tue, Jun 28, 2011 at 09:03:52PM +0200, Jim Meyering wrote:
> Hi Rich,
> 
> While I was looking at hivex today I ran coverity on it.
> It spotted one problem but missed a similar one nearby.
> 
> The following are from Hivex.xs: (generated by generator.ml)
> 
> void
> node_set_values (h, node, values)
>       hive_h *h;
>       int node;
>       pl_set_values values = unpack_pl_set_values (ST(2));
> PREINIT:
>       int r;
>  PPCODE:
>       r = hivex_node_set_values (h, node, values.nr_values, values.values, 0);
>       free (values.values);
>       if (r == -1)
>         croak ("%s: %s", "node_set_values", strerror (errno));
> 
> void
> node_set_value (h, node, val)
>       hive_h *h;
>       int node;
>       hive_set_value *val = unpack_set_value (ST(2));
> PREINIT:
>       int r;
>  PPCODE:
>       r = hivex_node_set_value (h, node, val, 0);
>       free (val);
>       if (r == -1)
>         croak ("%s: %s", "node_set_value", strerror (errno));
> 
> --------------------------------------------
> Here's the generated C.
> Note how each function uses XSRETURN_UNDEF
> without freeing the "values" or "val" data they
> have just allocated:
> 
> XS(XS_Win__Hivex_node_set_values); /* prototype to pass -Wmissing-prototypes */
> XS(XS_Win__Hivex_node_set_values)
> {
> #ifdef dVAR
>     dVAR; dXSARGS;
> #else
>     dXSARGS;
> #endif
>     if (items != 3)
>        croak_xs_usage(cv,  "h, node, values");
>     PERL_UNUSED_VAR(ax); /* -Wall */
>     SP -= items;
>     {
> 	hive_h *	h;
> 	int	node = (int)SvIV(ST(1));
> 	pl_set_values	values = unpack_pl_set_values (ST(2));
> #line 477 "Hivex.xs"
>       int r;
> #line 993 "Hivex.c"
> 
>     if (sv_isobject (ST(0)) && SvTYPE (SvRV (ST(0))) == SVt_PVMG)
>         h = (hive_h *) SvIV ((SV *) SvRV (ST(0)));
>     else {
>         warn ("Win::Hivex::node_set_values(): h is not a blessed SV reference");
>         XSRETURN_UNDEF;
>     };
> #line 479 "Hivex.xs"
>       r = hivex_node_set_values (h, node, values.nr_values, values.values, 0);
>       free (values.values);
>       if (r == -1)
>         croak ("%s: %s", "node_set_values", strerror (errno));
> #line 1006 "Hivex.c"
> 	PUTBACK;
> 	return;
>     }
> }
> 
> 
> XS(XS_Win__Hivex_node_set_value); /* prototype to pass -Wmissing-prototypes */
> XS(XS_Win__Hivex_node_set_value)
> {
> #ifdef dVAR
>     dVAR; dXSARGS;
> #else
>     dXSARGS;
> #endif
>     if (items != 3)
>        croak_xs_usage(cv,  "h, node, val");
>     PERL_UNUSED_VAR(ax); /* -Wall */
>     SP -= items;
>     {
> 	hive_h *	h;
> 	int	node = (int)SvIV(ST(1));
> 	hive_set_value *	val = unpack_set_value (ST(2));
> #line 490 "Hivex.xs"
>       int r;
> #line 1031 "Hivex.c"
> 
>     if (sv_isobject (ST(0)) && SvTYPE (SvRV (ST(0))) == SVt_PVMG)
>         h = (hive_h *) SvIV ((SV *) SvRV (ST(0)));
>     else {
>         warn ("Win::Hivex::node_set_value(): h is not a blessed SV reference");
>         XSRETURN_UNDEF;
>     };
> #line 492 "Hivex.xs"
>       r = hivex_node_set_value (h, node, val, 0);
>       free (val);
>       if (r == -1)
>         croak ("%s: %s", "node_set_value", strerror (errno));
> #line 1044 "Hivex.c"
> 	PUTBACK;
> 	return;
>     }
> }
> --------------------------------------------
> 
> One way to fix it is to change generator.ml to induce this
> change in Hivex.xs:
> 
> --- Hivex.xs.~1~	2011-06-28 21:01:28.374623171 +0200
> +++ Hivex.xs	2011-06-28 21:01:43.351623367 +0200
> @@ -472,10 +472,10 @@ void
>  node_set_values (h, node, values)
>        hive_h *h;
>        int node;
> -      pl_set_values values = unpack_pl_set_values (ST(2));
>  PREINIT:
>        int r;
>   PPCODE:
> +      pl_set_values values = unpack_pl_set_values (ST(2));
>        r = hivex_node_set_values (h, node, values.nr_values, values.values, 0);
>        free (values.values);
>        if (r == -1)
> @@ -485,10 +485,10 @@ void
>  node_set_value (h, node, val)
>        hive_h *h;
>        int node;
> -      hive_set_value *val = unpack_set_value (ST(2));
>  PREINIT:
>        int r;
>   PPCODE:
> +      hive_set_value *val = unpack_set_value (ST(2));
>        r = hivex_node_set_value (h, node, val, 0);
>        free (val);
>        if (r == -1)

Tricky change to the generator.  I'll have to think about this a bit
more tomorrow ...

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
virt-top is 'top' for virtual machines.  Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://et.redhat.com/~rjones/virt-top




More information about the Libguestfs mailing list