libctf, create: fix addition of anonymous struct/union members
authorNick Alcock <nick.alcock@oracle.com>
Tue, 2 Jun 2020 19:38:17 +0000 (20:38 +0100)
committerNick Alcock <nick.alcock@oracle.com>
Wed, 22 Jul 2020 16:57:28 +0000 (17:57 +0100)
A Solaris-era bug causes us to check the offsets of types with no names
against the first such type when ctf_add_type()ing members to a struct
or union.  Members with no names (i.e. anonymous struct/union members)
can appear as many times as you like in a struct/union, so this check
should be skipped in this case.

libctf/
* ctf-create.c (membcmp)  Skip nameless members.

libctf/ChangeLog
libctf/ctf-create.c

index acff0b185a5ffa262a183b6322923ff4895f6b6c..671df6854217527a82bef8f675c94c4ecb59aae3 100644 (file)
@@ -1,3 +1,7 @@
+2020-07-22  Nick Alcock  <nick.alcock@oracle.com>
+
+       * ctf-create.c (membcmp)  Skip nameless members.
+
 2020-07-22  Nick Alcock  <nick.alcock@oracle.com>
 
        * ctf-create.c (ctf_add_member_offset): Support names of ""
index 848e725ef242b66e2189579d8006db45327ceb46..5cbcfe0a70265da4ae0ee479cd8d1426aff1c422 100644 (file)
@@ -1602,6 +1602,11 @@ membcmp (const char *name, ctf_id_t type _libctf_unused_, unsigned long offset,
   ctf_bundle_t *ctb = arg;
   ctf_membinfo_t ctm;
 
+  /* Don't check nameless members (e.g. anonymous structs/unions) against each
+     other.  */
+  if (name[0] == 0)
+    return 0;
+
   if (ctf_member_info (ctb->ctb_file, ctb->ctb_type, name, &ctm) < 0)
     {
       ctf_dprintf ("Conflict due to member %s iteration error: %s.\n", name,