summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Liddell <chris.liddell@artifex.com>2021-06-02 18:47:39 +0100
committerChris Liddell <chris.liddell@artifex.com>2021-06-03 08:32:46 +0100
commit3abdcc6fc5940eb54e6390487b211c582c0f5fc1 (patch)
tree1cf93600ccdef7bf8514f369608318c0ade648d7
parenta7e386ce4efcff93cfcaf35812f98e18cb1dd7a4 (diff)
downloadghostpdl-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.c38
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)