Browse code

Added pdf_nexttoken

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
Showing 1 changed files
... ...
@@ -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
+}