/* The size of the circular list of strings may be set and reset as desired. Returns the previous size of the list. If the list is shortened excess error entries are simply dropped. If the reallocation fails the list size is left unchanged. Do not make this a long list! Remember the maxcount we record is 1 > the user count, so we adjust it so it looks like the user count. */ unsigned dwarf_set_harmless_error_list_size(Dwarf_Debug dbg, unsigned maxcount ) { struct Dwarf_Harmless_s *dhp = &dbg->de_harmless_errors; unsigned prevcount = dhp->dh_maxcount; if (maxcount != 0) { ++maxcount; if (maxcount != dhp->dh_maxcount) { /* Assign transfers 'ownership' of the malloc areas to oldarray. */ struct Dwarf_Harmless_s oldarray = *dhp; /* Do not double increment the max, the init() func increments it too. */ dwarf_harmless_init(dhp,maxcount-1); if (oldarray.dh_next_to_use != oldarray.dh_first) { unsigned i = 0; for (i = oldarray.dh_first; i != oldarray.dh_next_to_use; i = (i+1)%oldarray.dh_maxcount) { dwarf_insert_harmless_error(dbg,oldarray.dh_errors[i]); } if (oldarray.dh_errs_count > dhp->dh_errs_count) { dhp->dh_errs_count = oldarray.dh_errs_count; } } dwarf_harmless_cleanout(&oldarray); } } return prevcount-1; }
/* Used to free all space allocated for this Dwarf_Debug. The caller should assume that the Dwarf_Debug pointer itself is no longer valid upon return from this function. In case of difficulty, this function simply returns quietly. */ int _dwarf_free_all_of_one_debug(Dwarf_Debug dbg) { if (dbg == NULL) { return (DW_DLV_ERROR); } /* To do complete validation that we have no surprising missing or erroneous deallocs it is advisable to do the dwarf_deallocs here that are not things the user can otherwise request. Housecleaning. */ freecontextlist(dbg,&dbg->de_info_reading); freecontextlist(dbg,&dbg->de_types_reading); /* Housecleaning done. Now really free all the space. */ rela_free(&dbg->de_debug_info); rela_free(&dbg->de_debug_types); rela_free(&dbg->de_debug_abbrev); rela_free(&dbg->de_debug_line); rela_free(&dbg->de_debug_loc); rela_free(&dbg->de_debug_aranges); rela_free(&dbg->de_debug_macinfo); rela_free(&dbg->de_debug_pubnames); rela_free(&dbg->de_debug_str); rela_free(&dbg->de_debug_frame); rela_free(&dbg->de_debug_frame_eh_gnu); rela_free(&dbg->de_debug_pubtypes); rela_free(&dbg->de_debug_funcnames); rela_free(&dbg->de_debug_typenames); rela_free(&dbg->de_debug_varnames); rela_free(&dbg->de_debug_weaknames); rela_free(&dbg->de_debug_ranges); dwarf_harmless_cleanout(&dbg->de_harmless_errors); if (dbg->de_printf_callback.dp_buffer && !dbg->de_printf_callback.dp_buffer_user_provided ) { free(dbg->de_printf_callback.dp_buffer); } dwarf_tdestroy(dbg->de_alloc_tree,tdestroy_free_node); memset(dbg, 0, sizeof(*dbg)); /* Prevent accidental use later. */ free(dbg); return (DW_DLV_OK); }
/* Used to free all space allocated for this Dwarf_Debug. The caller should assume that the Dwarf_Debug pointer itself is no longer valid upon return from this function. In case of difficulty, this function simply returns quietly. */ int _dwarf_free_all_of_one_debug(Dwarf_Debug dbg) { Dwarf_Alloc_Hdr alloc_hdr = 0; Dwarf_Shalf i = 0; if (dbg == NULL) { return (DW_DLV_ERROR); } /* To do complete validation that we have no surprising missing or erroneous deallocs it is advisable to do the dwarf_deallocs here that are not things the user can otherwise request. Housecleaning. */ freecontextlist(dbg,&dbg->de_info_reading); freecontextlist(dbg,&dbg->de_types_reading); /* Housecleaning done. Now really free all the space. */ #ifdef DWARF_SIMPLE_MALLOC if (dbg->de_simple_malloc_base) { struct simple_malloc_record_s *smp = dbg->de_simple_malloc_base; while (smp) { int i; struct simple_malloc_record_s *prev_smp = 0; for (i = 0; i < smp->sr_used; ++i) { struct simple_malloc_entry_s *cur; cur = &smp->sr_entry[i]; if (cur->se_addr != 0) { free(cur->se_addr); cur->se_addr = 0; } } prev_smp = smp; smp = smp->sr_next; free(prev_smp); } dbg->de_simple_malloc_base = 0; } #else for (i = 1; i < ALLOC_AREA_REAL_TABLE_MAX; i++) { int indx = i; alloc_hdr = &dbg->de_alloc_hdr[indx]; if (alloc_hdr->ah_alloc_area_head != NULL) { _dwarf_recursive_free(alloc_hdr->ah_alloc_area_head); } } #endif rela_free(&dbg->de_debug_info); rela_free(&dbg->de_debug_types); rela_free(&dbg->de_debug_abbrev); rela_free(&dbg->de_debug_line); rela_free(&dbg->de_debug_loc); rela_free(&dbg->de_debug_aranges); rela_free(&dbg->de_debug_macinfo); rela_free(&dbg->de_debug_pubnames); rela_free(&dbg->de_debug_str); rela_free(&dbg->de_debug_frame); rela_free(&dbg->de_debug_frame_eh_gnu); rela_free(&dbg->de_debug_pubtypes); rela_free(&dbg->de_debug_funcnames); rela_free(&dbg->de_debug_typenames); rela_free(&dbg->de_debug_varnames); rela_free(&dbg->de_debug_weaknames); rela_free(&dbg->de_debug_ranges); dwarf_harmless_cleanout(&dbg->de_harmless_errors); memset(dbg, 0, sizeof(*dbg)); /* Prevent accidental use later. */ free(dbg); return (DW_DLV_OK); }