libctf: create: ctf_add_type should hand back already-added non-SoUs

When we add a type from a dictionary and then try to add it again, we
should hand it back unchanged unless it is a structure, union or enum
with a different number of members.  That's what the comment says we do.

Instead, we hand it back unchanged *only* if it is a structure, union or
enum with the same number of members: non-structs, unions and enums are
unconditionally added.  This causes extreme type bloating and (in
conjunction with the bug fixed by the next commit) can easily lead to
the same type being mistakenly added to a dictionary more than once
(which, for forwards, was not banned and led to dictionary corruption).

libctf/
	* ctf-create.c (ctf_add_type_internal): Hand back existing types
	unchanged.
This commit is contained in:
Nick Alcock 2019-11-05 13:09:57 +00:00
parent 6bbf9da892
commit d04a47ac53
2 changed files with 15 additions and 6 deletions

View File

@ -1,3 +1,8 @@
2020-06-26 Nick Alcock <nick.alcock@oracle.com>
* ctf-create.c (ctf_add_type_internal): Hand back existing types
unchanged.
2020-06-26 Nick Alcock <nick.alcock@oracle.com>
* ctf-create.c (ctf_add_forward): Don't add forwards to

View File

@ -1665,13 +1665,17 @@ ctf_add_type_internal (ctf_file_t *dst_fp, ctf_file_t *src_fp, ctf_id_t src_type
kind and (if a struct or union) has the same number of members, hand it
straight back. */
if ((ctf_type_kind_unsliced (tmp_fp, tmp) == (int) kind)
&& (kind == CTF_K_STRUCT || kind == CTF_K_UNION
|| kind == CTF_K_ENUM))
if (ctf_type_kind_unsliced (tmp_fp, tmp) == (int) kind)
{
if ((dst_tp = ctf_lookup_by_id (&tmp_fp, dst_type)) != NULL)
if (vlen == LCTF_INFO_VLEN (tmp_fp, dst_tp->ctt_info))
return tmp;
if (kind == CTF_K_STRUCT || kind == CTF_K_UNION
|| kind == CTF_K_ENUM)
{
if ((dst_tp = ctf_lookup_by_id (&tmp_fp, dst_type)) != NULL)
if (vlen == LCTF_INFO_VLEN (tmp_fp, dst_tp->ctt_info))
return tmp;
}
else
return tmp;
}
}