/* Contrary to long standing documentation, The string pointer returned thru return_str must never have dwarf_dealloc() applied to it. Documentation fixed July 2005. */ int dwarf_formstring(Dwarf_Attribute attr, char **return_str, Dwarf_Error * error) { Dwarf_CU_Context cu_context; Dwarf_Debug dbg; Dwarf_Unsigned offset; int res; if (attr == NULL) { _dwarf_error(NULL, error, DW_DLE_ATTR_NULL); return (DW_DLV_ERROR); } cu_context = attr->ar_cu_context; if (cu_context == NULL) { _dwarf_error(NULL, error, DW_DLE_ATTR_NO_CU_CONTEXT); return (DW_DLV_ERROR); } if (cu_context->cc_dbg == NULL) { _dwarf_error(NULL, error, DW_DLE_ATTR_DBG_NULL); return (DW_DLV_ERROR); } dbg = cu_context->cc_dbg; if (attr->ar_attribute_form == DW_FORM_string) { void *begin = attr->ar_debug_info_ptr; if (0 == dbg->de_assume_string_in_bounds) { /* Check that string lies within current cu in .debug_info. */ void *end = dbg->de_debug_info + cu_context->cc_debug_info_offset + cu_context->cc_length + cu_context->cc_length_size + cu_context->cc_extension_size; if (0 == _dwarf_string_valid(begin, end)) { _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_SIZE_BAD); return (DW_DLV_ERROR); } } *return_str = (char *) (begin); return DW_DLV_OK; } if (attr->ar_attribute_form == DW_FORM_strp) { READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, attr->ar_debug_info_ptr, cu_context->cc_length_size); res = _dwarf_load_section(dbg, dbg->de_debug_str_index, &dbg->de_debug_str, error); if (res != DW_DLV_OK) { return res; } *return_str = (char *) (dbg->de_debug_str + offset); return DW_DLV_OK; } _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD); return (DW_DLV_ERROR); }
/* Contrary to pre-2005 documentation, The string pointer returned thru return_str must never have dwarf_dealloc() applied to it. Documentation fixed July 2005. */ int dwarf_formstring(Dwarf_Attribute attr, char **return_str, Dwarf_Error * error) { Dwarf_CU_Context cu_context = 0; Dwarf_Debug dbg = 0; Dwarf_Unsigned offset = 0; int res = DW_DLV_ERROR; Dwarf_Small *dataptr = 0; Dwarf_Small *infoptr = attr->ar_debug_ptr; res = get_attr_dbg(&dbg,&cu_context,attr,error); if (res != DW_DLV_OK) { return res; } dataptr = cu_context->cc_is_info? dbg->de_debug_info.dss_data: dbg->de_debug_types.dss_data; if (attr->ar_attribute_form == DW_FORM_string) { void *begin = attr->ar_debug_ptr; if (0 == dbg->de_assume_string_in_bounds) { /* Check that string lies within current cu in .debug_info. */ void *end = dataptr + cu_context->cc_debug_offset + cu_context->cc_length + cu_context->cc_length_size + cu_context->cc_extension_size; if (0 == _dwarf_string_valid(begin, end)) { _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_SIZE_BAD); return (DW_DLV_ERROR); } } *return_str = (char *) (begin); return DW_DLV_OK; } if (attr->ar_attribute_form == DW_FORM_GNU_strp_alt) { /* Unsure what this is really. FIXME */ *return_str = (char *)"<DW_FORM_GNU_strp_alt not handled>"; return DW_DLV_OK; } if (attr->ar_attribute_form == DW_FORM_GNU_str_index || attr->ar_attribute_form == DW_FORM_strx) { Dwarf_Unsigned offsettostr= 0; res = _dwarf_extract_string_offset_via_str_offsets(dbg, infoptr, attr->ar_attribute, attr->ar_attribute_form, cu_context, &offsettostr, error); offset = offsettostr; /* FALL THRU */ } else { if (attr->ar_attribute_form == DW_FORM_strp) { READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, infoptr, cu_context->cc_length_size); } } if (attr->ar_attribute_form == DW_FORM_strp || attr->ar_attribute_form == DW_FORM_GNU_str_index || attr->ar_attribute_form == DW_FORM_strx) { /* The 'offset' into .debug_str is set. */ res = _dwarf_load_section(dbg, &dbg->de_debug_str,error); if (res != DW_DLV_OK) { return res; } if (offset >= dbg->de_debug_str.dss_size) { /* Badly damaged DWARF here. */ _dwarf_error(dbg, error, DW_DLE_STRP_OFFSET_BAD); return (DW_DLV_ERROR); } if (0 == dbg->de_assume_string_in_bounds) { /* Check that string lies within its .debug_str. */ void *end = dbg->de_debug_str.dss_data + dbg->de_debug_str.dss_size; void*begin = dbg->de_debug_str.dss_data + offset; if (0 == _dwarf_string_valid(begin, end)) { _dwarf_error(dbg, error, DW_DLE_STRP_OFFSET_BAD); return (DW_DLV_ERROR); } } /* Ensure the offset lies within the .debug_str */ if (offset >= dbg->de_debug_str.dss_size) { _dwarf_error(dbg, error, DW_DLE_DEBUG_STR_OFFSET_BAD); return (DW_DLV_ERROR); } *return_str = (char *) (dbg->de_debug_str.dss_data + offset); return DW_DLV_OK; } _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD); return (DW_DLV_ERROR); }
/* Contrary to long standing documentation, The string pointer returned thru return_str must never have dwarf_dealloc() applied to it. Documentation fixed July 2005. */ int dwarf_formstring(Dwarf_Attribute attr, char **return_str, Dwarf_Error * error) { Dwarf_CU_Context cu_context = 0; Dwarf_Debug dbg = 0; Dwarf_Unsigned offset = 0; int res = DW_DLV_ERROR; res = get_attr_dbg(&dbg,&cu_context,attr,error); if (res != DW_DLV_OK) { return res; } if (attr->ar_attribute_form == DW_FORM_string) { void *begin = attr->ar_debug_ptr; if (0 == dbg->de_assume_string_in_bounds) { /* Check that string lies within current cu in .debug_info. */ void *end = dbg->de_debug_info.dss_data + cu_context->cc_debug_offset + cu_context->cc_length + cu_context->cc_length_size + cu_context->cc_extension_size; if (0 == _dwarf_string_valid(begin, end)) { _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_SIZE_BAD); return (DW_DLV_ERROR); } } *return_str = (char *) (begin); return DW_DLV_OK; } if (attr->ar_attribute_form == DW_FORM_strp) { READ_UNALIGNED(dbg, offset, Dwarf_Unsigned, attr->ar_debug_ptr, cu_context->cc_length_size); res = _dwarf_load_section(dbg, &dbg->de_debug_str,error); if (res != DW_DLV_OK) { return res; } if (0 == dbg->de_assume_string_in_bounds) { /* Check that string lies within current cu in .debug_info. */ void *end = dbg->de_debug_str.dss_data + dbg->de_debug_str.dss_size; void*begin = dbg->de_debug_str.dss_data + offset; if (0 == _dwarf_string_valid(begin, end)) { _dwarf_error(dbg, error, DW_DLE_STRP_OFFSET_BAD); return (DW_DLV_ERROR); } } /* Ensure the offset lies within the .debug_str */ if (offset >= dbg->de_debug_str.dss_size) { _dwarf_error(dbg, error, DW_DLE_DEBUG_STR_OFFSET_BAD); return (DW_DLV_ERROR); } *return_str = (char *) (dbg->de_debug_str.dss_data + offset); return DW_DLV_OK; } _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD); return (DW_DLV_ERROR); }