diff options
-rw-r--r-- | mupdf/pdf_crypt.c | 8 | ||||
-rw-r--r-- | mupdf/pdf_interpret.c | 31 |
2 files changed, 22 insertions, 17 deletions
diff --git a/mupdf/pdf_crypt.c b/mupdf/pdf_crypt.c index 25cb1d8d..6266e188 100644 --- a/mupdf/pdf_crypt.c +++ b/mupdf/pdf_crypt.c @@ -120,6 +120,10 @@ pdf_newcrypt(pdf_crypt **cryptp, fz_obj *dict, fz_obj *id) } } } + + /* in crypt revision 4, the crypt filter determines the key length */ + if (crypt->strf.method != PDF_CRYPT_NONE) + crypt->length = crypt->stmf.length; } } @@ -251,6 +255,10 @@ pdf_parsecryptfilter(pdf_cryptfilter *cf, fz_obj *dict, int defaultlength) if (fz_isint(obj)) cf->length = fz_toint(obj); + /* the length for crypt filters is supposed to be in bytes not bits */ + if (cf->length < 40) + cf->length = cf->length * 8; + if ((cf->length % 8) != 0) return fz_throw("invalid key length: %d", cf->length); diff --git a/mupdf/pdf_interpret.c b/mupdf/pdf_interpret.c index 570f92d1..6de24e74 100644 --- a/mupdf/pdf_interpret.c +++ b/mupdf/pdf_interpret.c @@ -775,6 +775,8 @@ static fz_error pdf_run_Tf(pdf_csi *csi, fz_obj *rdb) fz_obj *obj; gstate->size = csi->stack[0]; + if (gstate->font) + pdf_dropfont(gstate->font); gstate->font = nil; dict = fz_dictgets(rdb, "Font"); @@ -785,12 +787,6 @@ static fz_error pdf_run_Tf(pdf_csi *csi, fz_obj *rdb) if (!obj) return fz_throw("cannot find font resource: '%s'", csi->name); - if (gstate->font) - { - pdf_dropfont(gstate->font); - gstate->font = nil; - } - error = pdf_loadfont(&gstate->font, csi->xref, rdb, obj); if (error) return fz_rethrow(error, "cannot load font (%d 0 R)", fz_tonum(obj)); @@ -1290,15 +1286,17 @@ pdf_runcsifile(pdf_csi *csi, fz_obj *rdb, fz_stream *file, char *buf, int buflen { pdf_showstring(csi, (unsigned char *)buf, len); } - else if (tok == PDF_TEOF) + else if (tok == PDF_TKEYWORD) { - return fz_okay; + if (!strcmp(buf, "Tw") || !strcmp(buf, "Tc")) + fz_warn("ignoring keyword '%s' inside array", buf); + else + return fz_throw("syntax error in array"); } + else if (tok == PDF_TEOF) + return fz_okay; else - { - pdf_clearstack(csi); - return fz_throw("syntaxerror in array"); - } + return fz_throw("syntax error in array"); } else switch (tok) @@ -1360,8 +1358,7 @@ pdf_runcsifile(pdf_csi *csi, fz_obj *rdb, fz_stream *file, char *buf, int buflen break; default: - pdf_clearstack(csi); - return fz_throw("syntaxerror in content stream"); + return fz_throw("syntax error in content stream"); } } } @@ -1398,9 +1395,6 @@ pdf_runpage(pdf_xref *xref, pdf_page *page, fz_device *dev, fz_matrix ctm) if (error) return fz_rethrow(error, "cannot parse page content stream"); - if (page->transparency) - dev->endgroup(dev->user); - for (annot = page->annots; annot; annot = annot->next) { flags = fz_toint(fz_dictgets(annot->obj, "F")); @@ -1420,6 +1414,9 @@ pdf_runpage(pdf_xref *xref, pdf_page *page, fz_device *dev, fz_matrix ctm) return fz_rethrow(error, "cannot parse annotation appearance stream"); } + if (page->transparency) + dev->endgroup(dev->user); + return fz_okay; } |