mirror of
https://github.com/davea42/libdwarf-code.git
synced 2025-10-24 03:52:45 +08:00

are caught so we avoid some coredumps. Such strings in DWARF are created by 'fuzzing' or by a bug in a compiler or linker. libdwarf/dwarf_error.c libdwarf/dwarf_form.c libdwarf/dwarf_frame.c libdwarf/dwarf_frame.h libdwarf/dwarf_frame2.c libdwarf/dwarf_global.c libdwarf/dwarf_line.c libdwarf/dwarf_macro.c libdwarf/dwarf_string.c libdwarf/dwarf_util.c libdwarf/dwarf_util.h libdwarf/libdwarf.h.in
83 lines
2.5 KiB
C
83 lines
2.5 KiB
C
/*
|
|
|
|
Copyright (C) 2000-2004 Silicon Graphics, Inc. All Rights Reserved.
|
|
Portions Copyright (C) 2009-2011 David Anderson. All Rights Reserved.
|
|
|
|
This program is free software; you can redistribute it and/or modify it
|
|
under the terms of version 2.1 of the GNU Lesser General Public License
|
|
as published by the Free Software Foundation.
|
|
|
|
This program is distributed in the hope that it would be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
Further, this software is distributed without any warranty that it is
|
|
free of the rightful claim of any third person regarding infringement
|
|
or the like. Any license provided herein, whether implied or
|
|
otherwise, applies only to this software file. Patent licenses, if
|
|
any, provided herein do not apply to combinations of this program with
|
|
other software, or any other product whatsoever.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this program; if not, write the Free Software
|
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
|
|
USA.
|
|
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include "dwarf_incl.h"
|
|
|
|
int
|
|
dwarf_get_str(Dwarf_Debug dbg,
|
|
Dwarf_Off offset,
|
|
char **string,
|
|
Dwarf_Signed * returned_str_len, Dwarf_Error * error)
|
|
{
|
|
int res = DW_DLV_ERROR;
|
|
void *secptr = 0;
|
|
void *begin = 0;
|
|
void *end = 0;
|
|
|
|
if (dbg == NULL) {
|
|
_dwarf_error(NULL, error, DW_DLE_DBG_NULL);
|
|
return (DW_DLV_ERROR);
|
|
}
|
|
|
|
if (offset == dbg->de_debug_str.dss_size) {
|
|
/* Normal (if we've iterated thru the set of strings using
|
|
dwarf_get_str and are at the end). */
|
|
return DW_DLV_NO_ENTRY;
|
|
}
|
|
if (offset > dbg->de_debug_str.dss_size) {
|
|
_dwarf_error(dbg, error, DW_DLE_DEBUG_STR_OFFSET_BAD);
|
|
return (DW_DLV_ERROR);
|
|
}
|
|
|
|
if (string == NULL) {
|
|
_dwarf_error(dbg, error, DW_DLE_STRING_PTR_NULL);
|
|
return (DW_DLV_ERROR);
|
|
}
|
|
|
|
res = _dwarf_load_section(dbg, &dbg->de_debug_str,error);
|
|
if (res != DW_DLV_OK) {
|
|
return res;
|
|
}
|
|
if (!dbg->de_debug_str.dss_size) {
|
|
return (DW_DLV_NO_ENTRY);
|
|
}
|
|
secptr =dbg->de_debug_str.dss_data;
|
|
begin = (char *)secptr + offset;
|
|
end = (char *)secptr + dbg->de_debug_str.dss_size;
|
|
|
|
res = _dwarf_check_string_valid(dbg,secptr,begin,end,error);
|
|
if (res != DW_DLV_OK) {
|
|
return res;
|
|
}
|
|
|
|
*string = (char *) begin;
|
|
*returned_str_len = strlen(*string);
|
|
return DW_DLV_OK;
|
|
}
|
|
|