aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2019-10-21 11:33:19 +0100
committerNick Alcock <nick.alcock@oracle.com>2020-06-26 15:56:39 +0100
commit6bbf9da8927e848d3d6fdd188ca84385f1dddcce (patch)
treee1a74d22ddf3d9960179d6183af26bd8c7aec16a
parentfe4c2d55634c700ba527ac4183e05c66e9f93c62 (diff)
downloadbinutils-6bbf9da8927e848d3d6fdd188ca84385f1dddcce.zip
binutils-6bbf9da8927e848d3d6fdd188ca84385f1dddcce.tar.gz
binutils-6bbf9da8927e848d3d6fdd188ca84385f1dddcce.tar.bz2
libctf: create: don't add forwards if the type added already exists
This is what ctf_add_forward is documented to do, but it's not what it actually does: the code is quite happy to add forwards that duplicate existing structs, etc. This is obviously wrong and breaks both the nondeduplicating linker and the upcoming deduplicator, as well as allowing ordinary callers of ctf_add_type to corrupt the dictionary by just adding the same root- visible forward more than once. libctf/ * ctf-create.c (ctf_add_forward): Don't add forwards to types that already exist.
-rw-r--r--libctf/ChangeLog5
-rw-r--r--libctf/ctf-create.c5
2 files changed, 9 insertions, 1 deletions
diff --git a/libctf/ChangeLog b/libctf/ChangeLog
index 056cb7b..7868d0b 100644
--- a/libctf/ChangeLog
+++ b/libctf/ChangeLog
@@ -1,5 +1,10 @@
2020-06-26 Nick Alcock <nick.alcock@oracle.com>
+ * ctf-create.c (ctf_add_forward): Don't add forwards to
+ types that already exist.
+
+2020-06-26 Nick Alcock <nick.alcock@oracle.com>
+
* ctf-open.c (init_types): Only intern root-visible types.
* ctf-create.c (ctf_dtd_insert): Likewise.
(ctf_dtd_delete): Only remove root-visible types.
diff --git a/libctf/ctf-create.c b/libctf/ctf-create.c
index e8e8028..c24a246 100644
--- a/libctf/ctf-create.c
+++ b/libctf/ctf-create.c
@@ -1229,7 +1229,10 @@ ctf_add_forward (ctf_file_t *fp, uint32_t flag, const char *name,
if (name != NULL)
type = ctf_lookup_by_rawname (fp, kind, name);
- if ((type = ctf_add_generic (fp, flag, name, CTF_K_FORWARD,&dtd)) == CTF_ERR)
+ if (type)
+ return type;
+
+ if ((type = ctf_add_generic (fp, flag, name, CTF_K_FORWARD, &dtd)) == CTF_ERR)
return CTF_ERR; /* errno is set for us. */
dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_FORWARD, flag, 0);