replace strdup() with our cs_strdup(), which call cs_mem_malloc() internally
diff --git a/arch/AArch64/AArch64BaseInfo.c b/arch/AArch64/AArch64BaseInfo.c
index 29793da..510813f 100644
--- a/arch/AArch64/AArch64BaseInfo.c
+++ b/arch/AArch64/AArch64BaseInfo.c
@@ -39,7 +39,7 @@
 // return true if s1 == lower(f2), and false otherwise
 static bool compare_lower_str(char *s1, char *s2)
 {
-	char *lower = strdup(s2), *c;
+	char *lower = cs_strdup(s2), *c;
 	for (c = lower; *c; c++)
 		*c = tolower((int) *c);
 
@@ -85,7 +85,7 @@
 
 	if (isNeg) *--BufPtr = '-';   // Add negative sign...
 
-	char *result = strdup(BufPtr);
+	char *result = cs_strdup(BufPtr);
 	return result;
 }
 
diff --git a/arch/AArch64/AArch64GenAsmWriter.inc b/arch/AArch64/AArch64GenAsmWriter.inc
index 2f460c4..fcf9e92 100644
--- a/arch/AArch64/AArch64GenAsmWriter.inc
+++ b/arch/AArch64/AArch64GenAsmWriter.inc
@@ -11308,7 +11308,7 @@
     return false;
   }
 
-  char *tmp = strdup(AsmString), *AsmMnem, *AsmOps;
+  char *tmp = cs_strdup(AsmString), *AsmMnem, *AsmOps;
   AsmMnem = tmp;
   AsmOps = strchr(tmp, ' ');
   if (AsmOps) {
diff --git a/arch/AArch64/AArch64InstPrinter.c b/arch/AArch64/AArch64InstPrinter.c
index 89093f0..6a2a3ed 100644
--- a/arch/AArch64/AArch64InstPrinter.c
+++ b/arch/AArch64/AArch64InstPrinter.c
@@ -567,7 +567,7 @@
 static void printVPRRegister(MCInst *MI, unsigned OpNo, SStream *O)
 {
 	unsigned Reg = MCOperand_getReg(MCInst_getOperand(MI, OpNo));
-	char *Name = strdup(getRegisterName(Reg));
+	char *Name = cs_strdup(getRegisterName(Reg));
 	Name[0] = 'v';
 	SStream_concat(O, "%s", Name);
 	cs_mem_free(Name);
@@ -780,7 +780,7 @@
 		unsigned SubRegIdx = IsVec64 ? AArch64_dsub_0 : AArch64_qsub_0;
 		unsigned I;
 		for (I = 0; I < Count; I++) {
-			char *Name = strdup(getRegisterName(MCRegisterInfo_getSubReg(MRI, Reg, SubRegIdx++)));
+			char *Name = cs_strdup(getRegisterName(MCRegisterInfo_getSubReg(MRI, Reg, SubRegIdx++)));
 			Name[0] = 'v';
 			SStream_concat(O, "%s%s", Name, LayoutStr);
 			if (I != Count - 1)
@@ -788,7 +788,7 @@
 			cs_mem_free(Name);
 		}
 	} else { // Print the register directly when NumVecs is 1.
-		char *Name = strdup(getRegisterName(Reg));
+		char *Name = cs_strdup(getRegisterName(Reg));
 		Name[0] = 'v';
 		SStream_concat(O, "%s%s", Name, LayoutStr);
 		cs_mem_free(Name);
@@ -812,7 +812,7 @@
 void AArch64_printInst(MCInst *MI, SStream *O, void *Info)
 {
 	if (printAliasInstr(MI, O, Info)) {
-		char *mnem = strdup(O->buffer);
+		char *mnem = cs_strdup(O->buffer);
 		char *tab = strchr(mnem, '\t');
 		if (tab) {
 			*tab = '\0';
diff --git a/arch/ARM/ARMGenAsmWriter.inc b/arch/ARM/ARMGenAsmWriter.inc
index e086d10..3005b1c 100644
--- a/arch/ARM/ARMGenAsmWriter.inc
+++ b/arch/ARM/ARMGenAsmWriter.inc
@@ -8694,7 +8694,7 @@
     return false;
   }
 
-  char *tmp = strdup(AsmString), *AsmMnem, *AsmOps;
+  char *tmp = cs_strdup(AsmString), *AsmMnem, *AsmOps;
   AsmMnem = tmp;
   AsmOps = strchr(tmp, ' ');
   if (AsmOps) {
diff --git a/arch/Mips/MipsGenAsmWriter.inc b/arch/Mips/MipsGenAsmWriter.inc
index e23caf7..043123e 100644
--- a/arch/Mips/MipsGenAsmWriter.inc
+++ b/arch/Mips/MipsGenAsmWriter.inc
@@ -4562,7 +4562,7 @@
     return false;
   }
 
-  char *tmp = strdup(AsmString), *AsmMnem, *AsmOps;
+  char *tmp = cs_strdup(AsmString), *AsmMnem, *AsmOps;
   AsmMnem = tmp;
   AsmOps = strchr(tmp, ' ');
   if (AsmOps) {
diff --git a/arch/Mips/MipsInstPrinter.c b/arch/Mips/MipsInstPrinter.c
index 8ed093d..288727e 100644
--- a/arch/Mips/MipsInstPrinter.c
+++ b/arch/Mips/MipsInstPrinter.c
@@ -199,7 +199,7 @@
 		printInstruction(MI, O, NULL);
 	else {
 		// fixup instruction id due to the change in alias instruction
-		char *mnem = strdup(O->buffer);
+		char *mnem = cs_strdup(O->buffer);
 		char *tab = strchr(mnem, '\t');
 		if (tab)
 			*tab = '\0';
diff --git a/arch/PowerPC/PPCGenAsmWriter.inc b/arch/PowerPC/PPCGenAsmWriter.inc
index a6aa96a..c4b20d6 100644
--- a/arch/PowerPC/PPCGenAsmWriter.inc
+++ b/arch/PowerPC/PPCGenAsmWriter.inc
@@ -3456,7 +3456,7 @@
     return false;
   }
 
-  char *tmp = strdup(AsmString), *AsmMnem, *AsmOps;
+  char *tmp = cs_strdup(AsmString), *AsmMnem, *AsmOps;
   AsmMnem = tmp;
   AsmOps = strchr(tmp, ' ');
   if (AsmOps) {
diff --git a/arch/X86/X86ATTInstPrinter.c b/arch/X86/X86ATTInstPrinter.c
index 2c5bbd7..f9613d1 100644
--- a/arch/X86/X86ATTInstPrinter.c
+++ b/arch/X86/X86ATTInstPrinter.c
@@ -447,7 +447,7 @@
 
 	// Try to print any aliases first.
 	if (printAliasInstr(MI, OS)) {
-		char *mnem = strdup(OS->buffer);
+		char *mnem = cs_strdup(OS->buffer);
 		char *tab = strchr(mnem, '\t');
 		if (tab)
 			*tab = '\0';
diff --git a/arch/X86/X86GenAsmWriter.inc b/arch/X86/X86GenAsmWriter.inc
index 20adc60..2470c5a 100644
--- a/arch/X86/X86GenAsmWriter.inc
+++ b/arch/X86/X86GenAsmWriter.inc
@@ -13374,7 +13374,7 @@
     return false;
   }
 
-  char *tmp = strdup(AsmString), *AsmMnem, *AsmOps;
+  char *tmp = cs_strdup(AsmString), *AsmMnem, *AsmOps;
   AsmMnem = tmp;
   AsmOps = strchr(tmp, ' ');
   if (AsmOps) {
diff --git a/arch/X86/X86GenAsmWriter1.inc b/arch/X86/X86GenAsmWriter1.inc
index 70c6893..e822366 100644
--- a/arch/X86/X86GenAsmWriter1.inc
+++ b/arch/X86/X86GenAsmWriter1.inc
@@ -12863,7 +12863,7 @@
     return false;
   }
 
-  char *tmp = strdup(AsmString), *AsmMnem, *AsmOps;
+  char *tmp = cs_strdup(AsmString), *AsmMnem, *AsmOps;
   AsmMnem = tmp;
   AsmOps = strchr(tmp, ' ');
   if (AsmOps) {
diff --git a/arch/X86/X86IntelInstPrinter.c b/arch/X86/X86IntelInstPrinter.c
index 053e2dd..3d09939 100644
--- a/arch/X86/X86IntelInstPrinter.c
+++ b/arch/X86/X86IntelInstPrinter.c
@@ -224,7 +224,7 @@
 	//  O << "\tlock\n";
 
 	if (printAliasInstr(MI, O)) {
-		char *mnem = strdup(O->buffer);
+		char *mnem = cs_strdup(O->buffer);
 		char *tab = strchr(mnem, '\t');
 		if (tab)
 			*tab = '\0';
diff --git a/utils.c b/utils.c
index 87750ce..44f12f2 100644
--- a/utils.c
+++ b/utils.c
@@ -86,3 +86,14 @@
 
 	return c;
 }
+
+char *cs_strdup(const char *str)
+{
+	size_t len = strlen(str)+ 1;
+	void *new = cs_mem_malloc(len);
+
+	if (new == NULL)
+		return NULL;
+
+	return (char *)memmove(new, str, len);
+}
diff --git a/utils.h b/utils.h
index 8df745e..9b36ed9 100644
--- a/utils.h
+++ b/utils.h
@@ -49,5 +49,7 @@
 
 #define ARR_SIZE(a) (sizeof(a)/sizeof(a[0]))
 
+char *cs_strdup(const char *str);
+
 #endif