Commit b52e0e448fef62e0b48d752b6d62c002d8653fa6
1 parent
2f6fb299
oleobj: Always close PptFile
Showing
1 changed file
with
29 additions
and
23 deletions
oletools/oleobj.py
| ... | ... | @@ -526,29 +526,35 @@ def find_ole_in_ppt(filename): |
| 526 | 526 | can contain the actual embedded file we are looking for (caller will check |
| 527 | 527 | for these). |
| 528 | 528 | """ |
| 529 | - for stream in PptFile(filename).iter_streams(): | |
| 530 | - for record_idx, record in enumerate(stream.iter_records()): | |
| 531 | - if isinstance(record, PptRecordExOleVbaActiveXAtom): | |
| 532 | - ole = None | |
| 533 | - try: | |
| 534 | - data_start = next(record.iter_uncompressed()) | |
| 535 | - if data_start[:len(olefile.MAGIC)] != olefile.MAGIC: | |
| 536 | - continue # could be an ActiveX control or VBA Storage | |
| 537 | - | |
| 538 | - # otherwise, this should be an OLE object | |
| 539 | - log.debug('Found record with embedded ole object in ppt ' | |
| 540 | - '(stream "{0}", record no {1})' | |
| 541 | - .format(stream.name, record_idx)) | |
| 542 | - ole = record.get_data_as_olefile() | |
| 543 | - yield ole | |
| 544 | - except IOError: | |
| 545 | - log.warning('Error reading data from {0} stream or ' | |
| 546 | - 'interpreting it as OLE object' | |
| 547 | - .format(stream.name)) | |
| 548 | - log.debug('', exc_info=True) | |
| 549 | - finally: | |
| 550 | - if ole is not None: | |
| 551 | - ole.close() | |
| 529 | + ppt_file = None | |
| 530 | + try: | |
| 531 | + ppt_file = PptFile(filename) | |
| 532 | + for stream in ppt_file.iter_streams(): | |
| 533 | + for record_idx, record in enumerate(stream.iter_records()): | |
| 534 | + if isinstance(record, PptRecordExOleVbaActiveXAtom): | |
| 535 | + ole = None | |
| 536 | + try: | |
| 537 | + data_start = next(record.iter_uncompressed()) | |
| 538 | + if data_start[:len(olefile.MAGIC)] != olefile.MAGIC: | |
| 539 | + continue # could be ActiveX control / VBA Storage | |
| 540 | + | |
| 541 | + # otherwise, this should be an OLE object | |
| 542 | + log.debug('Found record with embedded ole object in ' | |
| 543 | + 'ppt (stream "{0}", record no {1})' | |
| 544 | + .format(stream.name, record_idx)) | |
| 545 | + ole = record.get_data_as_olefile() | |
| 546 | + yield ole | |
| 547 | + except IOError: | |
| 548 | + log.warning('Error reading data from {0} stream or ' | |
| 549 | + 'interpreting it as OLE object' | |
| 550 | + .format(stream.name)) | |
| 551 | + log.debug('', exc_info=True) | |
| 552 | + finally: | |
| 553 | + if ole is not None: | |
| 554 | + ole.close() | |
| 555 | + finally: | |
| 556 | + if ppt_file is not None: | |
| 557 | + ppt_file.close() | |
| 552 | 558 | |
| 553 | 559 | |
| 554 | 560 | class FakeFile(io.RawIOBase): | ... | ... |