aboutsummaryrefslogtreecommitdiff
path: root/libctf/ctf-create.c
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2019-11-05 13:09:57 +0000
committerNick Alcock <nick.alcock@oracle.com>2020-06-26 15:56:39 +0100
commitd04a47ac53b7e3ae572021711c91f2f3d333417b (patch)
tree90f3e7110f3d343e5bf07c249e973efebc183ab9 /libctf/ctf-create.c
parent6bbf9da8927e848d3d6fdd188ca84385f1dddcce (diff)
downloadbinutils-d04a47ac53b7e3ae572021711c91f2f3d333417b.zip
binutils-d04a47ac53b7e3ae572021711c91f2f3d333417b.tar.gz
binutils-d04a47ac53b7e3ae572021711c91f2f3d333417b.tar.bz2
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.
Diffstat (limited to 'libctf/ctf-create.c')
-rw-r--r--libctf/ctf-create.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/libctf/ctf-create.c b/libctf/ctf-create.c
index c24a246..7e94a25 100644
--- a/libctf/ctf-create.c
+++ b/libctf/ctf-create.c
@@ -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;
}
}