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:
Nick Alcock 2021-01-19 12:45:18 +00:00
parent c98de297b3
commit e05a3e5a49
5 changed files with 45 additions and 10 deletions

View file

@ -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;
}