/* This function performs error handling as described in the libdwarf consumer document section 3. Dbg is the Dwarf_debug structure being processed. Error is a pointer to the pointer to the error descriptor that will be returned. Errval is an error code listed in dwarf_error.h. */ void _dwarf_error(Dwarf_Debug dbg, Dwarf_Error * error, Dwarf_Sword errval) { Dwarf_Error errptr; /* Allow NULL dbg on entry, since sometimes that can happen and we want to report the upper-level error, not this one. */ if (error != NULL) { /* If dbg is NULL, use the alternate error struct. However, this will overwrite the earlier error. */ if (dbg != NULL) { errptr = (Dwarf_Error) _dwarf_get_alloc(dbg, DW_DLA_ERROR, 1); if (errptr == NULL) { fprintf(stderr, "Could not allocate Dwarf_Error structure, " "abort() in libdwarf.\n"); abort(); } } else { /* We have no dbg to work with. dwarf_init failed. We hack up a special area. */ errptr = _dwarf_special_no_dbg_error_malloc(); if (errptr == NULL) { fprintf(stderr, "Could not allocate Dwarf_Error structure, " "abort() in libdwarf..\n"); abort(); } } errptr->er_errval = errval; *error = errptr; return; } if (dbg != NULL && dbg->de_errhand != NULL) { errptr = (Dwarf_Error) _dwarf_get_alloc(dbg, DW_DLA_ERROR, 1); if (errptr == NULL) { fprintf(stderr, "Could not allocate Dwarf_Error structure," " abort() in libdwarf.\n"); abort(); } errptr->er_errval = errval; dbg->de_errhand(errptr, dbg->de_errarg); return; } fprintf(stderr, "abort() in libdwarf. No error argument, no handler.\n"); abort(); }
/* This function performs error handling as described in the libdwarf consumer document section 3. Dbg is the Dwarf_debug structure being processed. Error is a pointer to the pointer to the error descriptor that will be returned. Errval is an error code listed in dwarf_error.h. If the malloc arena is exhausted we return a pointer to a special static error record. This special singleton is mostly ignored by dwarf_dealloc(). Users should not be storing Dwarf_Error pointers for long so this singleton is only going to cause confusion when callers try to save an out-of-memory Dwarf_Error pointer. The _dwarf_failsafe_error is intended to be an improvement over an abort() call. The failsafe means we will not abort due to a Dwarf_Error struct creation. */ void _dwarf_error(Dwarf_Debug dbg, Dwarf_Error * error, Dwarf_Sword errval) { Dwarf_Error errptr; /* Allow NULL dbg on entry, since sometimes that can happen and we want to report the upper-level error, not this one. */ if (error != NULL) { /* If dbg is NULL, use the alternate error struct. However, this will overwrite the earlier error. */ if (dbg != NULL) { errptr = (Dwarf_Error) _dwarf_get_alloc(dbg, DW_DLA_ERROR, 1); if (!errptr) { errptr = &_dwarf_failsafe_error; errptr->er_static_alloc = DE_STATIC; } else { errptr->er_static_alloc = DE_STANDARD; } } else { /* We have no dbg to work with. dwarf_init failed. We hack up a special area. */ errptr = _dwarf_special_no_dbg_error_malloc(); if (!errptr) { errptr = &_dwarf_failsafe_error; errptr->er_static_alloc = DE_STATIC; } else { errptr->er_static_alloc = DE_MALLOC; } } errptr->er_errval = errval; *error = errptr; return; } if (dbg != NULL && dbg->de_errhand != NULL) { errptr = (Dwarf_Error) _dwarf_get_alloc(dbg, DW_DLA_ERROR, 1); if (errptr == NULL) { errptr = &_dwarf_failsafe_error; errptr->er_static_alloc = DE_STATIC; } errptr->er_errval = errval; dbg->de_errhand(errptr, dbg->de_errarg); return; } fflush(stdout); fprintf(stdout, "\nNow abort() in libdwarf. " "No error argument or handler available.\n"); fflush(stdout); abort(); }