[cairo] Re: crash at XRenderAddGlyphs.

sunmoon1997 sunmoon1997 at gmail.com
Tue Sep 27 21:08:55 PDT 2005


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

sorry, i accidently encrypted this mail.
sunmoon1997 wrote:
> hi,
>     Currenty cairo xlib backend assume that the depth of glyphs from a font face are the same, but this is not true for some embedded bitmap fonts.  The may have two different depth glyphs, from my attached file,
> you can see the fist four glyphs are 1-bit bitmap, but latter depth become 8-bit. Cairo only extracts the format information from the fisrt glyph, if glyph depth changed, cairo still use the old formation info,
> and sends the glyph to X server, then X will complain cairo sended too much bits to it and reply an error (bad length) that will crash a lot of apps.

- ------------------------------------------------------------------------

Breakpoint 1, _cairo_xlib_surface_add_glyph (dpy=0x8099520,
    scaled_font=0x8118c38, scaled_glyph=0x81104d0) at
cairo-xlib-surface.c:2076
2076        cairo_image_surface_t *glyph_surface = scaled_glyph->surface;
5: *scaled_glyph->surface = {base = {backend = 0xb7f52060, ref_count = 1,
    status = CAIRO_STATUS_SUCCESS, finished = 0, user_data = {size = 0,
      num_elements = 0, element_size = 12, elements = 0x0},
    device_x_offset = 0, device_y_offset = -11, device_x_scale = 1,
    device_y_scale = 1, next_clip_serial = 0, current_clip_serial = 0},
  format = CAIRO_FORMAT_A1, data = 0x814b790 "@", owns_data = 1,
has_clip = 0,
  width = 13, height = 13, stride = 4, depth = 1, pixman_image = 0x8117eb8}
(gdb)
Continuing.

Breakpoint 1, _cairo_xlib_surface_add_glyph (dpy=0x8099520,
    scaled_font=0x8118c38, scaled_glyph=0x8141bc8) at
cairo-xlib-surface.c:2076
2076        cairo_image_surface_t *glyph_surface = scaled_glyph->surface;
5: *scaled_glyph->surface = {base = {backend = 0xb7f52060, ref_count = 1,
    status = CAIRO_STATUS_SUCCESS, finished = 0, user_data = {size = 0,
      num_elements = 0, element_size = 12, elements = 0x0},
    device_x_offset = 0, device_y_offset = -11, device_x_scale = 1,
    device_y_scale = 1, next_clip_serial = 0, current_clip_serial = 0},
  format = CAIRO_FORMAT_A1, data = 0x8118950 " ", owns_data = 1,
has_clip = 0,
  width = 13, height = 13, stride = 4, depth = 1, pixman_image = 0x814bb38}
(gdb)
Continuing.

Breakpoint 1, _cairo_xlib_surface_add_glyph (dpy=0x8099520,
    scaled_font=0x8118c38, scaled_glyph=0x8141c28) at
cairo-xlib-surface.c:2076
2076        cairo_image_surface_t *glyph_surface = scaled_glyph->surface;
5: *scaled_glyph->surface = {base = {backend = 0xb7f52060, ref_count = 1,
    status = CAIRO_STATUS_SUCCESS, finished = 0, user_data = {size = 0,
      num_elements = 0, element_size = 12, elements = 0x0},
    device_x_offset = 0, device_y_offset = -11, device_x_scale = 1,
    device_y_scale = 1, next_clip_serial = 0, current_clip_serial = 0},
  format = CAIRO_FORMAT_A1, data = 0x814bc20 "\020\001", owns_data = 1,
  has_clip = 0, width = 13, height = 13, stride = 4, depth = 1,
  pixman_image = 0x814bc58}
(gdb)
Continuing.

Breakpoint 1, _cairo_xlib_surface_add_glyph (dpy=0x8099520,
    scaled_font=0x8118c38, scaled_glyph=0x8118668) at
cairo-xlib-surface.c:2076
2076        cairo_image_surface_t *glyph_surface = scaled_glyph->surface;
5: *scaled_glyph->surface = {base = {backend = 0xb7f52060, ref_count = 1,
    status = CAIRO_STATUS_SUCCESS, finished = 0, user_data = {size = 0,
      num_elements = 0, element_size = 12, elements = 0x0},
    device_x_offset = 0, device_y_offset = -11, device_x_scale = 1,
    device_y_scale = 1, next_clip_serial = 0, current_clip_serial = 0},
  format = CAIRO_FORMAT_A1, data = 0x814bd60 " ", owns_data = 1,
has_clip = 0,
  width = 13, height = 13, stride = 4, depth = 1, pixman_image = 0x814bdc0}
(gdb)
Continuing.

Breakpoint 1, _cairo_xlib_surface_add_glyph (dpy=0x8099520,
    scaled_font=0x8118c38, scaled_glyph=0x81186c8) at
cairo-xlib-surface.c:2076
2076        cairo_image_surface_t *glyph_surface = scaled_glyph->surface;
5: *scaled_glyph->surface = {base = {backend = 0xb7f52060, ref_count = 1,
    status = CAIRO_STATUS_SUCCESS, finished = 0, user_data = {size = 0,
      num_elements = 0, element_size = 12, elements = 0x0},
    device_x_offset = 0, device_y_offset = -11, device_x_scale = 1,
    device_y_scale = 1, next_clip_serial = 0, current_clip_serial = 0},
  format = CAIRO_FORMAT_A1, data = 0x814bec8 " ", owns_data = 1,
has_clip = 0,
  width = 13, height = 13, stride = 4, depth = 1, pixman_image = 0x814bf28}
(gdb)
Continuing.

Breakpoint 1, _cairo_xlib_surface_add_glyph (dpy=0x8099520,
    scaled_font=0x8118c38, scaled_glyph=0x8118728) at
cairo-xlib-surface.c:2076
2076        cairo_image_surface_t *glyph_surface = scaled_glyph->surface;
5: *scaled_glyph->surface = {base = {backend = 0xb7f52060, ref_count = 1,
    status = CAIRO_STATUS_SUCCESS, finished = 0, user_data = {size = 0,
      num_elements = 0, element_size = 12, elements = 0x0},
    device_x_offset = 0, device_y_offset = -11, device_x_scale = 1,
    device_y_scale = 1, next_clip_serial = 0, current_clip_serial = 0},
  format = CAIRO_FORMAT_A1, data = 0x814c030 "\204", owns_data = 1,
  has_clip = 0, width = 13, height = 13, stride = 4, depth = 1,
  pixman_image = 0x814c090}
(gdb)
Continuing.

Breakpoint 1, _cairo_xlib_surface_add_glyph (dpy=0x8099520,
    scaled_font=0x8118c38, scaled_glyph=0x8118788) at
cairo-xlib-surface.c:2076
2076        cairo_image_surface_t *glyph_surface = scaled_glyph->surface;
5: *scaled_glyph->surface = {base = {backend = 0xb7f52060, ref_count = 1,
    status = CAIRO_STATUS_SUCCESS, finished = 0, user_data = {size = 0,
      num_elements = 0, element_size = 12, elements = 0x0},
    device_x_offset = 0, device_y_offset = -11, device_x_scale = 1,
    device_y_scale = 1, next_clip_serial = 0, current_clip_serial = 0},
  format = CAIRO_FORMAT_A1, data = 0x814c198 "\030", owns_data = 1,
  has_clip = 0, width = 13, height = 13, stride = 4, depth = 1,
  pixman_image = 0x814c1f8}
(gdb)
Continuing.

Breakpoint 1, _cairo_xlib_surface_add_glyph (dpy=0x8099520,
    scaled_font=0x8118c38, scaled_glyph=0x81187e8) at
cairo-xlib-surface.c:2076
2076        cairo_image_surface_t *glyph_surface = scaled_glyph->surface;
5: *scaled_glyph->surface = {base = {backend = 0xb7f52060, ref_count = 1,
    status = CAIRO_STATUS_SUCCESS, finished = 0, user_data = {size = 0,
      num_elements = 0, element_size = 12, elements = 0x0},
    device_x_offset = 0, device_y_offset = -11, device_x_scale = 1,
    device_y_scale = 1, next_clip_serial = 0, current_clip_serial = 0},
  format = CAIRO_FORMAT_A1, data = 0x814c300 "\202", owns_data = 1,
  has_clip = 0, width = 13, height = 13, stride = 4, depth = 1,
  pixman_image = 0x814c360}
(gdb)
Continuing.

Breakpoint 1, _cairo_xlib_surface_add_glyph (dpy=0x8099520,
    scaled_font=0x8118c38, scaled_glyph=0x8118848) at
cairo-xlib-surface.c:2076
2076        cairo_image_surface_t *glyph_surface = scaled_glyph->surface;
5: *scaled_glyph->surface = {base = {backend = 0xb7f52060, ref_count = 1,
    status = CAIRO_STATUS_SUCCESS, finished = 0, user_data = {size = 0,
      num_elements = 0, element_size = 12, elements = 0x0},
    device_x_offset = 0, device_y_offset = -0, device_x_scale = 1,
    device_y_scale = 1, next_clip_serial = 0, current_clip_serial = 0},
  format = CAIRO_FORMAT_A8, data = 0x0, owns_data = 0, has_clip = 0,
  width = 0, height = 0, stride = 0, depth = 8, pixman_image = 0x814c490}
(gdb)
Continuing.

Breakpoint 1, _cairo_xlib_surface_add_glyph (dpy=0x8099520,
    scaled_font=0x8118c38, scaled_glyph=0x81188a8) at
cairo-xlib-surface.c:2076
2076        cairo_image_surface_t *glyph_surface = scaled_glyph->surface;
5: *scaled_glyph->surface = {base = {backend = 0xb7f52060, ref_count = 1,
    status = CAIRO_STATUS_SUCCESS, finished = 0, user_data = {size = 0,
      num_elements = 0, element_size = 12, elements = 0x0},
    device_x_offset = 1, device_y_offset = -9, device_x_scale = 1,
    device_y_scale = 1, next_clip_serial = 0, current_clip_serial = 0},
  format = CAIRO_FORMAT_A8, data = 0x814c598 "hå?´è±?", owns_data = 1,
  has_clip = 0, width = 5, height = 9, stride = 8, depth = 8,
  pixman_image = 0x814c610}
(gdb) display glyph_info
6: glyph_info = {width = 53502, height = 47051, x = 10020, y = -18443,
  xOff = -26856, yOff = -16490}
(gdb) b 2195
Breakpoint 2 at 0xb7f1b444: file cairo-xlib-surface.c, line 2195.
(gdb) continue
Continuing.

Breakpoint 2, _cairo_xlib_surface_add_glyph (dpy=0x8099520,
    scaled_font=0x8118c38, scaled_glyph=0x81188a8) at
cairo-xlib-surface.c:2195
2195        XSync(dpy, 0);
6: glyph_info = {width = 5, height = 9, x = -1, y = 9, xOff = 0, yOff = 0}
5: *scaled_glyph->surface = {base = {backend = 0xb7f52060, ref_count = 1,
    status = CAIRO_STATUS_SUCCESS, finished = 0, user_data = {size = 0,
      num_elements = 0, element_size = 12, elements = 0x0},
    device_x_offset = 1, device_y_offset = -9, device_x_scale = 1,
    device_y_scale = 1, next_clip_serial = 0, current_clip_serial = 0},
  format = CAIRO_FORMAT_A8, data = 0x814c598 "hå?´è±?", owns_data = 1,
  has_clip = 0, width = 5, height = 9, stride = 8, depth = 8,
  pixman_image = 0x814c610}
(gdb)
Continuing.
fcitx: BadLength (poly request too large or internal Xlib length error)
X Error of failed request:  BadLength (poly request too large or
internal Xlib length error)
  Major opcode of failed request:  150 (RENDER)
  Minor opcode of failed request:  20 (RenderAddGlyphs)
  Serial number of failed request:  721
  Current serial number in output stream:  722


- ------------------------------------------------------------------------

_______________________________________________
cairo mailing list
cairo at cairographics.org
http://cairographics.org/cgi-bin/mailman/listinfo/cairo

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (GNU/Linux)

iD8DBQFDOhdXuOtwLijeKbwRAlsdAJ0W1XODaT+O1nCVSI6aGiuxuoEQpQCgnM7V
Jm5E4UbCkTkjOyj0YwFMtpo=
=OUNV
-----END PGP SIGNATURE-----


More information about the cairo mailing list