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