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.
This commit is contained in:
parent
c98de297b3
commit
e05a3e5a49
5 changed files with 45 additions and 10 deletions
|
@ -23,13 +23,18 @@ main (int argc, char *argv[])
|
|||
goto open_err;
|
||||
|
||||
/* Make sure we can look up a_t * by name in all non-parent dicts, even though
|
||||
the a_t * and the type it points to are in distinct dicts. */
|
||||
the a_t * and the type it points to are in distinct dicts; make sure we
|
||||
cannot look up b_t *. */
|
||||
|
||||
while ((fp = ctf_archive_next (ctf, &i, &arcname, 1, &err)) != NULL)
|
||||
{
|
||||
if ((type = ctf_lookup_by_name (fp, "a_t *")) == CTF_ERR)
|
||||
goto err;
|
||||
|
||||
if ((ctf_lookup_by_name (fp, "b_t *")) != CTF_ERR ||
|
||||
ctf_errno (fp) != ECTF_NOTYPE)
|
||||
goto noerr;
|
||||
|
||||
if (ctf_type_reference (fp, type) == CTF_ERR)
|
||||
goto err;
|
||||
|
||||
|
@ -51,4 +56,7 @@ main (int argc, char *argv[])
|
|||
err:
|
||||
fprintf (stderr, "Lookup failed in %s: %s\n", arcname, ctf_errmsg (ctf_errno (fp)));
|
||||
return 1;
|
||||
noerr:
|
||||
fprintf (stderr, "Lookup unexpectedly succeeded in %s\n", arcname);
|
||||
return 1;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue