[pango] Bug 591409 – crash in firefox. Handle non-mmapped FT_Face
- From: Behdad Esfahbod <behdad src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [pango] Bug 591409 – crash in firefox. Handle non-mmapped FT_Face
- Date: Tue, 11 Aug 2009 14:13:18 +0000 (UTC)
commit 954319c6eb2eb3dc74a3e271ee5ae6f1ce12ee32
Author: Behdad Esfahbod <behdad behdad org>
Date: Tue Aug 11 10:09:19 2009 -0400
Bug 591409 â?? crash in firefox. Handle non-mmapped FT_Face
pango/pango-ot-info.c | 50 +++++++++++++++++++++++++++++++++++++++---------
1 files changed, 40 insertions(+), 10 deletions(-)
---
diff --git a/pango/pango-ot-info.c b/pango/pango-ot-info.c
index a4d54fd..3cc24c7 100644
--- a/pango/pango-ot-info.c
+++ b/pango/pango-ot-info.c
@@ -23,7 +23,7 @@
#include "pango-ot-private.h"
#include "pango-impl-utils.h"
-#include FT_MODULE_H
+#include FT_TRUETYPE_TABLES_H
static void pango_ot_info_class_init (GObjectClass *object_class);
static void pango_ot_info_finalize (GObject *object);
@@ -90,6 +90,32 @@ pango_ot_info_finalizer (void *object)
g_object_unref (info);
}
+static hb_blob_t *
+_get_table (hb_tag_t tag, void *user_data)
+{
+ PangoOTInfo *info = (PangoOTInfo *) user_data;
+ FT_Byte *buffer;
+ FT_ULong length = 0;
+ FT_Error error;
+
+ error = FT_Load_Sfnt_Table (info->face, tag, 0, NULL, &length);
+ if (error)
+ return hb_blob_create_empty ();
+
+ buffer = g_malloc (length);
+ if (buffer == NULL)
+ return hb_blob_create_empty ();
+
+ error = FT_Load_Sfnt_Table (info->face, tag, 0, buffer, &length);
+ if (error)
+ return hb_blob_create_empty ();
+
+ return hb_blob_create ((const char *) buffer, length,
+ HB_MEMORY_MODE_WRITEABLE,
+ g_free, NULL);
+}
+
+
/**
* pango_ot_info_get:
* @face: a <type>FT_Face</type>.
@@ -110,8 +136,6 @@ pango_ot_info_get (FT_Face face)
return face->generic.data;
else
{
- hb_blob_t *blob;
-
if (face->generic.finalizer)
face->generic.finalizer (face->generic.data);
@@ -120,13 +144,19 @@ pango_ot_info_get (FT_Face face)
info->face = face;
- /* XXX handle face->stream->base == NULL better */
- blob = hb_blob_create ((const char *) face->stream->base,
- (unsigned int) face->stream->size,
- HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITEABLE,
- NULL, NULL);
- info->hb_face = hb_face_create_for_data (blob, face->face_index);
- hb_blob_destroy (blob);
+ if (face->stream->base != NULL) {
+ hb_blob_t *blob;
+
+ blob = hb_blob_create ((const char *) face->stream->base,
+ (unsigned int) face->stream->size,
+ HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITEABLE,
+ NULL, NULL);
+ info->hb_face = hb_face_create_for_data (blob, face->face_index);
+ hb_blob_destroy (blob);
+ } else {
+ info->hb_face = hb_face_create_for_tables (_get_table, NULL, info);
+ }
+
hb_face_set_unicode_funcs (info->hb_face, hb_glib_get_unicode_funcs ());
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]