... | ... |
@@ -439,6 +439,7 @@ static int filter_flatedecode(struct pdf_struct *pdf, struct pdf_obj *obj, |
439 | 439 |
inflateEnd(&stream); |
440 | 440 |
if (!nbytes) { |
441 | 441 |
pdfobj_flag(pdf, obj, BAD_FLATESTART); |
442 |
+ cli_dbgmsg("filter_flatedecode: No bytes, returning CL_EFORMAT for this stream.\n"); |
|
442 | 443 |
return CL_EFORMAT; |
443 | 444 |
} else { |
444 | 445 |
pdfobj_flag(pdf, obj, BAD_FLATE); |
... | ... |
@@ -1951,7 +1952,7 @@ int cli_pdf(const char *dir, cli_ctx *ctx, off_t offset) |
1951 | 1951 |
off_t map_off, bytesleft; |
1952 | 1952 |
long xref; |
1953 | 1953 |
const char *pdfver, *start, *eofmap, *q, *eof; |
1954 |
- int rc; |
|
1954 |
+ int rc, badobjects = 0; |
|
1955 | 1955 |
unsigned i; |
1956 | 1956 |
|
1957 | 1957 |
cli_dbgmsg("in cli_pdf(%s)\n", dir); |
... | ... |
@@ -2047,7 +2048,7 @@ int cli_pdf(const char *dir, cli_ctx *ctx, off_t offset) |
2047 | 2047 |
} |
2048 | 2048 |
rc = run_pdf_hooks(&pdf, PDF_PHASE_PRE, -1, -1); |
2049 | 2049 |
if (rc) { |
2050 |
- cli_dbgmsg("cli_pdf: returning %d\n", rc); |
|
2050 |
+ cli_dbgmsg("cli_pdf: (pre hooks) returning %d\n", rc); |
|
2051 | 2051 |
return rc == CL_BREAK ? CL_CLEAN : rc; |
2052 | 2052 |
} |
2053 | 2053 |
/* parse PDF and find obj offsets */ |
... | ... |
@@ -2088,6 +2089,12 @@ int cli_pdf(const char *dir, cli_ctx *ctx, off_t offset) |
2088 | 2088 |
for (i=0;!rc && i<pdf.nobjs;i++) { |
2089 | 2089 |
struct pdf_obj *obj = &pdf.objs[i]; |
2090 | 2090 |
rc = pdf_extract_obj(&pdf, obj); |
2091 |
+ if (rc == CL_EFORMAT) { |
|
2092 |
+ /* Don't halt on one bad object */ |
|
2093 |
+ cli_dbgmsg("cli_pdf: bad format object, skipping to next\n"); |
|
2094 |
+ badobjects++; |
|
2095 |
+ rc = CL_CLEAN; |
|
2096 |
+ } |
|
2091 | 2097 |
} |
2092 | 2098 |
|
2093 | 2099 |
if (pdf.flags & (1 << ENCRYPTED_PDF)) |
... | ... |
@@ -2118,10 +2125,16 @@ int cli_pdf(const char *dir, cli_ctx *ctx, off_t offset) |
2118 | 2118 |
} |
2119 | 2119 |
#endif |
2120 | 2120 |
} |
2121 |
+ |
|
2122 |
+ if (!rc && badobjects) { |
|
2123 |
+ rc = CL_EFORMAT; |
|
2124 |
+ } |
|
2125 |
+ |
|
2121 | 2126 |
cli_dbgmsg("cli_pdf: returning %d\n", rc); |
2122 | 2127 |
free(pdf.objs); |
2123 | 2128 |
free(pdf.fileID); |
2124 | 2129 |
free(pdf.key); |
2130 |
+ |
|
2125 | 2131 |
/* PDF hooks may abort, don't return CL_BREAK to caller! */ |
2126 | 2132 |
return rc == CL_BREAK ? CL_CLEAN : rc; |
2127 | 2133 |
} |