Commit 730f64f5c2185e0394d191e7a2a89e16f00889b9

Authored by Christian Herdtweck
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):
... ...