From: Nick Alcock Date: Mon, 21 Oct 2019 10:33:19 +0000 (+0100) Subject: libctf: create: don't add forwards if the type added already exists X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6bbf9da8927e848d3d6fdd188ca84385f1dddcce;p=binutils-gdb.git 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. --- diff --git a/libctf/ChangeLog b/libctf/ChangeLog index 056cb7b929d..7868d0b5a9e 100644 --- a/libctf/ChangeLog +++ b/libctf/ChangeLog @@ -1,3 +1,8 @@ +2020-06-26 Nick Alcock + + * ctf-create.c (ctf_add_forward): Don't add forwards to + types that already exist. + 2020-06-26 Nick Alcock * ctf-open.c (init_types): Only intern root-visible types. diff --git a/libctf/ctf-create.c b/libctf/ctf-create.c index e8e80287cb3..c24a246c164 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);