[binutils-gdb] libctf: create: ctf_add_type should hand back already-added non-SoUs

Nick Alcock nix@sourceware.org
Fri Jun 26 14:59:33 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=d04a47ac53b7e3ae572021711c91f2f3d333417b

commit d04a47ac53b7e3ae572021711c91f2f3d333417b
Author: Nick Alcock <nick.alcock@oracle.com>
Date:   Tue Nov 5 13:09:57 2019 +0000

    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.

Diff:
---
 libctf/ChangeLog    |  5 +++++
 libctf/ctf-create.c | 16 ++++++++++------
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/libctf/ChangeLog b/libctf/ChangeLog
index 7868d0b5a9e..1b019a3e5f7 100644
--- a/libctf/ChangeLog
+++ b/libctf/ChangeLog
@@ -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
diff --git a/libctf/ctf-create.c b/libctf/ctf-create.c
index c24a246c164..7e94a254c50 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;
 	}
     }


More information about the Gdb-cvs mailing list