old-cross-binutils/gdb/testsuite/gdb.dwarf2
Kevin Buettner 7d45c7c3f6 dwarf2read.c: Check type of string valued attributes prior to decoding.
This change introduces a new function, dwarf2_string_attr(), which is
a wrapper for dwarf2_attr().  dwarf2read.c has been updated to
call dwarf2_string_attr in most instances where a string-valued
attribute is decoded to produce a string value.  In most cases, it
simplifies the code; in some instances, the complexity of the code
remains unchanged.

I performed this change by looking for instances where the
result of DW_STRING was used in an assignment.  Many of these
had a pattern which (roughly) looks something like this:

  struct attribute *attr = NULL;

  attr = dwarf2_attr (die, name, cu);
  if (attr != NULL && DW_STRING (attr))
    {
      const char *str;
      ...
      str = DW_STRING (attr);
      ... /* Use str in some fashion.  */
    }

Code of this form is transformed to look like this instead:

  const char *str;

  str = dwarf2_string_attr (die, name, cu)
  if (str != NULL)
    {
       ...
       /* Use str in some fashion.  */
       ...
    }

In addition to invoking dwarf2_attr() and DW_STRING(),
dwarf2_string_attr() checks to make sure that the attribute's
`form' field matches one of DW_FORM_strp, DW_FORM_string, or
DW_FORM_GNU_strp_alt.  If it does not match one of these forms,
it will return a NULL value in addition to calling complaint().

An earlier version of this patch did this type checking for one
particular instance where a string attribute was being decoded.
The situation that I was attempting to handle in that earlier patch is
this:

The Texas Instruments compiler uses the encoding for
DW_AT_MIPS_linkage_name for other purposes.  TI uses the encoding,
0x2007, for TI_AT_TI_end_line which, unlike DW_AT_MIPS_linkage_name,
does not have a string-typed value.  In this instance, GDB was attempting
to use an integer value as a string pointer, with predictable results.
(GDB would die with a segmentation fault.)

I've added a test which reproduces the problem that I was orignally
wanting to fix.  It uses DW_AT_MIPS_linkage name with an associate
value which is a string, and again, where the value is a small
integer.

My test case causes GDB to segfault in an unpatched GDB.  There
will be two PASSes in a patched GDB.

Unpatched GDB:

(gdb) ptype f
ERROR: Process no longer exists
UNRESOLVED: gdb.dwarf2/dw2-bad-mips-linkage-name.exp: ptype f
ERROR: Couldn't send ptype g to GDB.
UNRESOLVED: gdb.dwarf2/dw2-bad-mips-linkage-name.exp: ptype g

Patched GDB:

(gdb) ptype f
type = bool ()
(gdb) PASS: gdb.dwarf2/dw2-bad-mips-linkage-name.exp: ptype f
ptype g
type = bool ()
(gdb) PASS: gdb.dwarf2/dw2-bad-mips-linkage-name.exp: ptype g

I see no regressions on an x86_64 native target.

gdb/ChangeLog:

	* dwarf2read.c (dwarf2_string_attr): New function.
	(lookup_dwo_unit, process_psymtab_comp_unit_reader)
	(dwarf2_compute_name, dwarf2_physname, find_file_and_directory)
	(read_call_site_scope, namespace_name, guess_full_die_structure_name)
	(anonymous_struct_prefix, prepare_one_comp_unit): Use
	dwarf2_string_attr in place of dwarf2_attr and DW_STRING.

gdb/testsuite/ChangeLog:

	* gdb.dwarf2/dw2-bad-mips-linkage-name.c: New file.
	* gdb.dwarf2/dw2-bad-mips-linkage-name.exp: New file.
2015-08-19 11:48:13 -07:00
..
arr-stride.c
arr-stride.exp
arr-subrange.c
arr-subrange.exp
atomic-type.exp
atomic.c
callframecfa.exp
callframecfa.S
clztest.c
clztest.exp
clztest.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
corrupt.c
corrupt.exp
count.exp
data-loc.c
data-loc.exp
dup-psym.exp
dup-psym.S
dw2-abs-hi-pc-hello-dbg.S
dw2-abs-hi-pc-hello.c
dw2-abs-hi-pc-world-dbg.S
dw2-abs-hi-pc-world.c
dw2-abs-hi-pc.c
dw2-abs-hi-pc.exp
dw2-ada-ffffffff.exp
dw2-ada-ffffffff.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-anon-mptr.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-anon-mptr.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-anonymous-func.exp
dw2-anonymous-func.S
dw2-bad-mips-linkage-name.c
dw2-bad-mips-linkage-name.exp
dw2-bad-parameter-type.exp
dw2-bad-parameter-type.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-basic.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-basic.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-canonicalize-type.exp
dw2-canonicalize-type.S
dw2-case-insensitive-debug.S
dw2-case-insensitive.c
dw2-case-insensitive.exp
dw2-common-block.exp
dw2-common-block.S
dw2-compdir-oldgcc.exp
dw2-compdir-oldgcc.S
dw2-compressed.exp
dw2-compressed.S
dw2-const.exp
dw2-const.S
dw2-cp-infcall-ref-static-main.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-cp-infcall-ref-static.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-cp-infcall-ref-static.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-cu-size.exp
dw2-cu-size.S
dw2-dir-file-name.c
dw2-dir-file-name.exp
dw2-dos-drive.exp
dw2-dos-drive.S
dw2-double-set-die-type.exp
dw2-double-set-die-type.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-dummy-cu.exp
dw2-dummy-cu.S
dw2-dup-frame.c
dw2-dup-frame.exp
dw2-dup-frame.S
dw2-empty-namespace.exp
dw2-empty-namespace.S
dw2-empty-pc-range.exp
dw2-empty-pc-range.S
dw2-entry-value-main.c
dw2-entry-value.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-entry-value.S
dw2-error.c
dw2-error.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-error.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-filename.exp
dw2-filename.S
dw2-icc-opaque.exp
dw2-icc-opaque.S
dw2-icycle.c
dw2-icycle.exp
dw2-icycle.S
dw2-ifort-parameter.c
dw2-ifort-parameter.exp
dw2-inheritance.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-inheritance.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-inline-break.exp
dw2-inline-break.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-inline-param-main.c
dw2-inline-param.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-inline-param.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-intercu.exp
dw2-intercu.S Properly intern constants into psymtab 2015-03-26 19:41:54 +01:00
dw2-intermix.exp
dw2-intermix.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-linkage-name-trust-main.cc
dw2-linkage-name-trust.exp
dw2-linkage-name-trust.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-minsym-in-cu.exp
dw2-minsym-in-cu.S
dw2-modula2-self-type.exp
dw2-modula2-self-type.S
dw2-namespaceless-anonymous.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-namespaceless-anonymous.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-noloc-main.c
dw2-noloc.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-noloc.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-objfile-overlap-inner.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-objfile-overlap-outer.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-objfile-overlap.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-op-call.exp Rename dwarf2 to dwarf in "set debug" and maintenance commands. 2015-05-26 16:50:57 -07:00
dw2-op-call.S
dw2-op-out-param.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-op-out-param.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-op-stack-value.exp
dw2-op-stack-value.S
dw2-param-error-main.c
dw2-param-error.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-param-error.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-producer.exp
dw2-producer.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-ranges.c
dw2-ranges.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-ranges2.c
dw2-ranges3.c
dw2-ref-missing-frame-func.c
dw2-ref-missing-frame-main.c
dw2-ref-missing-frame.exp
dw2-ref-missing-frame.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-reg-undefined.c
dw2-reg-undefined.exp
dw2-reg-undefined.S
dw2-restore.exp
dw2-restore.S
dw2-restrict.c
dw2-restrict.exp
dw2-restrict.S
dw2-simple-locdesc.exp
dw2-simple-locdesc.S
dw2-single-line-discriminators.c
dw2-single-line-discriminators.exp
dw2-single-line-discriminators.S
dw2-skip-prologue.c
dw2-skip-prologue.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-skip-prologue.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-stack-boundary.exp
dw2-stack-boundary.S
dw2-strp.exp
dw2-strp.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-undefined-ret-addr.c
dw2-undefined-ret-addr.exp Share the "multi_line" helper among all testcases 2015-04-01 15:06:39 +02:00
dw2-undefined-ret-addr.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dw2-unresolved-main.c
dw2-unresolved.exp
dw2-unresolved.S
dw2-var-zero-addr.exp
dw2-var-zero-addr.S
dw4-sig-type-unused.exp
dw4-sig-type-unused.S
dw4-sig-types-b.cc
dw4-sig-types.cc
dw4-sig-types.exp
dw4-sig-types.h
dwp-symlink.c
dwp-symlink.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dwz.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
dwzbuildid.exp
dynarr-ptr.c
dynarr-ptr.exp
enum-type.exp
file1.txt
fission-base.c
fission-base.exp
fission-base.S
fission-loclists.exp
fission-loclists.S
fission-mix.c
fission-mix.exp
fission-mix.h Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
fission-mix2.c
fission-reread.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
fission-reread.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
gdb-index.exp
implptr-64bit.exp
implptr-64bit.S
implptr-optimized-out.exp
implptr.c
implptr.exp
implptr.S
implptrconst.c
implptrconst.exp
implptrpiece.exp
mac-fileno.exp
mac-fileno.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
main.c
Makefile.in Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
member-ptr-forwardref.exp
member-ptr-forwardref.S
method-ptr.cc
method-ptr.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
missing-sig-type.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
nostaticblock.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
opaque-type-lookup-2.c
opaque-type-lookup.c
opaque-type-lookup.exp PR symtab/18258 2015-05-27 11:50:38 -07:00
pieces-optimized-out.c
pieces-optimized-out.exp
pieces-optimized-out.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
pieces.c
pieces.exp
pieces.S
pr10770.c
pr10770.exp
pr11465.exp
pr11465.S
pr13961.exp
pr13961.S
staticvirtual.exp
subrange.exp
symtab-producer.exp
trace-crash.exp
trace-crash.S PR c++/14999: 2013-01-18 18:32:35 +00:00
typeddwarf-amd64.S
typeddwarf.c
typeddwarf.exp
typeddwarf.S
valop.exp
valop.S
watch-notconst.c
watch-notconst.exp
watch-notconst2.c
watch-notconst2.S