git-svn-id: file:///var/lib/svn/clamav-devel/trunk/clamav-devel@1589 77e5149b-7576-45b1-b177-96237e5ba77b
Nigel Horne authored on 2005/05/27 23:44:00... | ... |
@@ -15,7 +15,7 @@ |
15 | 15 |
* along with this program; if not, write to the Free Software |
16 | 16 |
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
17 | 17 |
*/ |
18 |
-static char const rcsid[] = "$Id: pdf.c,v 1.21 2005/05/27 13:57:02 nigelhorne Exp $"; |
|
18 |
+static char const rcsid[] = "$Id: pdf.c,v 1.22 2005/05/27 14:44:00 nigelhorne Exp $"; |
|
19 | 19 |
|
20 | 20 |
#if HAVE_CONFIG_H |
21 | 21 |
#include "clamav-config.h" |
... | ... |
@@ -57,6 +57,7 @@ static char const rcsid[] = "$Id: pdf.c,v 1.21 2005/05/27 13:57:02 nigelhorne Ex |
57 | 57 |
static int flatedecode(const unsigned char *buf, size_t len, int fout); |
58 | 58 |
static int ascii85decode(const char *buf, size_t len, unsigned char *output); |
59 | 59 |
static const char *pdf_nextlinestart(const char *ptr, size_t len); |
60 |
+static const char *pdf_nexttoken(const char *ptr, size_t len); |
|
60 | 61 |
|
61 | 62 |
int |
62 | 63 |
cli_pdf(const char *dir, int desc) |
... | ... |
@@ -188,7 +189,8 @@ cli_pdf(const char *dir, int desc) |
188 | 188 |
/* |
189 | 189 |
* TODO: handle F and FFilter? |
190 | 190 |
*/ |
191 |
- for(q = objstart; q < streamstart; q++) |
|
191 |
+ q = objstart; |
|
192 |
+ while(q < streamstart) { |
|
192 | 193 |
if(*q == '/') { |
193 | 194 |
if(strncmp(++q, "Length ", 7) == 0) { |
194 | 195 |
q += 7; |
... | ... |
@@ -204,6 +206,10 @@ cli_pdf(const char *dir, int desc) |
204 | 204 |
q += 13; |
205 | 205 |
} |
206 | 206 |
} |
207 |
+ q = pdf_nexttoken(q, (size_t)(streamstart - q)); |
|
208 |
+ if(q == NULL) |
|
209 |
+ break; |
|
210 |
+ } |
|
207 | 211 |
|
208 | 212 |
/* objend points to the end of the object (start of "endobj") */ |
209 | 213 |
streamstart += 6; /* go past the word "stream" */ |
... | ... |
@@ -348,9 +354,6 @@ flatedecode(const unsigned char *buf, size_t len, int fout) |
348 | 348 |
return inflateEnd(&stream); |
349 | 349 |
} |
350 | 350 |
|
351 |
-/* |
|
352 |
- * http://cvs.gnome.org/viewcvs/sketch/Filter/ascii85filter.c?rev=1.2 |
|
353 |
- */ |
|
354 | 351 |
/* ascii85 inflation, returns number of bytes in output, -1 for error */ |
355 | 352 |
static int |
356 | 353 |
ascii85decode(const char *buf, size_t len, unsigned char *output) |
... | ... |
@@ -433,3 +436,55 @@ pdf_nextlinestart(const char *ptr, size_t len) |
433 | 433 |
} |
434 | 434 |
return ptr; |
435 | 435 |
} |
436 |
+ |
|
437 |
+/* |
|
438 |
+ * Return the next PDF token. This assumes that we're not in a stream |
|
439 |
+ */ |
|
440 |
+static const char * |
|
441 |
+pdf_nexttoken(const char *ptr, size_t len) |
|
442 |
+{ |
|
443 |
+ const char *p; |
|
444 |
+ int intoken = 1; |
|
445 |
+ |
|
446 |
+ while(len) { |
|
447 |
+ switch(*ptr) { |
|
448 |
+ case '\n': |
|
449 |
+ case '\r': |
|
450 |
+ case '%': /* comment */ |
|
451 |
+ p = pdf_nextlinestart(ptr, len); |
|
452 |
+ if(p == NULL) |
|
453 |
+ return NULL; |
|
454 |
+ len -= (size_t)(p - ptr); |
|
455 |
+ ptr = p; |
|
456 |
+ intoken = 0; |
|
457 |
+ break; |
|
458 |
+ |
|
459 |
+ /*case '(': |
|
460 |
+ case ')': |
|
461 |
+ case '<': |
|
462 |
+ case '>': |
|
463 |
+ case '[': |
|
464 |
+ case ']': |
|
465 |
+ case '{': |
|
466 |
+ case '}': |
|
467 |
+ case '/': |
|
468 |
+ if(!intoken) |
|
469 |
+ return ptr; |
|
470 |
+ ptr++; |
|
471 |
+ len--; |
|
472 |
+ break;*/ |
|
473 |
+ case ' ': |
|
474 |
+ case '\t': |
|
475 |
+ intoken = 0; |
|
476 |
+ ptr++; |
|
477 |
+ len--; |
|
478 |
+ break; |
|
479 |
+ default: |
|
480 |
+ if(!intoken) |
|
481 |
+ return ptr; |
|
482 |
+ ptr++; |
|
483 |
+ len--; |
|
484 |
+ } |
|
485 |
+ } |
|
486 |
+ return NULL; |
|
487 |
+} |