[cairo] Text rendering crash

Behdad Esfahbod behdad at behdad.org
Fri Oct 17 10:38:04 PDT 2008


Hi Ian,

Your guess is exactly what's happening.  The docs have been enhanced to point
this out with an example.  See:


http://cairographics.org/manual/cairo-ft-font.html#cairo-ft-font-face-create-for-ft-face

Now I don't know how the FreeType cache manager supports that.  Perhaps David
can answer.

behdad

Ian Britten wrote:
> Hi all,
> I'm pursuing a crash in Cairo when rendering text, and was hoping
> to get some insight/guidance from the experts about how to proceed.
> [ Valgrind snippet at the end ]
> 
> - One simple possibility is that it's something that's already fixed
>    in a newer version of Cairo.  I look through the various Bugzilla
>    bugs, but didn't see anything that looked recent+relevant.
>    I'm using cairo 1.6.4 since it's the pre-installed version on
>    Linux right now.  I could look at upgrading if anyone was
>    optimistic that it might fix my problem, but I'm suspecting the
>    problem is more likely my second thought...
> 
> - I'm suspecting the problem is a 'dangling pointer' problem with
>    the FT_Face I'm passing to set_font_face(), and most of the rest
>    of this message will expand on that.
>    [ Note I'm also using FT 2.3.7 ]
> 
> We have an extensive framework that already makes use of FT.
> I'm trying to add support to this to output PDF/etc via Cairo.
> As such, in our text rendering pipeline, we take care of
> retrieving the relevant FT_Face (via FTC_Manager_Lookup_Size())
> and normally use that in conjunction with FT_Outline_Render()/etc
> to rasterize the text to an appropriate bitmap.
> 
> In this case, I'm passing the (cached) FT_Face into
> cairo_ft_font_face_create_for_ft_face(), and subsequently setting
> that onto my context, via cairo_set_font_face().
> 
> This seems to work, until the PDF is actually written out, when
> my (cairomm) Surface is cleaned up (deleted).  At this point, I
> get Valgrind errors, and intermittent crashes.
> 
> What I suspect is happening is that the FT_Face that FT gave me
> from it's cache was deleted from the cache in between the time I
> set it onto the Cairo context, and the time it was actually used
> to write out the PDF.  I didn't realize that Cairo didn't use the
> FT_Face immediately, and didn't for-see this problem.
> 
> As such, I'm a bit unsure how to proceed, and whether the problem
> is with FT, Cairo, or me (trying to combine all three together).
> 
> Obviously, I've glossed over a lot of details, but this message is
> getting too long for just an intro.  I'll happily provide more
> specifics if anyone has any ideas, and/or is willing to help me
> pursue this!
> 
> Many thanks in advance!
> Ian
> --
> 
> Valgrind errors
> 
> Invalid read of size 4
>     at 0x568E6EB: FT_Load_Glyph (in /usr/lib/libfreetype.so.6.3.18)
>     by 0x56506F6: _cairo_ft_scaled_glyph_init (cairo-ft-font.c:1927)
>     by 0x560D297: _cairo_scaled_glyph_lookup (cairo-scaled-font.c:1809)
>     by 0x560C017: _cairo_scaled_font_glyph_device_extents (cairo-scaled-font.c:1208)
>     by 0x56209B1: _cairo_analysis_surface_show_glyphs (cairo-analysis-surface.c:606)
>     by 0x5611AC2: _cairo_surface_show_glyphs (cairo-surface.c:2148)
>     by 0x561E40E: _cairo_meta_surface_replay_internal (cairo-meta-surface.c:827)
>     by 0x561E5C2: _cairo_meta_surface_replay_and_create_regions 
> (cairo-meta-surface.c:894)
>     by 0x561ED55: _paint_page (cairo-paginated-surface.c:303)
>     by 0x561F189: _cairo_paginated_surface_show_page (cairo-paginated-surface.c:464)
>   Address 0x895e420 is 88 bytes inside a block of size 1,536 free'd
>     at 0x40218FE: realloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
>     by 0x56097B3: _cairo_polygon_grow (cairo-polygon.c:100)
>     by 0x5609840: _cairo_polygon_add_edge (cairo-polygon.c:126)
>     by 0x5609975: _cairo_polygon_line_to (cairo-polygon.c:168)
>     by 0x56044F6: _cairo_filler_line_to (cairo-path-fill.c:108)
>     by 0x56053D7: _cairo_path_fixed_interpret (cairo-path-fixed.c:521)
>     by 0x56046E6: _cairo_path_fixed_fill_to_traps (cairo-path-fill.c:179)
>     by 0x5620783: _cairo_analysis_surface_fill (cairo-analysis-surface.c:536)
>     by 0x5610DB3: _cairo_surface_fill (cairo-surface.c:1616)
>     by 0x561E276: _cairo_meta_surface_replay_internal (cairo-meta-surface.c:791)
> 
> Process terminating with default action of signal 11 (SIGSEGV)
>   Access not within mapped region at address 0x12DB
>     at 0x568BF70: ft_glyphslot_free_bitmap (in /usr/lib/libfreetype.so.6.3.18)
>     by 0x568E70A: FT_Load_Glyph (in /usr/lib/libfreetype.so.6.3.18)
>     by 0x56506F6: _cairo_ft_scaled_glyph_init (cairo-ft-font.c:1927)
>     by 0x560D297: _cairo_scaled_glyph_lookup (cairo-scaled-font.c:1809)
>     [ ditto ]
> _______________________________________________
> cairo mailing list
> cairo at cairographics.org
> http://lists.cairographics.org/mailman/listinfo/cairo
> 


More information about the cairo mailing list