[cairo] For libsvg-cairo, glibc-detected corrupted double-linked
list detected.
Jason Dorje Short
jdorje at users.sf.net
Mon Jul 25 18:56:49 PDT 2005
charles wrote:
> Hi:
>
> When I do some transformation before call svg_cairo_render, and error
> '*** glibc detected *** corrupted double-linked list: 0x08eea120 ***' is
> encountered. (If I no transformation is applied, this error is not
> occurred.).
Is that supposed to be caused by this test program? I don't see it.
The only errors valgrind gives are uninitialized-data ones. This error
sounds like memory corruption overwriting some glib data (an "invalid
write" in valgrind).
> My test program is very simple, so I think it might be caused by
> 'libsvg-cairo'. (Forgive me if it is my fault).
One problem I notice is that cairo_image_surface_get_width has no checks
on its input. So code like the following:
mmsr = cairo_image_surface_create_from_png("mm.png");
mmw = cairo_image_surface_get_width(mmsr);
mmh = cairo_image_surface_get_height(mmsr);
will simply crash if mm.png is not present. I guess this might be
intentional but it does make debugging harder.
Aside from this I think the problem is you never initialize (clear) the
surface. Thus pixels that aren't drawn to by any other operation end up
with unitialized data.
cairo_save (cr);
cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
cairo_paint (cr);
cairo_restore (cr);
Maybe image surfaces should be created "cleared" (all zeroed - either
transparent or black depending on surface format).
Also you call cairo_destroy(cr) twice.
Finally I suggest using --num-callers=50 with valgrind (50 is the
maximum). Valgrind's default of 4 callers is often not useful.
-jason
More information about the cairo
mailing list