Browse code

flag and dump PDF objects with /Launch (bb #3514).

Török Edvin authored on 2011/10/08 18:20:21
Showing 3 changed files
... ...
@@ -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)