[cairo] For libsvg-cairo, glibc-detected corrupted
double-linked list detected.
charles
charles.wang at akomedia.com
Mon Jul 25 23:34:20 PDT 2005
在 2005-07-25一的 21:56 -0400,Jason Dorje Short写道:
> 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
>
Hi Jason:
O, This is really my fault! It is caused by the second cairo_destroy
(cr). :)
Thanks for you prompt very very very much!.
Charles July 26, 2005.
More information about the cairo
mailing list