[Libguestfs] [PATCH 2/2] gobject: Turn FBuffer into a GByteArray *

Richard W.M. Jones rjones at redhat.com
Fri Jan 20 18:02:51 UTC 2012


On Fri, Jan 20, 2012 at 05:58:38PM +0000, Matthew Booth wrote:
> This change is intended to improve language bindings by turning <field> and
> <field>_size in a struct into a single array object. I had wanted to just turn
> it into a GByteArray embedded in the struct, but this caused gjs to segfault.
> The docs suggest a GByteArray should be allocated with g_byte_array_new(), so I
> did that and it worked fine. I guess something somewhere assumes it's an
> allocated object.
> 
> Incidentally, the perl bindings segfault attempting to access the array either
> way. At this stage I suspect the perl bindings rather than my code. Valgrind
> shows nothing untoward happening before the crash, and the memory when inspected
> with gdb contains exactly what is expected.
> ---
>  generator/generator_gobject.ml |    8 ++++----
>  1 files changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/generator/generator_gobject.ml b/generator/generator_gobject.ml
> index 2b151c6..4779f23 100644
> --- a/generator/generator_gobject.ml
> +++ b/generator/generator_gobject.ml
> @@ -204,8 +204,7 @@ let generate_gobject_header_structs () =
>          | n, FString ->
>            pr "  gchar *%s;\n" n
>          | n, FBuffer ->
> -          pr "  guint8 *%s;\n" n;
> -          pr "  guint32 %s_size;\n" n
> +          pr "  GByteArray *%s;\n" n
>          | n, FUUID ->
>            pr "  /* The next field is NOT nul-terminated, be careful when printing it: */\n";
>            pr "  gchar %s[32];\n" n
> @@ -811,9 +810,10 @@ let generate_gobject_c_methods () =
>                indent src n dst n src n
>            | n, FBuffer ->
>              pr "%sif (%s%s) {\n" indent src n;
> -            pr "%s  memcpy(%s%s, %s%s, %s%s_len);\n"
> +            pr "%s  %s%s = g_byte_array_sized_new(%s%s_len);\n"
> +              indent dst n src n;
> +            pr "%s  g_byte_array_append(%s%s, %s%s, %s%s_len);\n"
>                indent dst n src n src n;
> -            pr "%s  %s%s_size = %s%s_len;\n" indent dst n src n;
>              pr "%s}\n" indent
>          ) (cols_of_struct typ)
>        in
> -- 
> 1.7.7.5

ACK.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine.  Supports Linux and Windows.
http://et.redhat.com/~rjones/virt-df/




More information about the Libguestfs mailing list