|
Lines 96-102
Link Here
|
| 96 |
} |
96 |
} |
| 97 |
nObjects = obj1.getInt(); |
97 |
nObjects = obj1.getInt(); |
| 98 |
obj1.free(); |
98 |
obj1.free(); |
| 99 |
if (nObjects == 0) { |
99 |
if (nObjects <= 0) { |
| 100 |
goto err1; |
100 |
goto err1; |
| 101 |
} |
101 |
} |
| 102 |
|
102 |
|
|
Lines 106-112
Link Here
|
| 106 |
} |
106 |
} |
| 107 |
first = obj1.getInt(); |
107 |
first = obj1.getInt(); |
| 108 |
obj1.free(); |
108 |
obj1.free(); |
|
|
109 |
if (first < 0) { |
| 110 |
goto err1; |
| 111 |
} |
| 109 |
|
112 |
|
|
|
113 |
if (nObjects*sizeof(int)/sizeof(int) != nObjects) { |
| 114 |
error(-1, "Invalid 'nObjects'"); |
| 115 |
goto err1; |
| 116 |
} |
| 117 |
|
| 110 |
objs = new Object[nObjects]; |
118 |
objs = new Object[nObjects]; |
| 111 |
objNums = (int *)gmalloc(nObjects * sizeof(int)); |
119 |
objNums = (int *)gmalloc(nObjects * sizeof(int)); |
| 112 |
offsets = (int *)gmalloc(nObjects * sizeof(int)); |
120 |
offsets = (int *)gmalloc(nObjects * sizeof(int)); |
|
Lines 130-135
Link Here
|
| 130 |
offsets[i] = obj2.getInt(); |
138 |
offsets[i] = obj2.getInt(); |
| 131 |
obj1.free(); |
139 |
obj1.free(); |
| 132 |
obj2.free(); |
140 |
obj2.free(); |
|
|
141 |
if (objNums[i] < 0 || offsets[i] < 0 || |
| 142 |
(i > 0 && offsets[i] < offsets[i-1])) { |
| 143 |
delete parser; |
| 144 |
gfree(offsets); |
| 145 |
goto err1; |
| 146 |
} |
| 133 |
} |
147 |
} |
| 134 |
while (str->getChar() != EOF) ; |
148 |
while (str->getChar() != EOF) ; |
| 135 |
delete parser; |
149 |
delete parser; |
|
Lines 369-378
Link Here
|
| 369 |
} |
383 |
} |
| 370 |
n = obj.getInt(); |
384 |
n = obj.getInt(); |
| 371 |
obj.free(); |
385 |
obj.free(); |
|
|
386 |
if (first < 0 || n < 0 || first + n < 0) { |
| 387 |
goto err1; |
| 388 |
} |
| 372 |
if (first + n > size) { |
389 |
if (first + n > size) { |
| 373 |
for (newSize = size ? 2 * size : 1024; |
390 |
for (newSize = size ? 2 * size : 1024; |
| 374 |
first + n > newSize; |
391 |
first + n > newSize && newSize > 0; |
| 375 |
newSize <<= 1) ; |
392 |
newSize <<= 1) ; |
|
|
393 |
if (newSize < 0) { |
| 394 |
goto err1; |
| 395 |
} |
| 396 |
if (newSize*sizeof(XRefEntry)/sizeof(XRefEntry) != newSize) { |
| 397 |
error(-1, "Invalid 'obj' parameters'"); |
| 398 |
goto err1; |
| 399 |
} |
| 400 |
|
| 376 |
entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry)); |
401 |
entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry)); |
| 377 |
for (i = size; i < newSize; ++i) { |
402 |
for (i = size; i < newSize; ++i) { |
| 378 |
entries[i].offset = 0xffffffff; |
403 |
entries[i].offset = 0xffffffff; |
|
Lines 443-449
Link Here
|
| 443 |
|
468 |
|
| 444 |
// check for an 'XRefStm' key |
469 |
// check for an 'XRefStm' key |
| 445 |
if (obj.getDict()->lookup("XRefStm", &obj2)->isInt()) { |
470 |
if (obj.getDict()->lookup("XRefStm", &obj2)->isInt()) { |
| 446 |
pos2 = obj2.getInt(); |
471 |
pos2 = (Guint)obj2.getInt(); |
| 447 |
readXRef(&pos2); |
472 |
readXRef(&pos2); |
| 448 |
if (!ok) { |
473 |
if (!ok) { |
| 449 |
goto err1; |
474 |
goto err1; |
|
Lines 474-480
Link Here
|
| 474 |
} |
499 |
} |
| 475 |
newSize = obj.getInt(); |
500 |
newSize = obj.getInt(); |
| 476 |
obj.free(); |
501 |
obj.free(); |
|
|
502 |
if (newSize < 0) { |
| 503 |
goto err1; |
| 504 |
} |
| 477 |
if (newSize > size) { |
505 |
if (newSize > size) { |
|
|
506 |
if (newSize * sizeof(XRefEntry)/sizeof(XRefEntry) != newSize) { |
| 507 |
error(-1, "Invalid 'size' parameter."); |
| 508 |
return gFalse; |
| 509 |
} |
| 478 |
entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry)); |
510 |
entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry)); |
| 479 |
for (i = size; i < newSize; ++i) { |
511 |
for (i = size; i < newSize; ++i) { |
| 480 |
entries[i].offset = 0xffffffff; |
512 |
entries[i].offset = 0xffffffff; |
|
Lines 494-499
Link Here
|
| 494 |
} |
526 |
} |
| 495 |
w[i] = obj2.getInt(); |
527 |
w[i] = obj2.getInt(); |
| 496 |
obj2.free(); |
528 |
obj2.free(); |
|
|
529 |
if (w[i] < 0 || w[i] > 4) { |
| 530 |
goto err1; |
| 531 |
} |
| 497 |
} |
532 |
} |
| 498 |
obj.free(); |
533 |
obj.free(); |
| 499 |
|
534 |
|
|
Lines 513-525
Link Here
|
| 513 |
} |
548 |
} |
| 514 |
n = obj.getInt(); |
549 |
n = obj.getInt(); |
| 515 |
obj.free(); |
550 |
obj.free(); |
| 516 |
if (!readXRefStreamSection(xrefStr, w, first, n)) { |
551 |
if (first < 0 || n < 0 || |
|
|
552 |
!readXRefStreamSection(xrefStr, w, first, n)) { |
| 517 |
idx.free(); |
553 |
idx.free(); |
| 518 |
goto err0; |
554 |
goto err0; |
| 519 |
} |
555 |
} |
| 520 |
} |
556 |
} |
| 521 |
} else { |
557 |
} else { |
| 522 |
if (!readXRefStreamSection(xrefStr, w, 0, size)) { |
558 |
if (!readXRefStreamSection(xrefStr, w, 0, newSize)) { |
| 523 |
idx.free(); |
559 |
idx.free(); |
| 524 |
goto err0; |
560 |
goto err0; |
| 525 |
} |
561 |
} |
|
Lines 551-560
Link Here
|
| 551 |
Guint offset; |
587 |
Guint offset; |
| 552 |
int type, gen, c, newSize, i, j; |
588 |
int type, gen, c, newSize, i, j; |
| 553 |
|
589 |
|
|
|
590 |
if (first + n < 0) { |
| 591 |
return gFalse; |
| 592 |
} |
| 554 |
if (first + n > size) { |
593 |
if (first + n > size) { |
| 555 |
for (newSize = size ? 2 * size : 1024; |
594 |
for (newSize = size ? 2 * size : 1024; |
| 556 |
first + n > newSize; |
595 |
first + n > newSize && newSize > 0; |
| 557 |
newSize <<= 1) ; |
596 |
newSize <<= 1) ; |
|
|
597 |
if (newSize < 0) { |
| 598 |
return gFalse; |
| 599 |
} |
| 600 |
if (newSize*sizeof(XRefEntry)/sizeof(XRefEntry) != newSize) { |
| 601 |
error(-1, "Invalid 'size' inside xref table."); |
| 602 |
return gFalse; |
| 603 |
} |
| 558 |
entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry)); |
604 |
entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry)); |
| 559 |
for (i = size; i < newSize; ++i) { |
605 |
for (i = size; i < newSize; ++i) { |
| 560 |
entries[i].offset = 0xffffffff; |
606 |
entries[i].offset = 0xffffffff; |
|
Lines 585-608
Link Here
|
| 585 |
} |
631 |
} |
| 586 |
gen = (gen << 8) + c; |
632 |
gen = (gen << 8) + c; |
| 587 |
} |
633 |
} |
| 588 |
switch (type) { |
634 |
if (entries[i].offset == 0xffffffff) { |
| 589 |
case 0: |
635 |
switch (type) { |
| 590 |
entries[i].offset = offset; |
636 |
case 0: |
| 591 |
entries[i].gen = gen; |
637 |
entries[i].offset = offset; |
| 592 |
entries[i].type = xrefEntryFree; |
638 |
entries[i].gen = gen; |
| 593 |
break; |
639 |
entries[i].type = xrefEntryFree; |
| 594 |
case 1: |
640 |
break; |
| 595 |
entries[i].offset = offset; |
641 |
case 1: |
| 596 |
entries[i].gen = gen; |
642 |
entries[i].offset = offset; |
| 597 |
entries[i].type = xrefEntryUncompressed; |
643 |
entries[i].gen = gen; |
| 598 |
break; |
644 |
entries[i].type = xrefEntryUncompressed; |
| 599 |
case 2: |
645 |
break; |
| 600 |
entries[i].offset = offset; |
646 |
case 2: |
| 601 |
entries[i].gen = gen; |
647 |
entries[i].offset = offset; |
| 602 |
entries[i].type = xrefEntryCompressed; |
648 |
entries[i].gen = gen; |
| 603 |
break; |
649 |
entries[i].type = xrefEntryCompressed; |
| 604 |
default: |
650 |
break; |
| 605 |
return gFalse; |
651 |
default: |
|
|
652 |
return gFalse; |
| 653 |
} |
| 606 |
} |
654 |
} |
| 607 |
} |
655 |
} |
| 608 |
|
656 |
|
|
Lines 664-701
Link Here
|
| 664 |
// look for object |
712 |
// look for object |
| 665 |
} else if (isdigit(*p)) { |
713 |
} else if (isdigit(*p)) { |
| 666 |
num = atoi(p); |
714 |
num = atoi(p); |
| 667 |
do { |
715 |
if (num > 0) { |
| 668 |
++p; |
|
|
| 669 |
} while (*p && isdigit(*p)); |
| 670 |
if (isspace(*p)) { |
| 671 |
do { |
716 |
do { |
| 672 |
++p; |
717 |
++p; |
| 673 |
} while (*p && isspace(*p)); |
718 |
} while (*p && isdigit(*p)); |
| 674 |
if (isdigit(*p)) { |
719 |
if (isspace(*p)) { |
| 675 |
gen = atoi(p); |
|
|
| 676 |
do { |
720 |
do { |
| 677 |
++p; |
721 |
++p; |
| 678 |
} while (*p && isdigit(*p)); |
722 |
} while (*p && isspace(*p)); |
| 679 |
if (isspace(*p)) { |
723 |
if (isdigit(*p)) { |
|
|
724 |
gen = atoi(p); |
| 680 |
do { |
725 |
do { |
| 681 |
++p; |
726 |
++p; |
| 682 |
} while (*p && isspace(*p)); |
727 |
} while (*p && isdigit(*p)); |
| 683 |
if (!strncmp(p, "obj", 3)) { |
728 |
if (isspace(*p)) { |
| 684 |
if (num >= size) { |
729 |
do { |
| 685 |
newSize = (num + 1 + 255) & ~255; |
730 |
++p; |
| 686 |
entries = (XRefEntry *) |
731 |
} while (*p && isspace(*p)); |
| 687 |
grealloc(entries, newSize * sizeof(XRefEntry)); |
732 |
if (!strncmp(p, "obj", 3)) { |
| 688 |
for (i = size; i < newSize; ++i) { |
733 |
if (num >= size) { |
| 689 |
entries[i].offset = 0xffffffff; |
734 |
newSize = (num + 1 + 255) & ~255; |
| 690 |
entries[i].type = xrefEntryFree; |
735 |
if (newSize < 0) { |
|
|
736 |
error(-1, "Bad object number"); |
| 737 |
return gFalse; |
| 738 |
} |
| 739 |
if (newSize*sizeof(XRefEntry)/sizeof(XRefEntry) != newSize) { |
| 740 |
error(-1, "Invalid 'obj' parameters."); |
| 741 |
return gFalse; |
| 742 |
} |
| 743 |
entries = (XRefEntry *) |
| 744 |
grealloc(entries, newSize * sizeof(XRefEntry)); |
| 745 |
for (i = size; i < newSize; ++i) { |
| 746 |
entries[i].offset = 0xffffffff; |
| 747 |
entries[i].type = xrefEntryFree; |
| 748 |
} |
| 749 |
size = newSize; |
| 750 |
} |
| 751 |
if (entries[num].type == xrefEntryFree || |
| 752 |
gen >= entries[num].gen) { |
| 753 |
entries[num].offset = pos - start; |
| 754 |
entries[num].gen = gen; |
| 755 |
entries[num].type = xrefEntryUncompressed; |
| 691 |
} |
756 |
} |
| 692 |
size = newSize; |
|
|
| 693 |
} |
| 694 |
if (entries[num].type == xrefEntryFree || |
| 695 |
gen >= entries[num].gen) { |
| 696 |
entries[num].offset = pos - start; |
| 697 |
entries[num].gen = gen; |
| 698 |
entries[num].type = xrefEntryUncompressed; |
| 699 |
} |
757 |
} |
| 700 |
} |
758 |
} |
| 701 |
} |
759 |
} |
|
Lines 705-710
Link Here
|
| 705 |
} else if (!strncmp(p, "endstream", 9)) { |
763 |
} else if (!strncmp(p, "endstream", 9)) { |
| 706 |
if (streamEndsLen == streamEndsSize) { |
764 |
if (streamEndsLen == streamEndsSize) { |
| 707 |
streamEndsSize += 64; |
765 |
streamEndsSize += 64; |
|
|
766 |
if (streamEndsSize*sizeof(int)/sizeof(int) != streamEndsSize) { |
| 767 |
error(-1, "Invalid 'endstream' parameter."); |
| 768 |
return gFalse; |
| 769 |
} |
| 708 |
streamEnds = (Guint *)grealloc(streamEnds, |
770 |
streamEnds = (Guint *)grealloc(streamEnds, |
| 709 |
streamEndsSize * sizeof(int)); |
771 |
streamEndsSize * sizeof(int)); |
| 710 |
} |
772 |
} |