... | ... |
@@ -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) { |