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:
parent
6bbf9da892
commit
d04a47ac53
2 changed files with 15 additions and 6 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue