diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h index 6d6f6c76142..73b9cf9c8c1 100644 --- a/dlls/dbghelp/dbghelp_private.h +++ b/dlls/dbghelp/dbghelp_private.h @@ -694,7 +694,7 @@ typedef void (*stabs_def_cb)(struct module* module, ULONG_PTR load_offset, BOOL is_public, BOOL is_global, unsigned char other, struct symt_compiland* compiland, void* user); extern BOOL stabs_parse(struct module* module, ULONG_PTR load_offset, - const char* stabs, int stablen, + const char* stabs, size_t nstab, size_t stabsize, const char* strs, int strtablen, stabs_def_cb callback, void* user) DECLSPEC_HIDDEN; diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c index 01759cd18ee..50f19bc79a3 100644 --- a/dlls/dbghelp/elf_module.c +++ b/dlls/dbghelp/elf_module.c @@ -1007,7 +1007,7 @@ static BOOL elf_load_debug_info_from_map(struct module* module, { /* OK, now just parse all of the stabs. */ lret = stabs_parse(module, module->format_info[DFI_ELF]->u.elf_info->elf_addr, - stab, image_get_map_size(&stab_sect), + stab, image_get_map_size(&stab_sect) / sizeof(struct stab_nlist), sizeof(struct stab_nlist), stabstr, image_get_map_size(&stabstr_sect), NULL, NULL); if (lret) diff --git a/dlls/dbghelp/macho_module.c b/dlls/dbghelp/macho_module.c index ab88d271081..1e01d84c192 100644 --- a/dlls/dbghelp/macho_module.c +++ b/dlls/dbghelp/macho_module.c @@ -944,7 +944,7 @@ static int macho_parse_symtab(struct image_file_map* ifm, if (!stabs_parse(mdi->module, mdi->module->format_info[DFI_MACHO]->u.macho_info->load_addr - fmap->segs_start, - stab, sc->nsyms * stabsize, + stab, sc->nsyms, stabsize, stabstr, sc->strsize, macho_stabs_def_cb, mdi)) ret = -1; diff --git a/dlls/dbghelp/pe_module.c b/dlls/dbghelp/pe_module.c index 9d4e82cc714..0560f3ef05a 100644 --- a/dlls/dbghelp/pe_module.c +++ b/dlls/dbghelp/pe_module.c @@ -500,7 +500,7 @@ static BOOL pe_load_stabs(const struct process* pcs, struct module* module) { ret = stabs_parse(module, module->module.BaseOfImage - fmap->u.pe.ntheader.OptionalHeader.ImageBase, - stab, image_get_map_size(§_stabs), + stab, image_get_map_size(§_stabs) / sizeof(struct stab_nlist), sizeof(struct stab_nlist), stabstr, image_get_map_size(§_stabstr), NULL, NULL); } diff --git a/dlls/dbghelp/stabs.c b/dlls/dbghelp/stabs.c index b2da8f866b5..9ac3089d02e 100644 --- a/dlls/dbghelp/stabs.c +++ b/dlls/dbghelp/stabs.c @@ -1247,7 +1247,7 @@ static inline void stabbuf_append(char **buf, unsigned *buf_size, const char *st } BOOL stabs_parse(struct module* module, ULONG_PTR load_offset, - const char* pv_stab_ptr, int stablen, + const char* pv_stab_ptr, size_t nstab, size_t stabsize, const char* strs, int strtablen, stabs_def_cb callback, void* user) { @@ -1256,7 +1256,6 @@ BOOL stabs_parse(struct module* module, ULONG_PTR load_offset, struct symt_compiland* compiland = NULL; char* srcpath = NULL; int i; - int nstab; const char* ptr; char* stabbuff; unsigned int stabbufflen; @@ -1272,14 +1271,8 @@ BOOL stabs_parse(struct module* module, ULONG_PTR load_offset, BOOL ret = TRUE; struct location loc; unsigned char type; - size_t stabsize = sizeof(struct stab_nlist); uint64_t n_value; -#ifdef __APPLE__ - if (module->process->is_64bit) - stabsize = sizeof(struct macho64_nlist); -#endif - nstab = stablen / stabsize; strs_end = strs + strtablen; memset(stabs_basic, 0, sizeof(stabs_basic)); @@ -1298,11 +1291,7 @@ BOOL stabs_parse(struct module* module, ULONG_PTR load_offset, for (i = 0; i < nstab; i++) { stab_ptr = (struct stab_nlist *)(pv_stab_ptr + i * stabsize); - n_value = stab_ptr->n_value; -#ifdef __APPLE__ - if (module->process->is_64bit) - n_value = ((struct macho64_nlist *)stab_ptr)->n_value; -#endif + n_value = stabsize == sizeof(struct macho64_nlist) ? ((struct macho64_nlist *)stab_ptr)->n_value : stab_ptr->n_value; ptr = strs + stab_ptr->n_strx; if ((ptr > strs_end) || (ptr + strlen(ptr) > strs_end)) {