summaryrefslogtreecommitdiff
path: root/source/xps
diff options
context:
space:
mode:
Diffstat (limited to 'source/xps')
-rw-r--r--source/xps/xps-glyphs.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/source/xps/xps-glyphs.c b/source/xps/xps-glyphs.c
index afd9266f..d917b517 100644
--- a/source/xps/xps-glyphs.c
+++ b/source/xps/xps-glyphs.c
@@ -101,6 +101,12 @@ xps_deobfuscate_font_resource(xps_document *doc, xps_part *part)
char *p;
int i;
+ if (part->size < 32)
+ {
+ fz_warn(doc->ctx, "insufficient data for font deobfuscation");
+ return;
+ }
+
p = strrchr(part->name, '/');
if (!p)
p = part->name;
@@ -503,6 +509,9 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
font = xps_lookup_font(doc, fakename);
if (!font)
{
+ fz_buffer *buf = NULL;
+ fz_var(buf);
+
fz_try(doc->ctx)
{
part = xps_read_part(doc, partname);
@@ -522,15 +531,20 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
fz_try(doc->ctx)
{
- fz_buffer *buf = fz_new_buffer_from_data(doc->ctx, part->data, part->size);
+ buf = fz_new_buffer_from_data(doc->ctx, part->data, part->size);
+ /* part->data is now owned by buf */
+ part->data = NULL;
font = fz_new_font_from_buffer(doc->ctx, NULL, buf, subfontid, 1);
+ }
+ fz_always(doc->ctx)
+ {
fz_drop_buffer(doc->ctx, buf);
+ xps_free_part(doc, part);
}
fz_catch(doc->ctx)
{
fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER);
fz_warn(doc->ctx, "cannot load font resource '%s'", partname);
- xps_free_part(doc, part);
return;
}
@@ -541,12 +555,7 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
}
xps_select_best_font_encoding(doc, font);
-
xps_insert_font(doc, fakename, font);
-
- /* NOTE: we already saved part->data in the buffer in the font */
- fz_free(doc->ctx, part->name);
- fz_free(doc->ctx, part);
}
/*