char *sdb_module = NULL;
char *symname = NULL;
char *symdllname = NULL;
+ char *filename = NULL;
+ char *lower_symdllname = NULL;
if (R_STR_ISEMPTY (dll_name) || *dll_name == '0') {
return 0;
symdllname[len] = 0;
}
- char *filename = NULL;
if (!sdb_module || strcmp (symdllname, sdb_module)) {
sdb_free (db);
db = NULL;
db = sdb_new (NULL, filename, 0);
} else {
const char *dirPrefix = r_sys_prefix (NULL);
- char *lower_symdllname = strdup (symdllname);
+ lower_symdllname = strdup (symdllname);
r_str_case (lower_symdllname, false);
free (filename);
filename = r_str_newf (R_JOIN_4_PATHS ("%s", R2_SDB_FORMAT, "dll", "%s.sdb"),
dirPrefix, lower_symdllname);
free (lower_symdllname);
+ lower_symdllname = NULL;
if (r_file_exists (filename)) {
db = sdb_new (NULL, filename, 0);
}
} else {
R_LOG_ERROR ("Cannot find %s", filename);
}
- free (filename);
+ R_FREE (filename);
} else {
import_ordinal++;
const ut64 off = PE_(va2pa) (pe, import_table);
sdb_free (db);
db = NULL;
}
+ free (symname);
+ free (filename);
+ free (lower_symdllname);
free (symdllname);
free (sdb_module);
+ // Free any partially allocated import structures
+ if (*importp) {
+ free (*importp);
+ *importp = NULL;
+ *nimp = 0;
+ }
return false;
}
}
const char *PE_(bin_pe_compute_authentihash)(RBinPEObj *pe) {
+ R_RETURN_VAL_IF_FAIL (pe, NULL);
if (!pe->spcinfo || !pe->spcinfo->messageDigest.digestAlgorithm.algorithm) {
return NULL;
}
return true;
fail:
R_LOG_DEBUG ("read (metadata header)");
- free (metadata);
+ if (metadata) {
+ free (metadata->VersionString);
+ free (metadata);
+ }
return false;
}
while (addressOfTLSCallback != 0) {
addressOfTLSCallback = R_BUF_READ_PE_DWORD_AT (pe->b, callbacks);
if (addressOfTLSCallback == PE_DWORD_MAX) {
- R_LOG_WARN ("read (tls_callback)");
return;
}
if (!addressOfTLSCallback) {
return true;
}
-/// TODO: just return const char* no need for heap allocation
-char *PE_(r_bin_pe_get_arch)(RBinPEObj *pe) {
+const char *PE_(r_bin_pe_get_arch)(RBinPEObj *pe) {
if (!pe || !pe->nt_headers) {
return strdup ("x86");
}
}
if (r_buf_read_at (pe->b, PE_(va2pa) (pe, pe->export_directory->Name), (ut8 *)dll_name, PE_NAME_LENGTH) < 1) {
// we dont stop if dll name cant be read, we set dllname to null and continue
- R_LOG_WARN ("read (dll name)");
dll_name[0] = '\0';
}
functions_paddr = PE_(va2pa) (pe, pe->export_directory->AddressOfFunctions);
// #define RBinPEObj struct PE_(r_bin_pe_obj_t)
R_API PE_DWord PE_(va2pa)(RBinPEObj* bin, PE_DWord rva);
R_API void PE_(r_bin_store_all_resource_version_info)(RBinPEObj* bin);
-R_API char* PE_(r_bin_pe_get_arch)(RBinPEObj* bin);
+R_API const char* PE_(r_bin_pe_get_arch)(RBinPEObj* bin);
R_API char *PE_(r_bin_pe_get_cc)(RBinPEObj* bin);
R_API struct r_bin_pe_addr_t* PE_(r_bin_pe_get_entrypoint)(RBinPEObj* bin);
R_API struct r_bin_pe_addr_t* PE_(r_bin_pe_get_main_vaddr)(RBinPEObj* bin);
return NULL;
}
RBinInfo *ret = R_NEW0 (RBinInfo);
- if (!ret) {
- return NULL;
- }
ret->file = strdup (bf->file);
ret->bclass = PE_(r_bin_pe_get_class) (pe);
ret->rclass = strdup ("pe");
ret->os = PE_(r_bin_pe_get_os) (pe);
- ret->arch = PE_(r_bin_pe_get_arch) (pe);
+ ret->arch = strdup (PE_(r_bin_pe_get_arch) (pe));
ret->machine = PE_(r_bin_pe_get_machine) (pe);
ret->subsystem = PE_(r_bin_pe_get_subsystem) (pe);
ret->default_cc = PE_(r_bin_pe_get_cc) (pe);