From 06b3c05e206ed152ce0d40b21de5488e4f8dc2c2 Mon Sep 17 00:00:00 2001 From: Nguyen Anh Quynh Date: Tue, 21 Jan 2014 15:26:02 +0800 Subject: [PATCH] cs_open() should return error on invalid mode --- arch/AArch64/AArch64Module.c | 4 ++++ arch/ARM/ARMModule.c | 5 +++++ arch/Mips/MipsModule.c | 5 +++++ arch/PowerPC/PPCModule.c | 5 +++++ arch/X86/X86Module.c | 4 ++++ cs.c | 7 ++++++- include/capstone.h | 2 +- 7 files changed, 30 insertions(+), 2 deletions(-) diff --git a/arch/AArch64/AArch64Module.c b/arch/AArch64/AArch64Module.c index 785724a65..c3d18f6fc 100644 --- a/arch/AArch64/AArch64Module.c +++ b/arch/AArch64/AArch64Module.c @@ -11,6 +11,10 @@ void enable_arm64() {} 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 783720432..441c3fb54 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 8aa40029b..bfe0cd357 100644 --- a/arch/Mips/MipsModule.c +++ b/arch/Mips/MipsModule.c @@ -11,6 +11,11 @@ void enable_mips() {}; 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 1b0f850ee..d2e3b82c4 100644 --- a/arch/PowerPC/PPCModule.c +++ b/arch/PowerPC/PPCModule.c @@ -11,6 +11,11 @@ void enable_powerpc() {}; 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 db57175fe..77a549b3b 100644 --- a/arch/X86/X86Module.c +++ b/arch/X86/X86Module.c @@ -11,6 +11,10 @@ void enable_x86() {}; 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 4c1be11b7..250e1055e 100644 --- a/cs.c +++ b/cs.c @@ -143,7 +143,12 @@ cs_err cs_open(cs_arch arch, cs_mode mode, csh *handle) // 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 a009e7e33..ec0463b99 100644 --- a/include/capstone.h +++ b/include/capstone.h @@ -160,7 +160,7 @@ typedef enum cs_err { 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