diff --git a/libr/bin/bin.c b/libr/bin/bin.c index 36da00a6fd..8ed03a1c0f 100644 --- a/libr/bin/bin.c +++ b/libr/bin/bin.c @@ -60,9 +60,9 @@ static RList* get_strings(RBin *bin, int min) { RBinSection *section; RListIter *iter; r_list_foreach (bin->sections, iter, section) { - // XXX: should we check sections srwx to be READ ONLY and NONEXEC? - if ((strstr (section->name, "_cstring")) // OSX - || (strstr (section->name, "data"))) { // LINUX + // XXX: DIRTY HACK! should we check sections srwx to be READ ONLY and NONEXEC? + if ((strstr (bin->info->bclass, "MACH0") && strstr (section->name, "_cstring")) || // OSX + (strstr (bin->info->bclass, "ELF") && strstr (section->name, "data"))) { // LINUX count ++; get_strings_range (bin, ret, min, section->offset, section->offset+section->size); diff --git a/libr/bin/format/mach0/mach0.c b/libr/bin/format/mach0/mach0.c index a3b52878c7..3bd6a925fa 100644 --- a/libr/bin/format/mach0/mach0.c +++ b/libr/bin/format/mach0/mach0.c @@ -104,6 +104,7 @@ static int MACH0_(r_bin_mach0_parse_symtab)(struct MACH0_(r_bin_mach0_obj_t)* bi } if (r_buf_read_at(bin->b, st.stroff, (ut8*)bin->symstr, st.strsize) == -1) { eprintf("Error: read (symstr)\n"); + R_FREE (bin->symstr); return R_FALSE; } if (!(bin->symtab = malloc(bin->nsymtab * sizeof(struct MACH0_(nlist))))) { @@ -117,6 +118,7 @@ static int MACH0_(r_bin_mach0_parse_symtab)(struct MACH0_(r_bin_mach0_obj_t)* bi #endif if (len == -1) { eprintf("Error: read (nlist)\n"); + R_FREE (bin->symtab); return R_FALSE; } } @@ -141,6 +143,7 @@ static int MACH0_(r_bin_mach0_parse_dysymtab)(struct MACH0_(r_bin_mach0_obj_t)* len = r_buf_fread_at(bin->b, bin->dysymtab.tocoff, (ut8*)bin->toc, bin->endian?"2I":"2i", bin->ntoc); if (len == -1) { eprintf("Error: read (toc)\n"); + R_FREE (bin->toc); return R_FALSE; } } @@ -157,6 +160,7 @@ static int MACH0_(r_bin_mach0_parse_dysymtab)(struct MACH0_(r_bin_mach0_obj_t)* #endif if (len == -1) { eprintf("Error: read (modtab)\n"); + R_FREE (bin->modtab); return R_FALSE; } } @@ -170,6 +174,7 @@ static int MACH0_(r_bin_mach0_parse_dysymtab)(struct MACH0_(r_bin_mach0_obj_t)* (ut8*)bin->indirectsyms, bin->endian?"I":"i", bin->nindirectsyms); if (len == -1) { eprintf("Error: read (indirect syms)\n"); + R_FREE (bin->indirectsyms); return R_FALSE; } } @@ -412,7 +417,7 @@ struct r_bin_mach0_import_t* MACH0_(r_bin_mach0_get_imports)(struct MACH0_(r_bin char sectname[17]; int i, j, k, nsyms, sym; - if (!bin->symtab || !bin->symstr) + if (!bin->symtab || !bin->symstr || !bin->sects || !bin->indirectsyms) return NULL; if (!(imports = malloc((bin->dysymtab.nundefsym + 1) * sizeof(struct r_bin_mach0_import_t)))) return NULL;