Browse code

bb11438 - strengthen file typing for OOXML.

Steven Morgan authored on 2015/12/09 08:36:48
Showing 1 changed files
... ...
@@ -209,6 +209,17 @@ cli_file_t cli_filetype(const unsigned char *buf, size_t buflen, const struct cl
209 209
 
210 210
 int is_tar(const unsigned char *buf, unsigned int nbytes);
211 211
 
212
+#define OOXML_XL_DIR "xl/"
213
+#define OOXML_XL_DIR_LEN (sizeof(OOXML_XL_DIR)-1)
214
+#define OOXML_PPT_DIR "ppt/"
215
+#define OOXML_PPT_DIR_LEN (sizeof(OOXML_PPT_DIR)-1)
216
+#define OOXML_WORD_DIR "word/"
217
+#define OOXML_WORD_DIR_LEN (sizeof(OOXML_WORD_DIR)-1)
218
+#define OOXML_DOCPROPS_DIR "docProps/"
219
+#define OOXML_DOCPROPS_DIR_LEN (sizeof(OOXML_DOCPROPS_DIR)-1)
220
+#define OOXML_CONTENTTYPES "[ContentTypes].xml"
221
+#define OOXML_CONTENTTYPES_LEN (sizeof(OOXML_CONTENTTYPES)-1)
222
+
212 223
 cli_file_t cli_filetype2(fmap_t *map, const struct cl_engine *engine, cli_file_t basetype)
213 224
 {
214 225
 	unsigned char buffer[MAGIC_BUFFER_SIZE];
... ...
@@ -279,20 +290,54 @@ cli_file_t cli_filetype2(fmap_t *map, const struct cl_engine *engine, cli_file_t
279 279
                 if (NULL != znamep) {
280 280
                     znamep += SIZEOF_LH;
281 281
                     zlen = zread - (znamep - zbuff);
282
-                    if (zlen > 4) { /* Ensure we've mapped for OOXML filename compare */
283
-                        if (0 == memcmp(znamep, "xl/", 3)) {
284
-                            cli_dbgmsg("Recognized OOXML XL file\n");
285
-                            return CL_TYPE_OOXML_XL;
286
-                        } else if (0 == memcmp(znamep, "ppt/", 4)) {
287
-                            cli_dbgmsg("Recognized OOXML PPT file\n");
288
-                            return CL_TYPE_OOXML_PPT;                        
289
-                        } else if (0 == memcmp(znamep, "word/", 5)) {
290
-                            cli_dbgmsg("Recognized OOXML Word file\n");
291
-                            return CL_TYPE_OOXML_WORD;
292
-                        } else if (0 == memcmp(znamep, "docProps/", 5)) {
293
-                            likely_ooxml = 1;
282
+                    do {
283
+                        if (zlen <= 0) {
284
+                            znamep = NULL;
285
+                            break;
294 286
                         }
295
-
287
+                        if (zlen >= OOXML_XL_DIR_LEN) {
288
+                            if (0 == memcmp(znamep, OOXML_XL_DIR, OOXML_XL_DIR_LEN)) {
289
+                                cli_dbgmsg("Recognized OOXML XL file\n");
290
+                                return CL_TYPE_OOXML_XL;
291
+                            }
292
+                        } else {
293
+                            znamep = NULL;
294
+                            break;
295
+                        }
296
+                        if (zlen >= OOXML_PPT_DIR_LEN) {
297
+                            if (0 == memcmp(znamep, OOXML_PPT_DIR, OOXML_PPT_DIR_LEN)) {
298
+                                cli_dbgmsg("Recognized OOXML PPT file\n");
299
+                                return CL_TYPE_OOXML_PPT;
300
+                            }
301
+                        } else {
302
+                            znamep = NULL;
303
+                            break;
304
+                        }
305
+                        if (zlen >= OOXML_WORD_DIR_LEN) {
306
+                            if (0 == memcmp(znamep, OOXML_WORD_DIR, OOXML_WORD_DIR_LEN)) {
307
+                                cli_dbgmsg("Recognized OOXML Word file\n");
308
+                                return CL_TYPE_OOXML_WORD;
309
+                            }
310
+                        } else {
311
+                            znamep = NULL;
312
+                            break;
313
+                        }
314
+                        if (zlen >= OOXML_DOCPROPS_DIR_LEN) {
315
+                            if (0 == memcmp(znamep, OOXML_DOCPROPS_DIR, OOXML_DOCPROPS_DIR_LEN)) {
316
+                                likely_ooxml = 1;
317
+                            } else if  (zlen >= OOXML_CONTENTTYPES_LEN) {
318
+                                if (0 == memcmp(znamep, OOXML_CONTENTTYPES, OOXML_CONTENTTYPES_LEN)) {
319
+                                    likely_ooxml = 1;
320
+                                } else {
321
+                                    znamep = NULL;
322
+                                    break;
323
+                                }
324
+                            }
325
+                        } else {
326
+                            znamep = NULL;
327
+                            break;
328
+                        }
329
+                        
296 330
                         if (++lhc > 2) {
297 331
                             /* only check first three zip headers unless likely ooxml */
298 332
                             if (likely_ooxml) {
... ...
@@ -317,10 +362,7 @@ cli_file_t cli_filetype2(fmap_t *map, const struct cl_engine *engine, cli_file_t
317 317
                             }
318 318
                             break;
319 319
                         }
320
-                    }
321
-                    else {
322
-                        znamep = NULL; /* force to map more */
323
-                    }
320
+                    } while (0);
324 321
                 }
325 322
 
326 323
                 if (znamep == NULL) {