Browse code

pdf: continue to next object after single object error

David Raynor authored on 2012/12/18 01:12:11
Showing 1 changed files
... ...
@@ -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
 }