diff options
author | Nick Alcock <nick.alcock@oracle.com> | 2021-01-19 12:45:18 +0000 |
---|---|---|
committer | Nick Alcock <nick.alcock@oracle.com> | 2021-01-19 12:45:19 +0000 |
commit | e05a3e5a491a8ef2079eef558bbe8e9feb0b3c03 (patch) | |
tree | 8b1526e2272d3ed24e412425e7979fef15bdf4e4 /libctf/ctf-lookup.c | |
parent | c98de297b37ffee7bdb48682eec73e4a608c3974 (diff) | |
download | fsf-binutils-gdb-e05a3e5a491a8ef2079eef558bbe8e9feb0b3c03.zip fsf-binutils-gdb-e05a3e5a491a8ef2079eef558bbe8e9feb0b3c03.tar.gz fsf-binutils-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.c | 34 |
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; } |