... | ... |
@@ -1,3 +1,7 @@ |
1 |
+Sat Oct 8 12:19:49 EEST 2011 (edwin) |
|
2 |
+------------------------------------- |
|
3 |
+ * libclamav/pdf.c: flag and dump PDF objects with /Launch (bb #3514) |
|
4 |
+ |
|
1 | 5 |
Sat Oct 8 12:10:13 EEST 2011 (edwin) |
2 | 6 |
------------------------------------- |
3 | 7 |
* libclamav/bytecode.c,bytecode_api.c: fix recursion level crash (bb #3706). |
... | ... |
@@ -102,7 +102,8 @@ enum pdf_flag { |
102 | 102 |
BAD_STREAMLEN, |
103 | 103 |
ENCRYPTED_PDF, |
104 | 104 |
LINEARIZED_PDF, /* not bad, just as flag */ |
105 |
- DECRYPTABLE_PDF |
|
105 |
+ DECRYPTABLE_PDF, |
|
106 |
+ HAS_LAUNCHACTION |
|
106 | 107 |
}; |
107 | 108 |
|
108 | 109 |
/** PDF obj flags */ |
... | ... |
@@ -128,7 +129,8 @@ enum pdf_objflags { |
128 | 128 |
OBJ_IMAGE, |
129 | 129 |
OBJ_TRUNCATED, |
130 | 130 |
OBJ_FORCEDUMP, |
131 |
- OBJ_FILTER_STANDARD |
|
131 |
+ OBJ_FILTER_STANDARD, |
|
132 |
+ OBJ_LAUNCHACTION |
|
132 | 133 |
}; |
133 | 134 |
|
134 | 135 |
#ifdef __CLAMBC__ |
... | ... |
@@ -281,6 +281,9 @@ static void pdfobj_flag(struct pdf_struct *pdf, struct pdf_obj *obj, enum pdf_fl |
281 | 281 |
case HAS_OPENACTION: |
282 | 282 |
s = "has /OpenAction"; |
283 | 283 |
break; |
284 |
+ case HAS_LAUNCHACTION: |
|
285 |
+ s = "has /LaunchAction"; |
|
286 |
+ break; |
|
284 | 287 |
case BAD_STREAMLEN: |
285 | 288 |
s = "bad /Length, too small"; |
286 | 289 |
break; |
... | ... |
@@ -493,7 +496,7 @@ static int find_length(struct pdf_struct *pdf, |
493 | 493 |
return length; |
494 | 494 |
} |
495 | 495 |
|
496 |
-#define DUMP_MASK ((1 << OBJ_FILTER_FLATE) | (1 << OBJ_FILTER_DCT) | (1 << OBJ_FILTER_AH) | (1 << OBJ_FILTER_A85) | (1 << OBJ_EMBEDDED_FILE) | (1 << OBJ_JAVASCRIPT) | (1 << OBJ_OPENACTION)) |
|
496 |
+#define DUMP_MASK ((1 << OBJ_FILTER_FLATE) | (1 << OBJ_FILTER_DCT) | (1 << OBJ_FILTER_AH) | (1 << OBJ_FILTER_A85) | (1 << OBJ_EMBEDDED_FILE) | (1 << OBJ_JAVASCRIPT) | (1 << OBJ_OPENACTION) | (1 << OBJ_LAUNCHACTION)) |
|
497 | 497 |
|
498 | 498 |
static int obj_size(struct pdf_struct *pdf, struct pdf_obj *obj, int binary) |
499 | 499 |
{ |
... | ... |
@@ -771,6 +774,7 @@ enum objstate { |
771 | 771 |
STATE_JAVASCRIPT, |
772 | 772 |
STATE_OPENACTION, |
773 | 773 |
STATE_LINEARIZED, |
774 |
+ STATE_LAUNCHACTION, |
|
774 | 775 |
STATE_ANY /* for actions table below */ |
775 | 776 |
}; |
776 | 777 |
|
... | ... |
@@ -811,7 +815,8 @@ static struct pdfname_action pdfname_actions[] = { |
811 | 811 |
{"Length", OBJ_DICT, STATE_FILTER, STATE_NONE}, |
812 | 812 |
{"S", OBJ_DICT, STATE_NONE, STATE_S}, |
813 | 813 |
{"Type", OBJ_DICT, STATE_NONE, STATE_NONE}, |
814 |
- {"OpenAction", OBJ_OPENACTION, STATE_ANY, STATE_OPENACTION} |
|
814 |
+ {"OpenAction", OBJ_OPENACTION, STATE_ANY, STATE_OPENACTION}, |
|
815 |
+ {"Launch", OBJ_LAUNCHACTION, STATE_ANY, STATE_LAUNCHACTION} |
|
815 | 816 |
}; |
816 | 817 |
|
817 | 818 |
#define KNOWN_FILTERS ((1 << OBJ_FILTER_AH) | (1 << OBJ_FILTER_RL) | (1 << OBJ_FILTER_A85) | (1 << OBJ_FILTER_FLATE) | (1 << OBJ_FILTER_LZW) | (1 << OBJ_FILTER_FAX) | (1 << OBJ_FILTER_DCT) | (1 << OBJ_FILTER_JPX) | (1 << OBJ_FILTER_CRYPT)) |
... | ... |
@@ -946,6 +951,8 @@ static void pdf_parseobj(struct pdf_struct *pdf, struct pdf_obj *obj) |
946 | 946 |
pdfobj_flag(pdf, obj, LINEARIZED_PDF); |
947 | 947 |
objstate = STATE_NONE; |
948 | 948 |
} |
949 |
+ if (objstate == STATE_LAUNCHACTION) |
|
950 |
+ pdfobj_flag(pdf, obj, HAS_LAUNCHACTION); |
|
949 | 951 |
if (dict_length > 0 && (objstate == STATE_JAVASCRIPT || |
950 | 952 |
objstate == STATE_OPENACTION)) { |
951 | 953 |
if (objstate == STATE_OPENACTION) |