diff options
author | Chris Liddell <chris.liddell@artifex.com> | 2021-06-02 18:47:39 +0100 |
---|---|---|
committer | Chris Liddell <chris.liddell@artifex.com> | 2021-06-03 08:32:46 +0100 |
commit | 3abdcc6fc5940eb54e6390487b211c582c0f5fc1 (patch) | |
tree | 1cf93600ccdef7bf8514f369608318c0ade648d7 | |
parent | a7e386ce4efcff93cfcaf35812f98e18cb1dd7a4 (diff) | |
download | ghostpdl-3abdcc6fc5940eb54e6390487b211c582c0f5fc1.tar.gz |
Handle emtpy Subrs array
tests_private/comparefiles/spec_gs.pdf has a Type 1 font that declares a Subrs
array, and writes no Subr strings to it. The fapi integration didn't expect
that.
-rw-r--r-- | pdf/pdf_fapi.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/pdf/pdf_fapi.c b/pdf/pdf_fapi.c index e7f52809c..958e35bff 100644 --- a/pdf/pdf_fapi.c +++ b/pdf/pdf_fapi.c @@ -721,14 +721,16 @@ pdfi_fapi_get_subr(gs_fapi_font *ff, int index, byte *buf, int buf_length) } else { int leniv = (pfont->data.lenIV > 0 ? pfont->data.lenIV : 0); - code = pdffont1->Subrs[index].size - leniv; - if (buf && buf_length >= code) { - if (ff->need_decrypt && pfont->data.lenIV >= 0) { - decode_bytes(buf, pdffont1->Subrs[index].data, code + leniv, pfont->data.lenIV); - } - else { - memcpy(buf, pdffont1->Subrs[index].data, code); - } + if (pdffont1->Subrs[index].size > 0) { + code = pdffont1->Subrs[index].size - leniv; + if (buf && buf_length >= code) { + if (ff->need_decrypt && pfont->data.lenIV >= 0) { + decode_bytes(buf, pdffont1->Subrs[index].data, code + leniv, pfont->data.lenIV); + } + else { + memcpy(buf, pdffont1->Subrs[index].data, code); + } + } } } } @@ -743,13 +745,15 @@ pdfi_fapi_get_subr(gs_fapi_font *ff, int index, byte *buf, int buf_length) code = pdfi_array_get(pdffont2->ctx, pdffont2->Subrs, index, (pdf_obj **)&subrstring); if (code >= 0) { - code = subrstring->length - leniv; - if (buf && buf_length >= code) { - if (ff->need_decrypt && pfont->data.lenIV >= 0) { - decode_bytes(buf, subrstring->data, code + leniv, pfont->data.lenIV); - } - else { - memcpy(buf, subrstring->data, code); + if (subrstring->length > 0) { + code = subrstring->length - leniv; + if (buf && buf_length >= code) { + if (ff->need_decrypt && pfont->data.lenIV >= 0) { + decode_bytes(buf, subrstring->data, code + leniv, pfont->data.lenIV); + } + else { + memcpy(buf, subrstring->data, code); + } } } pdfi_countdown(subrstring); @@ -849,7 +853,9 @@ pdfi_fapi_get_glyphname_or_cid(gs_text_enum_t *penum, gs_font_base * pbfont, gs_ } else cc = ccode; - + /* All known cmap tables map 32 to the space glyph, so if it looks like + we're going to use a notdef, then substitute the glyph for the code point 32 + */ if (l != 0) { code = pdfi_fapi_check_cmap_for_GID((gs_font *)pbfont, cc, &gc); if (code < 0 || gc == 0) |