summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2008-03-27 14:42:36 +0100
committerTor Andersson <tor@ghostscript.com>2008-03-27 14:42:36 +0100
commit3909e66a925d8981cce45f4fb64dffb43eb97549 (patch)
treecf5c9ef72eef151ea766ea7dfc1090e5dc07652b
parent9d6fdc1b0616715498bb9dfbdb65a984a9191f8e (diff)
downloadmupdf-3909e66a925d8981cce45f4fb64dffb43eb97549.tar.xz
Chain error messages in more files.
-rw-r--r--mupdf/pdf_annot.c25
-rw-r--r--mupdf/pdf_build.c2
-rw-r--r--mupdf/pdf_cmap.c42
-rw-r--r--mupdf/pdf_colorspace1.c40
-rw-r--r--mupdf/pdf_doctor.c6
-rw-r--r--mupdf/pdf_font.c27
-rw-r--r--mupdf/pdf_interpret.c4
-rw-r--r--mupdf/pdf_nametree.c32
-rw-r--r--mupdf/pdf_open.c51
-rw-r--r--mupdf/pdf_outline.c18
-rw-r--r--mupdf/pdf_page.c2
-rw-r--r--mupdf/pdf_pagetree.c2
-rw-r--r--mupdf/pdf_pattern.c2
-rw-r--r--mupdf/pdf_repair.c2
-rw-r--r--mupdf/pdf_save.c24
-rw-r--r--mupdf/pdf_stream.c2
-rw-r--r--mupdf/pdf_type3.c6
-rw-r--r--mupdf/pdf_unicode.c51
-rw-r--r--mupdf/pdf_xref.c2
-rw-r--r--stream/obj_dict.c7
-rw-r--r--stream/obj_parse.c10
-rw-r--r--stream/stm_write.c12
-rw-r--r--world/node_optimize.c10
23 files changed, 198 insertions, 181 deletions
diff --git a/mupdf/pdf_annot.c b/mupdf/pdf_annot.c
index a2839f6e..df40091b 100644
--- a/mupdf/pdf_annot.c
+++ b/mupdf/pdf_annot.c
@@ -101,7 +101,7 @@ pdf_loadlink(pdf_link **linkp, pdf_xref *xref, fz_obj *dict)
{
error = pdf_resolve(&obj, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot resolve /Dest");
dest = resolvedest(xref, obj);
pdf_logpage("dest %d %d R\n", fz_tonum(dest), fz_togen(dest));
fz_dropobj(obj);
@@ -112,7 +112,7 @@ pdf_loadlink(pdf_link **linkp, pdf_xref *xref, fz_obj *dict)
{
error = pdf_resolve(&action, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot resolve /A");
obj = fz_dictgets(action, "S");
if (!strcmp(fz_toname(obj), "GoTo"))
@@ -137,7 +137,7 @@ pdf_loadlink(pdf_link **linkp, pdf_xref *xref, fz_obj *dict)
{
error = pdf_newlink(&link, bbox, dest);
if (error)
- return error;
+ return fz_rethrow(error, "cannot create link");
*linkp = link;
}
@@ -164,7 +164,10 @@ pdf_loadannots(pdf_comment **cp, pdf_link **lp, pdf_xref *xref, fz_obj *annots)
obj = fz_arrayget(annots, i);
error = pdf_resolve(&obj, xref);
if (error)
- goto cleanup;
+ {
+ pdf_droplink(link);
+ return fz_rethrow(error, "cannot resolve annotation");
+ }
subtype = fz_dictgets(obj, "Subtype");
if (!strcmp(fz_toname(subtype), "Link"))
@@ -174,7 +177,10 @@ pdf_loadannots(pdf_comment **cp, pdf_link **lp, pdf_xref *xref, fz_obj *annots)
error = pdf_loadlink(&temp, xref, obj);
fz_dropobj(obj);
if (error)
- goto cleanup;
+ {
+ pdf_droplink(link);
+ return fz_rethrow(error, "cannot load annotation link");
+ }
if (temp)
{
@@ -187,7 +193,10 @@ pdf_loadannots(pdf_comment **cp, pdf_link **lp, pdf_xref *xref, fz_obj *annots)
error = loadcomment(&comment, xref, obj);
fz_dropobj(obj);
if (error)
- goto cleanup;
+ {
+ pdf_droplink(link);
+ return fz_rethrow(error, "cannot load annotation comment");
+ }
}
}
@@ -196,9 +205,5 @@ pdf_loadannots(pdf_comment **cp, pdf_link **lp, pdf_xref *xref, fz_obj *annots)
*cp = comment;
*lp = link;
return nil;
-
-cleanup:
- pdf_droplink(link);
- return error;
}
diff --git a/mupdf/pdf_build.c b/mupdf/pdf_build.c
index 87748d95..e62ebd0d 100644
--- a/mupdf/pdf_build.c
+++ b/mupdf/pdf_build.c
@@ -673,7 +673,7 @@ pdf_showpath(pdf_csi *csi,
{
error = fz_clonepathnode(&clip, csi->path);
if (error)
- return error;
+ return fz_rethrow(error, "cannot copy path node for clip mask");
}
if (dofill && dostroke)
diff --git a/mupdf/pdf_cmap.c b/mupdf/pdf_cmap.c
index 9031aeb6..20337eed 100644
--- a/mupdf/pdf_cmap.c
+++ b/mupdf/pdf_cmap.c
@@ -597,13 +597,13 @@ static int codefromstring(unsigned char *buf, int len)
return a;
}
-static fz_error *mylex(int *token, fz_stream *file, char *buf, int n, int *sl)
+static fz_error *lexcmap(int *token, fz_stream *file, char *buf, int n, int *sl)
{
fz_error *error;
error = pdf_lex(token, file, buf, n, sl);
if (!error && *token == PDF_TKEYWORD)
*token = tokenfromkeyword(buf);
- return error;
+ return fz_rethrow(error, "cannot parse cmap token");
}
static fz_error *parsecmapname(pdf_cmap *cmap, fz_stream *file)
@@ -613,7 +613,7 @@ static fz_error *parsecmapname(pdf_cmap *cmap, fz_stream *file)
int token;
int len;
- error = mylex(&token, file, buf, sizeof buf, &len);
+ error = lexcmap(&token, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
@@ -633,7 +633,7 @@ static fz_error *parsewmode(pdf_cmap *cmap, fz_stream *file)
int token;
int len;
- error = mylex(&token, file, buf, sizeof buf, &len);
+ error = lexcmap(&token, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
@@ -656,7 +656,7 @@ static fz_error *parsecodespacerange(pdf_cmap *cmap, fz_stream *file)
while (1)
{
- error = mylex(&token, file, buf, sizeof buf, &len);
+ error = lexcmap(&token, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
@@ -666,7 +666,7 @@ static fz_error *parsecodespacerange(pdf_cmap *cmap, fz_stream *file)
else if (token == PDF_TSTRING)
{
lo = codefromstring(buf, len);
- error = mylex(&token, file, buf, sizeof buf, &len);
+ error = lexcmap(&token, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
if (token == PDF_TSTRING)
@@ -695,7 +695,7 @@ static fz_error *parsecidrange(pdf_cmap *cmap, fz_stream *file)
while (1)
{
- error = mylex(&token, file, buf, sizeof buf, &len);
+ error = lexcmap(&token, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
@@ -707,7 +707,7 @@ static fz_error *parsecidrange(pdf_cmap *cmap, fz_stream *file)
lo = codefromstring(buf, len);
- error = mylex(&token, file, buf, sizeof buf, &len);
+ error = lexcmap(&token, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
if (token != PDF_TSTRING)
@@ -715,7 +715,7 @@ static fz_error *parsecidrange(pdf_cmap *cmap, fz_stream *file)
hi = codefromstring(buf, len);
- error = mylex(&token, file, buf, sizeof buf, &len);
+ error = lexcmap(&token, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
if (token != PDF_TINT)
@@ -739,7 +739,7 @@ static fz_error *parsecidchar(pdf_cmap *cmap, fz_stream *file)
while (1)
{
- error = mylex(&token, file, buf, sizeof buf, &len);
+ error = lexcmap(&token, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
@@ -751,7 +751,7 @@ static fz_error *parsecidchar(pdf_cmap *cmap, fz_stream *file)
src = codefromstring(buf, len);
- error = mylex(&token, file, buf, sizeof buf, &len);
+ error = lexcmap(&token, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
if (token != PDF_TINT)
@@ -776,7 +776,7 @@ static fz_error *parsebfrangearray(pdf_cmap *cmap, fz_stream *file, int lo, int
while (1)
{
- error = mylex(&token, file, buf, sizeof buf, &len);
+ error = lexcmap(&token, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
@@ -811,7 +811,7 @@ static fz_error *parsebfrange(pdf_cmap *cmap, fz_stream *file)
while (1)
{
- error = mylex(&token, file, buf, sizeof buf, &len);
+ error = lexcmap(&token, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
@@ -823,7 +823,7 @@ static fz_error *parsebfrange(pdf_cmap *cmap, fz_stream *file)
lo = codefromstring(buf, len);
- error = mylex(&token, file, buf, sizeof buf, &len);
+ error = lexcmap(&token, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
if (token != PDF_TSTRING)
@@ -831,7 +831,7 @@ static fz_error *parsebfrange(pdf_cmap *cmap, fz_stream *file)
hi = codefromstring(buf, len);
- error = mylex(&token, file, buf, sizeof buf, &len);
+ error = lexcmap(&token, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
@@ -892,7 +892,7 @@ static fz_error *parsebfchar(pdf_cmap *cmap, fz_stream *file)
while (1)
{
- error = mylex(&token, file, buf, sizeof buf, &len);
+ error = lexcmap(&token, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
@@ -904,7 +904,7 @@ static fz_error *parsebfchar(pdf_cmap *cmap, fz_stream *file)
src = codefromstring(buf, len);
- error = mylex(&token, file, buf, sizeof buf, &len);
+ error = lexcmap(&token, file, buf, sizeof buf, &len);
if (error)
return fz_rethrow(error, "syntaxerror in cmap");
/* Note: does not handle /dstName */
@@ -941,7 +941,7 @@ pdf_parsecmap(pdf_cmap **cmapp, fz_stream *file)
while (1)
{
- error = mylex(&token, file, buf, sizeof buf, &len);
+ error = lexcmap(&token, file, buf, sizeof buf, &len);
if (error)
{
error = fz_rethrow(error, "syntaxerror in cmap");
@@ -1045,7 +1045,7 @@ pdf_parsecmap(pdf_cmap **cmapp, fz_stream *file)
cleanup:
pdf_dropcmap(cmap);
- return error;
+ return error; /* already rethrown */
}
/*
@@ -1141,7 +1141,7 @@ cleanup:
if (cmap)
pdf_dropcmap(cmap);
fz_dropobj(stmobj);
- return error;
+ return error; /* already rethrown */
}
/*
@@ -1211,7 +1211,7 @@ cleanup:
pdf_dropcmap(cmap);
if (file)
fz_dropstream(file);
- return error;
+ return error; /* already rethrown */
}
/*
diff --git a/mupdf/pdf_colorspace1.c b/mupdf/pdf_colorspace1.c
index 7c79f79a..9d7c740b 100644
--- a/mupdf/pdf_colorspace1.c
+++ b/mupdf/pdf_colorspace1.c
@@ -233,11 +233,11 @@ loadcalgray(fz_colorspace **csp, pdf_xref *xref, fz_obj *dict)
error = pdf_resolve(&dict, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot find colorspace");
cs = fz_malloc(sizeof(struct calgray));
if (!cs)
- return fz_outofmem;
+ return fz_throw("outofmem: gray colorspace struct");
pdf_logrsrc("load CalGray\n");
@@ -289,11 +289,11 @@ loadcalrgb(fz_colorspace **csp, pdf_xref *xref, fz_obj *dict)
error = pdf_resolve(&dict, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot find colorspace");
cs = fz_malloc(sizeof(struct calrgb));
if (!cs)
- return fz_outofmem;
+ return fz_throw("outofmem: RGB colorspace struct");
pdf_logrsrc("load CalRGB\n");
@@ -363,11 +363,11 @@ loadlab(fz_colorspace **csp, pdf_xref *xref, fz_obj *dict)
error = pdf_resolve(&dict, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot find colorspace");
cs = fz_malloc(sizeof(struct cielab));
if (!cs)
- return fz_outofmem;
+ return fz_throw("outofmem: L*a*b colorspace struct");
pdf_logrsrc("load Lab\n");
@@ -434,7 +434,7 @@ loadiccbased(fz_colorspace **csp, pdf_xref *xref, fz_obj *ref)
error = pdf_loadindirect(&dict, xref, ref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot find colorspace");
n = fz_toint(fz_dictgets(dict, "N"));
@@ -512,17 +512,18 @@ loadseparation(fz_colorspace **csp, pdf_xref *xref, fz_obj *array)
error = pdf_resolve(&baseobj, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot find colorspace");
+
error = pdf_loadcolorspace(&base, xref, baseobj);
fz_dropobj(baseobj);
if (error)
- return error;
+ return fz_rethrow(error, "cannot load base colorspace");
error = pdf_loadfunction(&tint, xref, tintobj);
if (error)
{
fz_dropcolorspace(base);
- return error;
+ return fz_rethrow(error, "cannot load tint function");
}
cs = fz_malloc(sizeof(struct separation));
@@ -530,7 +531,7 @@ loadseparation(fz_colorspace **csp, pdf_xref *xref, fz_obj *array)
{
pdf_dropfunction(tint);
fz_dropcolorspace(base);
- return fz_outofmem;
+ return fz_throw("outofmem: separation colorspace struct");
}
initcs((fz_colorspace*)cs,
@@ -588,11 +589,12 @@ loadindexed(fz_colorspace **csp, pdf_xref *xref, fz_obj *array)
error = pdf_resolve(&baseobj, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot find colorspace");
+
error = pdf_loadcolorspace(&base, xref, baseobj);
fz_dropobj(baseobj);
if (error)
- return error;
+ return fz_rethrow(error, "cannot load base colorspace");
pdf_logrsrc("base %s\n", base->name);
@@ -600,7 +602,7 @@ loadindexed(fz_colorspace **csp, pdf_xref *xref, fz_obj *array)
if (!cs)
{
fz_dropcolorspace(base);
- return fz_outofmem;
+ return fz_throw("outofmem: indexed colorspace struct");
}
initcs((fz_colorspace*)cs, "Indexed", 1, nil, nil, dropindexed);
@@ -614,7 +616,7 @@ loadindexed(fz_colorspace **csp, pdf_xref *xref, fz_obj *array)
if (!cs->lookup)
{
fz_dropcolorspace((fz_colorspace*)cs);
- return fz_outofmem;
+ return fz_throw("outofmem: indexed colorspace lookup table (%d entries)", n);
}
if (fz_isstring(lookup) && fz_tostrlen(lookup) == n)
@@ -640,7 +642,7 @@ loadindexed(fz_colorspace **csp, pdf_xref *xref, fz_obj *array)
if (error)
{
fz_dropcolorspace((fz_colorspace*)cs);
- return error;
+ return fz_rethrow(error, "cannot load colorpsace lookup table");
}
for (i = 0; i < n && i < (buf->wp - buf->rp); i++)
@@ -737,10 +739,12 @@ pdf_loadcolorspace(fz_colorspace **csp, pdf_xref *xref, fz_obj *obj)
error = pdf_resolve(&obj, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot find pattern");
+
error = pdf_loadcolorspace(csp, xref, obj);
fz_dropobj(obj);
- return error;
+ if (error)
+ return fz_rethrow(error, "cannot load pattern");
}
else
diff --git a/mupdf/pdf_doctor.c b/mupdf/pdf_doctor.c
index deb33af3..f9e56957 100644
--- a/mupdf/pdf_doctor.c
+++ b/mupdf/pdf_doctor.c
@@ -21,7 +21,7 @@ sweepobj(pdf_xref *xref, fz_obj *obj)
{
error = sweepobj(xref, fz_dictgetval(obj, i));
if (error)
- return error;
+ return error; /* too deeply nested for rethrow */
}
}
@@ -31,7 +31,7 @@ sweepobj(pdf_xref *xref, fz_obj *obj)
{
error = sweepobj(xref, fz_arrayget(obj, i));
if (error)
- return error;
+ return error; /* too deeply nested for rethrow */
}
}
@@ -66,7 +66,7 @@ sweepref(pdf_xref *xref, fz_obj *ref)
if (error)
{
fz_dropobj(obj);
- return error;
+ return error; /* too deeply nested for rethrow */
}
fz_dropobj(obj);
diff --git a/mupdf/pdf_font.c b/mupdf/pdf_font.c
index a2386fed..6e5fd083 100644
--- a/mupdf/pdf_font.c
+++ b/mupdf/pdf_font.c
@@ -577,7 +577,7 @@ cleanup:
if (widths)
fz_dropobj(widths);
fz_dropfont((fz_font*)font);
- return error;
+ return fz_rethrow(error, "cannot load simple font");
}
/*
@@ -614,7 +614,7 @@ loadcidfont(pdf_font **fontp, pdf_xref *xref, fz_obj *dict, fz_obj *ref, fz_obj
error = pdf_resolve(&cidinfo, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot find CIDSystemInfo");
obj = fz_dictgets(cidinfo, "Registry");
tmplen = MIN(sizeof tmpstr - 1, fz_tostrlen(obj));
@@ -759,7 +759,7 @@ loadcidfont(pdf_font **fontp, pdf_xref *xref, fz_obj *dict, fz_obj *ref, fz_obj
error = nil;
if (error)
- return error;
+ return fz_rethrow(error, "cannot load system cmap %s", collection);
}
}
@@ -891,7 +891,7 @@ cleanup:
if (widths)
fz_dropobj(widths);
fz_dropfont((fz_font*)font);
- return error;
+ return fz_rethrow(error, "cannot load cid font");
}
static fz_error *
@@ -907,12 +907,15 @@ loadtype0(pdf_font **fontp, pdf_xref *xref, fz_obj *dict, fz_obj *ref)
dfonts = fz_dictgets(dict, "DescendantFonts");
error = pdf_resolve(&dfonts, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot find DescendantFonts");
dfont = fz_arrayget(dfonts, 0);
error = pdf_resolve(&dfont, xref);
if (error)
- return fz_dropobj(dfonts), error;
+ {
+ fz_dropobj(dfonts);
+ return fz_rethrow(error, "cannot find descendant font");
+ }
subtype = fz_dictgets(dfont, "Subtype");
encoding = fz_dictgets(dict, "Encoding");
@@ -929,7 +932,7 @@ loadtype0(pdf_font **fontp, pdf_xref *xref, fz_obj *dict, fz_obj *ref)
fz_dropobj(dfonts);
if (error)
- return error;
+ return fz_rethrow(error, "cannot load descendant font");
return nil;
}
@@ -948,7 +951,7 @@ pdf_loadfontdescriptor(pdf_font *font, pdf_xref *xref, fz_obj *desc, char *colle
error = pdf_resolve(&desc, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot find font descriptor");
pdf_logfont("load fontdescriptor {\n");
@@ -1000,7 +1003,7 @@ pdf_loadfontdescriptor(pdf_font *font, pdf_xref *xref, fz_obj *desc, char *colle
cleanup:
fz_dropobj(desc);
- return error;
+ return fz_rethrow(error, "cannot load font descriptor");
}
fz_error *
@@ -1025,14 +1028,14 @@ pdf_loadfont(pdf_font **fontp, pdf_xref *xref, fz_obj *dict, fz_obj *ref)
else if (!strcmp(subtype, "Type3"))
error = pdf_loadtype3font(fontp, xref, dict, ref);
else
- error = fz_throw("unimplemented: %s fonts", subtype);
+ return fz_throw("cannot recognize font format %s", subtype);
if (error)
- return error;
+ return fz_rethrow(error, "cannot load font");
error = pdf_storeitem(xref->store, PDF_KFONT, ref, *fontp);
if (error)
- return error;
+ return fz_rethrow(error, "cannot store font resource");
return nil;
}
diff --git a/mupdf/pdf_interpret.c b/mupdf/pdf_interpret.c
index 52619720..700b5c8f 100644
--- a/mupdf/pdf_interpret.c
+++ b/mupdf/pdf_interpret.c
@@ -165,7 +165,7 @@ runxobject(pdf_csi *csi, pdf_xref *xref, pdf_xobject *xobj, int istransparency)
/* gsave */
error = gsave(csi);
if (error)
- return error;
+ return fz_rethrow(error, "cannot push graphics state");
/* reset alpha to 1.0 when starting a new Transparency group */
if (istransparency) {
@@ -205,7 +205,7 @@ runxobject(pdf_csi *csi, pdf_xref *xref, pdf_xobject *xobj, int istransparency)
/* grestore */
error = grestore(csi);
if (error)
- return fz_rethrow(error, "cannot grestore");
+ return fz_rethrow(error, "cannot pop graphics state");
return fz_okay;
}
diff --git a/mupdf/pdf_nametree.c b/mupdf/pdf_nametree.c
index 706c0e50..49396c50 100644
--- a/mupdf/pdf_nametree.c
+++ b/mupdf/pdf_nametree.c
@@ -13,14 +13,17 @@ loadnametreenode(fz_obj *tree, pdf_xref *xref, fz_obj *node)
error = pdf_resolve(&node, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot resolve name tree");
names = fz_dictgets(node, "Names");
if (names)
{
error = pdf_resolve(&names, xref);
if (error)
- goto cleanup;
+ {
+ fz_dropobj(node);
+ return fz_rethrow(error, "cannot resolve /Names");
+ }
len = fz_arraylen(names) / 2;
@@ -32,7 +35,8 @@ loadnametreenode(fz_obj *tree, pdf_xref *xref, fz_obj *node)
if (error)
{
fz_dropobj(names);
- goto cleanup;
+ fz_dropobj(node);
+ return fz_rethrow(error, "cannot insert name tree entry");
}
}
@@ -44,7 +48,10 @@ loadnametreenode(fz_obj *tree, pdf_xref *xref, fz_obj *node)
{
error = pdf_resolve(&kids, xref);
if (error)
- goto cleanup;
+ {
+ fz_dropobj(node);
+ return fz_rethrow(error, "cannot resolve /Kids");
+ }
len = fz_arraylen(kids);
for (i = 0; i < len; ++i)
@@ -53,7 +60,8 @@ loadnametreenode(fz_obj *tree, pdf_xref *xref, fz_obj *node)
if (error)
{
fz_dropobj(kids);
- goto cleanup;
+ fz_dropobj(node);
+ return fz_rethrow(error, "cannot load name tree node");
}
}
@@ -62,10 +70,6 @@ loadnametreenode(fz_obj *tree, pdf_xref *xref, fz_obj *node)
fz_dropobj(node);
return nil;
-
-cleanup:
- fz_dropobj(node);
- return error;
}
fz_error *
@@ -76,13 +80,13 @@ pdf_loadnametree(fz_obj **dictp, pdf_xref *xref, fz_obj *root)
error = fz_newdict(&tree, 128);
if (error)
- return error;
+ return fz_rethrow(error, "cannot create name tree dictionary");
error = loadnametreenode(tree, xref, root);
if (error)
{
fz_dropobj(tree);
- return error;
+ return fz_rethrow(error, "cannot load name tree");
}
fz_sortdict(tree);
@@ -104,7 +108,7 @@ pdf_loadnametrees(pdf_xref *xref)
{
error = pdf_resolve(&dests, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot resolve /Dests");
xref->dests = dests;
return nil;
}
@@ -115,7 +119,7 @@ pdf_loadnametrees(pdf_xref *xref)
{
error = pdf_resolve(&names, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot resolve /Names");
dests = fz_dictgets(names, "Dests");
if (dests)
{
@@ -123,7 +127,7 @@ pdf_loadnametrees(pdf_xref *xref)
if (error)
{
fz_dropobj(names);
- return error;
+ return fz_rethrow(error, "cannot load name tree");
}
}
fz_dropobj(names);
diff --git a/mupdf/pdf_open.c b/mupdf/pdf_open.c
index e9facef4..9b7dfeb5 100644
--- a/mupdf/pdf_open.c
+++ b/mupdf/pdf_open.c
@@ -292,8 +292,8 @@ readnewxref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap)
if (oid < 0 || oid >= xref->len)
{
- error = fz_throw("object id out of range");
- goto cleanup;
+ fz_dropobj(trailer);
+ return fz_throw("object id out of range");
}
xref->table[oid].type = 'n';
@@ -304,15 +304,15 @@ readnewxref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap)
obj = fz_dictgets(trailer, "Size");
if (!obj)
{
- error = fz_throw("xref stream missing Size entry");
- goto cleanup;
+ fz_dropobj(trailer);
+ return fz_throw("xref stream missing Size entry");
}
size = fz_toint(obj);
obj = fz_dictgets(trailer, "W");
if (!obj) {
- error = fz_throw("xref stream missing W entry");
- goto cleanup;
+ fz_dropobj(trailer);
+ return fz_throw("xref stream missing W entry");
}
w0 = fz_toint(fz_arrayget(obj, 0));
w1 = fz_toint(fz_arrayget(obj, 1));
@@ -329,15 +329,15 @@ readnewxref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap)
}
if (i0 < 0 || i1 > xref->len) {
- error = fz_throw("xref stream has too many entries");
- goto cleanup;
+ fz_dropobj(trailer);
+ return fz_throw("xref stream has too many entries");
}
error = pdf_openstream(&stm, xref, oid, gen);
if (error)
{
- error = fz_rethrow(error, "cannot open compressed xref stream");
- goto cleanup;
+ fz_dropobj(trailer);
+ return fz_rethrow(error, "cannot open compressed xref stream");
}
for (i = i0; i < i0 + i1; i++)
@@ -348,13 +348,12 @@ readnewxref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap)
if (fz_peekbyte(stm) == EOF)
{
+ fz_dropstream(stm);
+ fz_dropobj(trailer);
error = fz_readerror(stm);
if (error)
- error = fz_rethrow(error, "truncated xref stream");
- else
- error = fz_throw("truncated xref stream");
- fz_dropstream(stm);
- goto cleanup;
+ return fz_rethrow(error, "truncated xref stream");
+ return fz_throw("truncated xref stream");
}
for (n = 0; n < w0; n++)
@@ -367,9 +366,9 @@ readnewxref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap)
error = fz_readerror(stm);
if (error)
{
- error = fz_rethrow(error, "truncated xref stream");
fz_dropstream(stm);
- goto cleanup;
+ fz_dropobj(trailer);
+ return fz_rethrow(error, "truncated xref stream");
}
if (!xref->table[i].type)
@@ -386,10 +385,6 @@ readnewxref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap)
*trailerp = trailer;
return nil;
-
-cleanup:
- fz_dropobj(trailer);
- return error;
}
static fz_error *
@@ -447,8 +442,8 @@ readxrefsections(pdf_xref *xref, int ofs, char *buf, int cap)
error = readxrefsections(xref, fz_toint(xrefstm), buf, cap);
if (error)
{
- error = fz_rethrow(error, "cannot read /XrefStm xref section");
- goto cleanup;
+ fz_dropobj(trailer);
+ return fz_rethrow(error, "cannot read /XrefStm xref section");
}
}
@@ -459,17 +454,13 @@ readxrefsections(pdf_xref *xref, int ofs, char *buf, int cap)
error = readxrefsections(xref, fz_toint(prev), buf, cap);
if (error)
{
- error = fz_rethrow(error, "cannot read /Prev xref section");
- goto cleanup;
+ fz_dropobj(trailer);
+ return fz_rethrow(error, "cannot read /Prev xref section");
}
}
fz_dropobj(trailer);
return nil;
-
-cleanup:
- fz_dropobj(trailer);
- return error;
}
/*
@@ -584,7 +575,7 @@ cleanupoid:
fz_free(oidbuf);
cleanupobj:
fz_dropobj(objstm);
- return error;
+ return error; /* already rethrown */
}
/*
diff --git a/mupdf/pdf_outline.c b/mupdf/pdf_outline.c
index c41d96f5..7bd47e51 100644
--- a/mupdf/pdf_outline.c
+++ b/mupdf/pdf_outline.c
@@ -21,7 +21,7 @@ loadoutline(pdf_outline **nodep, pdf_xref *xref, fz_obj *dict)
{
error = pdf_toutf8(&node->title, obj);
if (error)
- return error;
+ return fz_rethrow(error, "cannot convert Title to UTF-8");
pdf_logpage("title %s\n", node->title);
}
@@ -29,7 +29,7 @@ loadoutline(pdf_outline **nodep, pdf_xref *xref, fz_obj *dict)
{
error = pdf_loadlink(&node->link, xref, dict);
if (error)
- return error;
+ return fz_rethrow(error, "cannot load link");
}
obj = fz_dictgets(dict, "First");
@@ -37,11 +37,11 @@ loadoutline(pdf_outline **nodep, pdf_xref *xref, fz_obj *dict)
{
error = pdf_resolve(&obj, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot resolve /First");
error = loadoutline(&node->child, xref, obj);
fz_dropobj(obj);
if (error)
- return error;
+ return fz_rethrow(error, "cannot load outline");
}
pdf_logpage("}\n");
@@ -51,11 +51,11 @@ loadoutline(pdf_outline **nodep, pdf_xref *xref, fz_obj *dict)
{
error = pdf_resolve(&obj, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot resolve /Next");
error = loadoutline(&node->next, xref, obj);
fz_dropobj(obj);
if (error)
- return error;
+ return fz_rethrow(error, "cannot load outline");
}
*nodep = node;
@@ -79,7 +79,7 @@ pdf_loadoutline(pdf_outline **nodep, pdf_xref *xref)
{
error = pdf_resolve(&obj, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot resolve /Outlines");
first = fz_dictgets(obj, "First");
if (first)
@@ -87,11 +87,11 @@ pdf_loadoutline(pdf_outline **nodep, pdf_xref *xref)
error = pdf_resolve(&first, xref);
fz_dropobj(obj);
if (error)
- return error;
+ return fz_rethrow(error, "cannot resolve /First");
error = loadoutline(&node, xref, first);
fz_dropobj(first);
if (error)
- return error;
+ return fz_rethrow(error, "cannot load outline");
}
else
fz_dropobj(obj);
diff --git a/mupdf/pdf_page.c b/mupdf/pdf_page.c
index f509737b..1d9f9879 100644
--- a/mupdf/pdf_page.c
+++ b/mupdf/pdf_page.c
@@ -103,7 +103,7 @@ cleanupstm:
fz_dropstream(file);
cleanupbuf:
fz_dropbuffer(big);
- return error;
+ return error; /* already rethrown */
}
static fz_error *
diff --git a/mupdf/pdf_pagetree.c b/mupdf/pdf_pagetree.c
index 47c0362b..eb02c1ed 100644
--- a/mupdf/pdf_pagetree.c
+++ b/mupdf/pdf_pagetree.c
@@ -177,7 +177,7 @@ cleanup:
fz_free(p->pobj);
fz_free(p);
}
- return error;
+ return error; /* already rethrown */
}
int
diff --git a/mupdf/pdf_pattern.c b/mupdf/pdf_pattern.c
index c5668884..854bcf22 100644
--- a/mupdf/pdf_pattern.c
+++ b/mupdf/pdf_pattern.c
@@ -156,6 +156,6 @@ cleanupcsi:
pdf_dropcsi(csi);
cleanup:
pdf_droppattern(pat);
- return error;
+ return error; /* already rethrown */
}
diff --git a/mupdf/pdf_repair.c b/mupdf/pdf_repair.c
index ffced0e0..ecdbf530 100644
--- a/mupdf/pdf_repair.c
+++ b/mupdf/pdf_repair.c
@@ -366,6 +366,6 @@ pdf_repairxref(pdf_xref *xref, char *filename)
cleanup:
fz_dropstream(file);
fz_free(list);
- return error;
+ return error; /* already rethrown */
}
diff --git a/mupdf/pdf_save.c b/mupdf/pdf_save.c
index 1338493d..75c02e11 100644
--- a/mupdf/pdf_save.c
+++ b/mupdf/pdf_save.c
@@ -70,7 +70,7 @@ cleanupsrc:
fz_dropstream(srcstm);
cleanupdst:
fz_dropstream(dststm);
- return error;
+ return error; /* already rethrown */
}
static fz_error *
@@ -140,8 +140,8 @@ pdf_updatexref(pdf_xref *xref, char *path)
error = writeobject(out, xref, xref->crypt, oid, xref->table[oid].gen);
if (error)
{
- error = fz_rethrow(error, "cannot write object (oid=%d)", oid);
- goto cleanup;
+ fz_dropstream(out);
+ return fz_rethrow(error, "cannot write object (oid=%d)", oid);
}
}
}
@@ -212,12 +212,10 @@ pdf_updatexref(pdf_xref *xref, char *path)
xref->startxref = startxref;
- fz_dropstream(out);
- return fz_okay;
+ /* TODO: check for write errors */
-cleanup:
fz_dropstream(out);
- return error;
+ return fz_okay;
}
fz_error *
@@ -272,8 +270,9 @@ pdf_savexref(pdf_xref *xref, char *path, pdf_crypt *encrypt)
error = writeobject(out, xref, encrypt, oid, x->type == 'o' ? 0 : x->gen);
if (error)
{
- error = fz_rethrow(error, "cannot write object (oid=%d)", oid);
- goto cleanup;
+ if (ofsbuf) fz_free(ofsbuf);
+ fz_dropstream(out);
+ return fz_rethrow(error, "cannot write object (oid=%d)", oid);
}
}
else
@@ -325,13 +324,10 @@ pdf_savexref(pdf_xref *xref, char *path, pdf_crypt *encrypt)
xref->startxref = startxref;
+ /* TODO: check for write errors */
+
if(ofsbuf) fz_free(ofsbuf);
fz_dropstream(out);
return fz_okay;
-
-cleanup:
- if (ofsbuf) fz_free(ofsbuf);
- fz_dropstream(out);
- return error;
}
diff --git a/mupdf/pdf_stream.c b/mupdf/pdf_stream.c
index a6cf696c..24d3d11b 100644
--- a/mupdf/pdf_stream.c
+++ b/mupdf/pdf_stream.c
@@ -346,7 +346,7 @@ cleanup1:
fz_dropobj(filters);
cleanup0:
fz_dropfilter(base);
- return error;
+ return error; /* already rethrown */
}
/*
diff --git a/mupdf/pdf_type3.c b/mupdf/pdf_type3.c
index 27ecfa3a..66537d2d 100644
--- a/mupdf/pdf_type3.c
+++ b/mupdf/pdf_type3.c
@@ -46,11 +46,11 @@ t3render(fz_glyph *glyph, fz_font *fzfont, int cid, fz_matrix trm)
error = fz_newrenderer(&gc, pdf_devicegray, 1, GCMEM);
if (error)
- return error;
+ return fz_rethrow(error, "cannot create renderer");
error = fz_rendertree(&pixmap, gc, tree, ctm, bbox, 0);
fz_droprenderer(gc);
if (error)
- return error;
+ return fz_rethrow(error, "cannot render glyph");
assert(pixmap->n == 1);
@@ -316,6 +316,6 @@ cleanup2:
fz_dropobj(resources);
cleanup:
fz_dropfont((fz_font*)font);
- return error;
+ return fz_rethrow(error, "cannot load type3 font");
}
diff --git a/mupdf/pdf_unicode.c b/mupdf/pdf_unicode.c
index 2fb82233..dcb4e573 100644
--- a/mupdf/pdf_unicode.c
+++ b/mupdf/pdf_unicode.c
@@ -21,11 +21,14 @@ pdf_loadtounicode(pdf_font *font, pdf_xref *xref,
error = pdf_loadembeddedcmap(&cmap, xref, cmapstm);
if (error)
- return error;
+ return fz_rethrow(error, "cannot load embedded cmap");
error = pdf_newcmap(&font->tounicode);
if (error)
- goto cleanup;
+ {
+ pdf_dropcmap(cmap);
+ return fz_rethrow(error, "cannot create tounicode cmap");
+ }
for (i = 0; i < (strings ? 256 : 65536); i++)
{
@@ -37,18 +40,23 @@ pdf_loadtounicode(pdf_font *font, pdf_xref *xref,
{
error = pdf_maprangetorange(font->tounicode, cid, cid, ucs);
if (error)
- goto cleanup;
+ {
+ pdf_dropcmap(cmap);
+ return fz_rethrow(error, "cannot create tounicode mapping");
+ }
}
}
}
error = pdf_sortcmap(font->tounicode);
if (error)
- goto cleanup;
+ {
+ pdf_dropcmap(cmap);
+ return fz_rethrow(error, "cannot sort tounicode mappings");
+ }
- cleanup:
pdf_dropcmap(cmap);
- return error;
+ return nil;
}
else if (collection)
@@ -56,15 +64,18 @@ pdf_loadtounicode(pdf_font *font, pdf_xref *xref,
pdf_logfont("tounicode cid collection\n");
if (!strcmp(collection, "Adobe-CNS1"))
- return pdf_loadsystemcmap(&font->tounicode, "Adobe-CNS1-UCS2");
+ error = pdf_loadsystemcmap(&font->tounicode, "Adobe-CNS1-UCS2");
else if (!strcmp(collection, "Adobe-GB1"))
- return pdf_loadsystemcmap(&font->tounicode, "Adobe-GB1-UCS2");
+ error = pdf_loadsystemcmap(&font->tounicode, "Adobe-GB1-UCS2");
else if (!strcmp(collection, "Adobe-Japan1"))
- return pdf_loadsystemcmap(&font->tounicode, "Adobe-Japan1-UCS2");
+ error = pdf_loadsystemcmap(&font->tounicode, "Adobe-Japan1-UCS2");
else if (!strcmp(collection, "Adobe-Japan2"))
- return pdf_loadsystemcmap(&font->tounicode, "Adobe-Japan2-UCS2");
+ error = pdf_loadsystemcmap(&font->tounicode, "Adobe-Japan2-UCS2");
else if (!strcmp(collection, "Adobe-Korea1"))
- return pdf_loadsystemcmap(&font->tounicode, "Adobe-Korea1-UCS2");
+ error = pdf_loadsystemcmap(&font->tounicode, "Adobe-Korea1-UCS2");
+
+ if (error)
+ return fz_rethrow(error, "cannot load tounicode system cmap %s-UCS2", collection);
}
if (strings)
@@ -76,7 +87,7 @@ pdf_loadtounicode(pdf_font *font, pdf_xref *xref,
font->ncidtoucs = 256;
font->cidtoucs = fz_malloc(256 * sizeof(unsigned short));
if (!font->cidtoucs)
- return fz_outofmem;
+ return fz_throw("outofmem: tounicode cidtoucs table");
for (i = 0; i < 256; i++)
{
@@ -111,7 +122,7 @@ pdf_newtextline(pdf_textline **linep)
pdf_textline *line;
line = *linep = fz_malloc(sizeof(pdf_textline));
if (!line)
- return fz_outofmem;
+ return fz_throw("outofmem: textline struct");
line->len = 0;
line->cap = 0;
line->text = nil;
@@ -139,7 +150,7 @@ addtextchar(pdf_textline *line, fz_irect bbox, int c)
newcap = line->cap ? line->cap * 2 : 80;
newtext = fz_realloc(line->text, sizeof(pdf_textchar) * newcap);
if (!newtext)
- return fz_outofmem;
+ return fz_throw("outofmem: textline buffer resize");
line->cap = newcap;
line->text = newtext;
}
@@ -219,7 +230,7 @@ extracttext(pdf_textline **line, fz_node *node, fz_matrix ctm)
pdf_textline *newline;
error = pdf_newtextline(&newline);
if (error)
- return error;
+ return fz_rethrow(error, "cannot create new text line");
(*line)->next = newline;
*line = newline;
}
@@ -229,7 +240,7 @@ extracttext(pdf_textline **line, fz_node *node, fz_matrix ctm)
box.y0 = y; box.y1 = y;
error = addtextchar(*line, box, ' ');
if (error)
- return error;
+ return fz_rethrow(error, "cannot add character to text line");
}
vx = fz_transformpoint(trm, vx);
@@ -248,7 +259,7 @@ extracttext(pdf_textline **line, fz_node *node, fz_matrix ctm)
error = addtextchar(*line, box, c);
if (error)
- return error;
+ return fz_rethrow(error, "cannot add character to text line");
}
}
@@ -259,7 +270,7 @@ extracttext(pdf_textline **line, fz_node *node, fz_matrix ctm)
{
error = extracttext(line, node, ctm);
if (error)
- return error;
+ return fz_rethrow(error, "cannot extract text from display node");
}
return nil;
@@ -277,7 +288,7 @@ pdf_loadtextfromtree(pdf_textline **outp, fz_tree *tree, fz_matrix ctm)
error = pdf_newtextline(&root);
if (error)
- return error;
+ return fz_rethrow(error, "cannot create new text line");
line = root;
@@ -285,7 +296,7 @@ pdf_loadtextfromtree(pdf_textline **outp, fz_tree *tree, fz_matrix ctm)
if (error)
{
pdf_droptextline(root);
- return error;
+ return fz_rethrow(error, "cannot extract text from display tree");
}
*outp = root;
diff --git a/mupdf/pdf_xref.c b/mupdf/pdf_xref.c
index c9245bf0..7564855e 100644
--- a/mupdf/pdf_xref.c
+++ b/mupdf/pdf_xref.c
@@ -161,7 +161,7 @@ pdf_decryptxref(pdf_xref *xref)
{
error = pdf_resolve(&encrypt, xref);
if (error)
- return error;
+ return fz_rethrow(error, "cannot resolve /Encrypt object");
if (fz_isnull(encrypt))
{
diff --git a/stream/obj_dict.c b/stream/obj_dict.c
index a93ae1bd..a3366170 100644
--- a/stream/obj_dict.c
+++ b/stream/obj_dict.c
@@ -325,10 +325,13 @@ fz_dictputs(fz_obj *obj, char *key, fz_obj *val)
fz_error *error;
fz_obj *keyobj;
error = fz_newname(&keyobj, key);
- if (error) return error;
+ if (error)
+ return fz_rethrow(error, "cannot create dict key");
error = fz_dictput(obj, keyobj, val);
fz_dropobj(keyobj);
- return error;
+ if (error)
+ return fz_rethrow(error, "cannot insert dict entry");
+ return nil;
}
fz_error *
diff --git a/stream/obj_parse.c b/stream/obj_parse.c
index 316e8ad4..8f43a064 100644
--- a/stream/obj_parse.c
+++ b/stream/obj_parse.c
@@ -181,7 +181,7 @@ cleanup:
if (dict) fz_dropobj(dict);
*obj = nil;
*sp = s;
- return error;
+ return error; /* already rethrown */
}
static fz_error *parsearray(fz_obj **obj, char **sp, struct vap *v)
@@ -462,7 +462,7 @@ static fz_error *parseobj(fz_obj **obj, char **sp, struct vap *v)
error = fz_throw("syntax error: unknown byte 0x%d", *s);
*sp = s;
- return error;
+ return error; /* already rethrown */
}
fz_error *
@@ -476,12 +476,12 @@ fz_packobj(fz_obj **op, char *fmt, ...)
va_copy(v.ap, ap);
error = parseobj(op, &fmt, &v);
- if (error)
- error = fz_rethrow(error, "cannot parse object");
va_end(ap);
- return error;
+ if (error)
+ return fz_rethrow(error, "cannot parse object");
+ return nil;
}
fz_error *
diff --git a/stream/stm_write.c b/stream/stm_write.c
index 23b268d9..9f136292 100644
--- a/stream/stm_write.c
+++ b/stream/stm_write.c
@@ -266,10 +266,10 @@ fz_printobj(fz_stream *file, fz_obj *obj, int tight)
return fz_throw("outofmem: scratch buffer");
fz_sprintobj(ptr, n, obj, tight);
error = fz_write(file, ptr, n);
- if (error)
- error = fz_rethrow(error, "cannot write buffer");
fz_free(ptr);
- return error;
+ if (error)
+ return fz_rethrow(error, "cannot write buffer");
+ return fz_okay;
}
}
@@ -303,11 +303,11 @@ fz_print(fz_stream *stm, char *fmt, ...)
va_end(ap);
error = fz_write(stm, p, n);
- if (error)
- error = fz_rethrow(error, "cannot write buffer");
fz_free(p);
- return error;
+ if (error)
+ return fz_rethrow(error, "cannot write buffer");
+ return fz_okay;
}
diff --git a/world/node_optimize.c b/world/node_optimize.c
index 69ca59cc..d284ce08 100644
--- a/world/node_optimize.c
+++ b/world/node_optimize.c
@@ -253,11 +253,11 @@ static fz_error *clean1x1(fz_node *node)
{
error = fz_newpixmap(&pix, 0, 0, 1, 1, image->n + 1);
if (error)
- return error;
+ return fz_rethrow(error, "cannot create 1x1 pixmap");
error = image->loadtile(image, pix);
if (error)
- return error;
+ return fz_rethrow(error, "cannot load pixmap tile");
for (i = 0; i < image->n; i++)
v[i] = pix->samples[i + 1] / 255.0;
@@ -266,10 +266,10 @@ static fz_error *clean1x1(fz_node *node)
error = fz_newsolidnode(&color, 1.0, image->cs, image->n, v);
if (error)
- return error;
+ return fz_rethrow(error, "cannot create color node");
error = fz_newmasknode(&mask);
if (error)
- return error;
+ return fz_rethrow(error, "cannot create mask node");
fz_insertnodeafter(current, mask);
fz_insertnodelast(mask, (fz_node*)rect);
@@ -290,7 +290,7 @@ static fz_error *clean1x1(fz_node *node)
error = clean1x1(current);
if (error)
- return error;
+ return fz_rethrow(error, "cannot perform clean1x1 optimization");
}
return nil;