summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mupdf/pdf_crypt.c8
-rw-r--r--mupdf/pdf_interpret.c31
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;
}