From 334c0e966eeb67cc88975cc51c3b7e17f7d1b1ee Mon Sep 17 00:00:00 2001 From: Andrew Lamoureux Date: Sat, 23 Mar 2019 01:15:14 -0400 Subject: kaitai: python3-compatible forgiveness for struct properties hasattr() on python2 has built in exception handler that would return False when computation of a property screwed up - that doesnt exist in python3 --- python/examples/kaitai/__main__.py | 20 ++++++++--------- python/examples/kaitai/kaitaistruct.py | 4 ++-- python/examples/kaitai/kshelpers.py | 41 +++++++++++++++++++--------------- python/examples/kaitai/view.py | 4 ++-- 4 files changed, 37 insertions(+), 32 deletions(-) (limited to 'python') diff --git a/python/examples/kaitai/__main__.py b/python/examples/kaitai/__main__.py index 237fc180..2accd2e5 100755 --- a/python/examples/kaitai/__main__.py +++ b/python/examples/kaitai/__main__.py @@ -42,19 +42,19 @@ def dump(obj, depth=0): indent = ' '*depth if isinstance(obj, kaitaistruct.KaitaiStruct): - for fieldName in dir(obj): - if hasattr(obj, fieldName): - getattr(obj, fieldName) - - for fieldName in dir(obj): - #print('considering field: %s (hasattr returns: %d)' % (fieldName, hasattr(obj, fieldName))) - if fieldName != '_debug' and fieldName.startswith('_'): - continue - if fieldName in dump_exceptions: + fieldNames = [] + for candidate in dir(obj): + if candidate != '_debug' and candidate.startswith('_'): continue - if not hasattr(obj, fieldName): + if candidate in dump_exceptions: continue + try: + if getattr(obj, candidate, False): + fieldNames.append(candidate) + except Exception: + pass + for fieldName in fieldNames: subObj = getattr(obj, fieldName) if type(subObj) == types.MethodType: diff --git a/python/examples/kaitai/kaitaistruct.py b/python/examples/kaitai/kaitaistruct.py index 4d588b9f..1bcc31f1 100644 --- a/python/examples/kaitai/kaitaistruct.py +++ b/python/examples/kaitai/kaitaistruct.py @@ -33,7 +33,7 @@ class KaitaiStruct(object): f = open(filename, 'rb') try: return cls(KaitaiStream(f)) - except Exception: + except Exception as e: # close file descriptor, then reraise the exception f.close() raise @@ -375,5 +375,5 @@ class KaitaiStream(object): """ try: return enum_obj(value) - except ValueError: + except ValueError as e: return value diff --git a/python/examples/kaitai/kshelpers.py b/python/examples/kaitai/kshelpers.py index bcdc9931..1deeef59 100644 --- a/python/examples/kaitai/kshelpers.py +++ b/python/examples/kaitai/kshelpers.py @@ -84,7 +84,6 @@ def ksImportClass(moduleName): classThing = getattr(module, className) except Exception as e: log.log_error('importing kaitai module %s' % moduleName) - #log.log_debug(e) pass return classThing @@ -97,11 +96,13 @@ def parseFpath(fpath, ksModuleName=None): ksClass = ksImportClass(ksModuleName) if not ksClass: return None + parsed = None try: parsed = ksClass.from_file(fpath) parsed._read() - except Exception: - log.log_error('kaitai module %s threw exception, check file type' % ksModuleName) + except Exception as e: + log.log_error('parseFpath(): kaitai module %s threw exception, check file type' % ksModuleName) + parsed = None return parsed @@ -113,11 +114,13 @@ def parseData(data, ksModuleName=None): ksClass = ksImportClass(ksModuleName) if not ksClass: return None + parsed = None try: parsed = ksClass.from_bytes(data) parsed._read() - except Exception: - log.log_error('kaitai module %s threw exception, check file type' % ksModuleName) + except Exception as e: + log.log_error('parseData(): kaitai module %s threw exception, check file type' % ksModuleName) + parsed = None return parsed @@ -134,12 +137,13 @@ def parseIo(ioObj, ksModuleName=None): ksClass = ksImportClass(ksModuleName) if not ksClass: return None + parsed = None try: ioObj.seek(0, io.SEEK_SET) parsed = ksClass.from_io(ioObj) parsed._read() - except Exception: - log.log_error('kaitai module %s threw exception, check file type' % ksModuleName) + except Exception as e: + log.log_error('parseIo(): kaitai module %s threw exception, check file type' % ksModuleName) parsed = None return parsed @@ -300,19 +304,20 @@ def buildQtree(ksobj): qwi = KaitaiTreeWidgetItem() qwi.setKaitaiObject(ksobj) - for fieldName in dir(ksobj): - if hasattr(ksobj, fieldName): - getattr(ksobj, fieldName) - - fields = dir(ksobj) - for fieldName in fields: - if fieldName.startswith('_') and (not fieldName.startswith('_m_')): - continue - if fieldName in exceptions: + fieldNames = [] + for candidate in dir(ksobj): + if candidate.startswith('_') and (not candidate.startswith('_m_')): continue - if not hasattr(ksobj, fieldName): + if candidate in exceptions: continue - if ('_m_'+fieldName) in fields: + try: + if getattr(ksobj, candidate, False): + fieldNames.append(candidate) + except Exception: + pass + + for fieldName in fieldNames: + if ('_m_'+fieldName) in fieldNames: # favor the '_m_' version which seems to get the debug info continue diff --git a/python/examples/kaitai/view.py b/python/examples/kaitai/view.py index a30140c0..75952b9b 100644 --- a/python/examples/kaitai/view.py +++ b/python/examples/kaitai/view.py @@ -137,7 +137,7 @@ class KaitaiView(QScrollArea, View): # parse the file using Kaitai, construct the TreeWidget def kaitaiParse(self, ksModuleName=None): - #log_debug('kaitaiParse() with len(bv)=%d and bv.file.filename=%s' % (len(self.binaryView), self.binaryView.file.filename)) + log.log_debug('kaitaiParse() with len(bv)=%d and bv.file.filename=%s' % (len(self.binaryView), self.binaryView.file.filename)) if len(self.binaryView) == 0: return @@ -155,7 +155,7 @@ class KaitaiView(QScrollArea, View): tree = kshelpers.buildQtree(parsed) except Exception as e: log.log_error('kaitai module %s threw exception, check file type' % ksModuleName) - true = None + tree = None else: tree = kshelpers.buildQtree(parsed) -- cgit v1.3.1