Commit 730f64f5c2185e0394d191e7a2a89e16f00889b9
1 parent
1f3fef52
raise new exceptions if opening of substreams fails and not relaxed
Showing
1 changed file
with
43 additions
and
19 deletions
oletools/olevba.py
| ... | ... | @@ -2242,12 +2242,24 @@ class VBA_Parser(object): |
| 2242 | 2242 | self.ole_subfiles.append( |
| 2243 | 2243 | VBA_Parser(filename=subfile, data=ole_data, |
| 2244 | 2244 | relaxed=self.relaxed)) |
| 2245 | - except FileOpenError as exc: | |
| 2246 | - log.info('%s is not a valid OLE file (%s)' % (subfile, exc)) | |
| 2247 | - continue | |
| 2245 | + except OlevbaBaseException as exc: | |
| 2246 | + if self.relaxed: | |
| 2247 | + log.info('%s is not a valid OLE file (%s)' % (subfile, exc)) | |
| 2248 | + log.debug('Trace:', exc_info=True) | |
| 2249 | + continue | |
| 2250 | + else: | |
| 2251 | + raise SubstreamOpenError(self.filename, subfile, | |
| 2252 | + exc) | |
| 2248 | 2253 | z.close() |
| 2249 | 2254 | # set type only if parsing succeeds |
| 2250 | 2255 | self.type = TYPE_OpenXML |
| 2256 | + except OlevbaBaseException as exc: | |
| 2257 | + if self.relaxed: | |
| 2258 | + log.info('Error {} caught in Zip/OpenXML parsing for file {}' | |
| 2259 | + .format(exc, self.filename)) | |
| 2260 | + log.debug('Trace:', exc_info=True) | |
| 2261 | + else: | |
| 2262 | + raise | |
| 2251 | 2263 | except (RuntimeError, zipfile.BadZipfile, zipfile.LargeZipFile, IOError) as exc: |
| 2252 | 2264 | # TODO: handle parsing exceptions |
| 2253 | 2265 | log.info('Failed Zip/OpenXML parsing for file %r (%s)' |
| ... | ... | @@ -2281,16 +2293,23 @@ class VBA_Parser(object): |
| 2281 | 2293 | self.ole_subfiles.append( |
| 2282 | 2294 | VBA_Parser(filename=fname, data=ole_data, |
| 2283 | 2295 | relaxed=self.relaxed)) |
| 2284 | - except MsoExtractionError: | |
| 2285 | - log.info('Failed decompressing an MSO container in %r - %s' | |
| 2286 | - % (fname, MSG_OLEVBA_ISSUES)) | |
| 2287 | - log.debug('Trace:', exc_info=True) | |
| 2288 | - except FileOpenError as exc: | |
| 2289 | - log.debug('%s is not a valid OLE sub file (%s)' % (fname, exc)) | |
| 2296 | + except OlevbaBaseException as exc: | |
| 2297 | + if relaxed: | |
| 2298 | + log.info('Error parsing subfile {}: {}' | |
| 2299 | + .format(fname, exc)) | |
| 2300 | + log.debug('Trace:', exc_info=True) | |
| 2301 | + else: | |
| 2302 | + raise SubstreamOpenError(self.filename, fname, exc) | |
| 2290 | 2303 | else: |
| 2291 | 2304 | log.info('%s is not a valid MSO file' % fname) |
| 2292 | 2305 | # set type only if parsing succeeds |
| 2293 | 2306 | self.type = TYPE_Word2003_XML |
| 2307 | + except OlevbaBaseException as exc: | |
| 2308 | + if self.relaxed: | |
| 2309 | + log.info('Failed XML parsing for file %r (%s)' % (self.filename, exc)) | |
| 2310 | + log.debug('Trace:', exc_info=True) | |
| 2311 | + else: | |
| 2312 | + raise | |
| 2294 | 2313 | except Exception as exc: |
| 2295 | 2314 | # TODO: differentiate exceptions for each parsing stage |
| 2296 | 2315 | # (but ET is different libs, no good exception description in API) |
| ... | ... | @@ -2345,14 +2364,14 @@ class VBA_Parser(object): |
| 2345 | 2364 | self.ole_subfiles.append( |
| 2346 | 2365 | VBA_Parser(filename=fname, data=ole_data, |
| 2347 | 2366 | relaxed=self.relaxed)) |
| 2348 | - except MsoExtractionError: | |
| 2349 | - log.info('Failed decompressing an MSO container in %r - %s' | |
| 2350 | - % (fname, MSG_OLEVBA_ISSUES)) | |
| 2351 | - log.debug('Trace:', exc_info=True) | |
| 2352 | - # TODO: bug here - need to split in smaller functions/classes? | |
| 2353 | - except FileOpenError as exc: | |
| 2354 | - log.debug('%s does not contain a valid OLE file (%s)' | |
| 2355 | - % (fname, exc)) | |
| 2367 | + except OlevbaBaseException as exc: | |
| 2368 | + if self.relaxed: | |
| 2369 | + log.info('%s does not contain a valid OLE file (%s)' | |
| 2370 | + % (fname, exc)) | |
| 2371 | + log.debug('Trace:', exc_info=True) | |
| 2372 | + # TODO: bug here - need to split in smaller functions/classes? | |
| 2373 | + else: | |
| 2374 | + raise SubstreamOpenError(self.filename, fname, exc) | |
| 2356 | 2375 | else: |
| 2357 | 2376 | log.debug('type(part_data) = %s' % type(part_data)) |
| 2358 | 2377 | try: |
| ... | ... | @@ -2361,6 +2380,8 @@ class VBA_Parser(object): |
| 2361 | 2380 | log.debug('part_data has no __getitem__') |
| 2362 | 2381 | # set type only if parsing succeeds |
| 2363 | 2382 | self.type = TYPE_MHTML |
| 2383 | + except OlevbaBaseException: | |
| 2384 | + raise | |
| 2364 | 2385 | except Exception: |
| 2365 | 2386 | log.info('Failed MIME parsing for file %r - %s' |
| 2366 | 2387 | % (self.filename, MSG_OLEVBA_ISSUES)) |
| ... | ... | @@ -2565,8 +2586,11 @@ class VBA_Parser(object): |
| 2565 | 2586 | log.debug('Found VBA compressed code') |
| 2566 | 2587 | self.contains_macros = True |
| 2567 | 2588 | except IOError as exc: |
| 2568 | - log.info('Error when reading OLE Stream %r' % d.name) | |
| 2569 | - log.debug('Trace:', exc_trace=True) | |
| 2589 | + if self.relaxed: | |
| 2590 | + log.info('Error when reading OLE Stream %r' % d.name) | |
| 2591 | + log.debug('Trace:', exc_trace=True) | |
| 2592 | + else: | |
| 2593 | + raise SubstreamOpenError(self.filename, d.name, exc) | |
| 2570 | 2594 | return self.contains_macros |
| 2571 | 2595 | |
| 2572 | 2596 | def extract_macros(self): | ... | ... |