cs_open() should return error on invalid mode
diff --git a/arch/AArch64/AArch64Module.c b/arch/AArch64/AArch64Module.c
index 785724a..c3d18f6 100644
--- a/arch/AArch64/AArch64Module.c
+++ b/arch/AArch64/AArch64Module.c
@@ -11,6 +11,10 @@
static cs_err init(cs_struct *ud)
{
+ // verify if requested mode is valid
+ if (ud->mode & ~(CS_MODE_LITTLE_ENDIAN | CS_MODE_ARM | CS_MODE_BIG_ENDIAN))
+ return CS_ERR_MODE;
+
MCRegisterInfo *mri = cs_mem_malloc(sizeof(*mri));
AArch64_init(mri);
diff --git a/arch/ARM/ARMModule.c b/arch/ARM/ARMModule.c
index 7837204..441c3fb 100644
--- a/arch/ARM/ARMModule.c
+++ b/arch/ARM/ARMModule.c
@@ -9,6 +9,11 @@
static cs_err init(cs_struct *ud)
{
+ // verify if requested mode is valid
+ if (ud->mode & ~(CS_MODE_LITTLE_ENDIAN | CS_MODE_ARM |
+ CS_MODE_THUMB | CS_MODE_BIG_ENDIAN))
+ return CS_ERR_MODE;
+
MCRegisterInfo *mri = cs_mem_malloc(sizeof(*mri));
ARM_init(mri);
diff --git a/arch/Mips/MipsModule.c b/arch/Mips/MipsModule.c
index 8aa4002..bfe0cd3 100644
--- a/arch/Mips/MipsModule.c
+++ b/arch/Mips/MipsModule.c
@@ -11,6 +11,11 @@
static cs_err init(cs_struct *ud)
{
+ // verify if requested mode is valid
+ if (ud->mode & ~(CS_MODE_LITTLE_ENDIAN | CS_MODE_32 | CS_MODE_64 |
+ CS_MODE_MICRO | CS_MODE_N64 | CS_MODE_BIG_ENDIAN))
+ return CS_ERR_MODE;
+
MCRegisterInfo *mri = cs_mem_malloc(sizeof(*mri));
Mips_init(mri);
diff --git a/arch/PowerPC/PPCModule.c b/arch/PowerPC/PPCModule.c
index 1b0f850..d2e3b82 100644
--- a/arch/PowerPC/PPCModule.c
+++ b/arch/PowerPC/PPCModule.c
@@ -11,6 +11,11 @@
static cs_err init(cs_struct *ud)
{
+ // verify if requested mode is valid
+ if (ud->mode & ~(CS_MODE_LITTLE_ENDIAN | CS_MODE_32 | CS_MODE_64 |
+ CS_MODE_BIG_ENDIAN))
+ return CS_ERR_MODE;
+
MCRegisterInfo *mri = cs_mem_malloc(sizeof(*mri));
PPC_init(mri);
diff --git a/arch/X86/X86Module.c b/arch/X86/X86Module.c
index db57175..77a549b 100644
--- a/arch/X86/X86Module.c
+++ b/arch/X86/X86Module.c
@@ -11,6 +11,10 @@
static cs_err init(cs_struct *ud)
{
+ // verify if requested mode is valid
+ if (ud->mode & ~(CS_MODE_LITTLE_ENDIAN | CS_MODE_32 | CS_MODE_64 | CS_MODE_16))
+ return CS_ERR_MODE;
+
// by default, we use Intel syntax
ud->printer = X86_Intel_printInst;
ud->printer_info = NULL;
diff --git a/cs.c b/cs.c
index 4c1be11..250e105 100644
--- a/cs.c
+++ b/cs.c
@@ -143,7 +143,12 @@
// by default, do not break instruction into details
ud->detail = CS_OPT_OFF;
- arch_init[ud->arch](ud);
+ cs_err err = arch_init[ud->arch](ud);
+ if (err) {
+ cs_mem_free(ud);
+ *handle = 0;
+ return err;
+ }
*handle = (uintptr_t)ud;
diff --git a/include/capstone.h b/include/capstone.h
index a009e7e..ec0463b 100644
--- a/include/capstone.h
+++ b/include/capstone.h
@@ -160,7 +160,7 @@
CS_ERR_MEM, // Out-Of-Memory error: cs_open(), cs_disasm_ex()
CS_ERR_ARCH, // Unsupported architecture: cs_open()
CS_ERR_HANDLE, // Invalid handle: cs_op_count(), cs_op_index()
- CS_ERR_CSH, // Invalid csh argument: cs_close(), cs_errno(), cs_option()
+ CS_ERR_CSH, // Invalid csh argument: cs_close(), cs_errno(), cs_option()
CS_ERR_MODE, // Invalid/unsupported mode: cs_open()
CS_ERR_OPTION, // Invalid/unsupported option: cs_option()
CS_ERR_DETAIL, // Information is unavailable because detail option is OFF