mirror of
https://github.com/keystone-engine/keystone.git
synced 2026-10-12 02:17:10 +00:00
Only frees instruction if allocated (#375)
* Only frees instruction if allocated * Avoids memory leak in ks_close for EVM
This commit is contained in:
committed by
Nguyen Anh Quynh
parent
1ee0248c04
commit
0f19fa9acd
+4
-2
@@ -91,7 +91,7 @@ int main(int argc, char **argv)
|
||||
uint64_t start_addr = 0;
|
||||
char *input = NULL;
|
||||
size_t count;
|
||||
unsigned char *insn;
|
||||
unsigned char *insn = NULL;
|
||||
size_t size;
|
||||
|
||||
if (argc == 2) {
|
||||
@@ -308,7 +308,9 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
// NOTE: free insn after usage to avoid leaking memory
|
||||
ks_free(insn);
|
||||
if (insn != NULL) {
|
||||
ks_free(insn);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -501,6 +501,7 @@ ks_err ks_close(ks_engine *ks)
|
||||
|
||||
if (ks->arch == KS_ARCH_EVM) {
|
||||
// handle EVM differently
|
||||
delete ks;
|
||||
return KS_ERR_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
@@ -9,7 +9,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
unsigned char *encode = NULL;
|
||||
size_t size;
|
||||
char * assembler;
|
||||
|
||||
@@ -55,7 +55,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
|
||||
|
||||
free(assembler);
|
||||
// NOTE: free encode after usage to avoid leaking memory
|
||||
ks_free(encode);
|
||||
if (encode != NULL) {
|
||||
ks_free(encode);
|
||||
}
|
||||
|
||||
// close Keystone instance when done
|
||||
ks_close(ks);
|
||||
|
||||
Reference in New Issue
Block a user