aboutsummaryrefslogtreecommitdiff
path: root/libctf/ctf-lookup.c
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2021-01-19 12:45:18 +0000
committerNick Alcock <nick.alcock@oracle.com>2021-01-19 12:45:19 +0000
commite05a3e5a491a8ef2079eef558bbe8e9feb0b3c03 (patch)
tree8b1526e2272d3ed24e412425e7979fef15bdf4e4 /libctf/ctf-lookup.c
parentc98de297b37ffee7bdb48682eec73e4a608c3974 (diff)
downloadgdb-e05a3e5a491a8ef2079eef558bbe8e9feb0b3c03.zip
gdb-e05a3e5a491a8ef2079eef558bbe8e9feb0b3c03.tar.gz
gdb-e05a3e5a491a8ef2079eef558bbe8e9feb0b3c03.tar.bz2
libctf: lookup_by_name: do not return success for nonexistent pointer types
The recent work allowing lookups of pointers in child dicts when the pointed-to type is in the parent dict broke the case where a pointer type that does not exist at all is looked up: we mistakenly return the pointed-to type, which is likely not a pointer at all. This causes considerable confusion. Fixed, with a new testcase. libctf/ChangeLog 2021-01-19 Nick Alcock <nick.alcock@oracle.com> * ctf-lookup.c (ctf_lookup_by_name_internal): Do not return the base type if looking up a nonexistent pointer type. * testsuite/libctf-regression/pptrtab*: Test it.
Diffstat (limited to 'libctf/ctf-lookup.c')
-rw-r--r--libctf/ctf-lookup.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/libctf/ctf-lookup.c b/libctf/ctf-lookup.c
index c7f7e29..6d4e085 100644
--- a/libctf/ctf-lookup.c
+++ b/libctf/ctf-lookup.c
@@ -184,24 +184,36 @@ ctf_lookup_by_name_internal (ctf_dict_t *fp, ctf_dict_t *child,
from resolving the type down to its base type and use that instead.
This helps with cases where the CTF data includes "struct foo *"
but not "foo_t *" and the user tries to access "foo_t *" in the
- debugger. */
+ debugger.
+
+ There is extra complexity here because uninitialized elements in
+ the pptrtab and ptrtab are set to zero, but zero (as the type ID
+ meaning the unimplemented type) is a valid return type from
+ ctf_lookup_by_name. (Pointers to types are never of type 0, so
+ this is unambiguous, just fiddly to deal with.) */
uint32_t idx = LCTF_TYPE_TO_INDEX (fp, type);
int in_child = 0;
- ntype = type;
+ ntype = CTF_ERR;
if (child && idx <= child->ctf_pptrtab_len)
{
ntype = child->ctf_pptrtab[idx];
if (ntype)
in_child = 1;
+ else
+ ntype = CTF_ERR;
}
- if (ntype == 0)
- ntype = fp->ctf_ptrtab[idx];
+ if (ntype == CTF_ERR)
+ {
+ ntype = fp->ctf_ptrtab[idx];
+ if (ntype == 0)
+ ntype = CTF_ERR;
+ }
/* Try resolving to its base type and check again. */
- if (ntype == 0)
+ if (ntype == CTF_ERR)
{
if (child)
ntype = ctf_type_resolve_unsliced (child, type);
@@ -213,16 +225,22 @@ ctf_lookup_by_name_internal (ctf_dict_t *fp, ctf_dict_t *child,
idx = LCTF_TYPE_TO_INDEX (fp, ntype);
- ntype = 0;
+ ntype = CTF_ERR;
if (child && idx <= child->ctf_pptrtab_len)
{
ntype = child->ctf_pptrtab[idx];
if (ntype)
in_child = 1;
+ else
+ ntype = CTF_ERR;
}
- if (ntype == 0)
- ntype = fp->ctf_ptrtab[idx];
+ if (ntype == CTF_ERR)
+ {
+ ntype = fp->ctf_ptrtab[idx];
+ if (ntype == 0)
+ ntype = CTF_ERR;
+ }
if (ntype == CTF_ERR)
goto notype;
}