python: raise CS_ERR_DIET error when accessing irrelevant data in diet engine
diff --git a/bindings/python/capstone/capstone.py b/bindings/python/capstone/capstone.py
index 0706916..b73d116 100644
--- a/bindings/python/capstone/capstone.py
+++ b/bindings/python/capstone/capstone.py
@@ -50,6 +50,7 @@
'CS_ERR_OPTION',
'CS_ERR_DETAIL',
'CS_ERR_VERSION',
+ 'CS_ERR_DIET',
'CS_SUPPORT_DIET',
]
@@ -104,6 +105,7 @@
CS_ERR_OPTION = 6 # Invalid/unsupported option: cs_option()
CS_ERR_DETAIL = 7 # Invalid/unsupported option: cs_option()
CS_ERR_VERSION = 9 # Unsupported version (bindings)
+CS_ERR_DIET = 10 # Information irrelevant in diet engine
CS_SUPPORT_DIET = 0xFFFF+1
@@ -282,6 +284,10 @@
# our binding version is different from the core's API version
raise CsError(CS_ERR_VERSION)
+ if cs_support(CS_SUPPORT_DIET):
+ # Diet engine cannot provide mnemonic & op_str
+ raise CsError(CS_ERR_DIET)
+
csh = ctypes.c_size_t()
status = _cs.cs_open(arch, mode, ctypes.byref(csh))
if status != CS_ERR_OK:
@@ -331,14 +337,26 @@
@property
def mnemonic(self):
+ if cs_support(CS_SUPPORT_DIET):
+ # Diet engine cannot provide mnemonic & op_str
+ raise CsError(CS_ERR_DIET)
+
return self._raw.mnemonic
@property
def op_str(self):
+ if cs_support(CS_SUPPORT_DIET):
+ # Diet engine cannot provide mnemonic & op_str
+ raise CsError(CS_ERR_DIET)
+
return self._raw.op_str
@property
def regs_read(self):
+ if cs_support(CS_SUPPORT_DIET):
+ # Diet engine cannot provide mnemonic & op_str
+ raise CsError(CS_ERR_DIET)
+
if self._cs._detail:
detail = self._raw.detail.contents
return detail.regs_read[:detail.regs_read_count]
@@ -347,6 +365,10 @@
@property
def regs_write(self):
+ if cs_support(CS_SUPPORT_DIET):
+ # Diet engine cannot provide mnemonic & op_str
+ raise CsError(CS_ERR_DIET)
+
if self._cs._detail:
detail = self._raw.detail.contents
return detail.regs_write[:detail.regs_write_count]
@@ -355,6 +377,10 @@
@property
def groups(self):
+ if cs_support(CS_SUPPORT_DIET):
+ # Diet engine cannot provide mnemonic & op_str
+ raise CsError(CS_ERR_DIET)
+
if self._cs._detail:
detail = self._raw.detail.contents
return detail.groups[:detail.groups_count]