Author: markj
Date: Wed Mar 11 00:01:39 2015
New Revision: 279869
URL: https://svnweb.freebsd.org/changeset/base/279869

Log:
  When copying a type from a source CTF container to a destination container,
  ctf_add_type() first performs a by-name lookup of the type in the
  destination container. If this lookup returns a forward declaration for an
  enum, struct, or union, reset dst_type back to CTF_ERR, indicating that the
  source type is not in fact present in the destination container. This
  ensures that ctf_add_type() will also search the destination container's
  dynamic type list for the source type.
  
  Without this change, a pair of mutually recursive struct definitions could
  cause infinite recursion in ctf_add_type() if the destination container
  only contained forward declarations for the struct types: ctf_add_type()
  recursively calls itself on each struct member's type, and the forward
  declarations meant that the dynamic type list search would be skipped.
  
  MFC after:    2 weeks
  Sponsored by: EMC / Isilon Storage Division

Modified:
  head/cddl/contrib/opensolaris/common/ctf/ctf_create.c

Modified: head/cddl/contrib/opensolaris/common/ctf/ctf_create.c
==============================================================================
--- head/cddl/contrib/opensolaris/common/ctf/ctf_create.c       Tue Mar 10 
23:27:13 2015        (r279868)
+++ head/cddl/contrib/opensolaris/common/ctf/ctf_create.c       Wed Mar 11 
00:01:39 2015        (r279869)
@@ -1313,10 +1313,13 @@ ctf_add_type(ctf_file_t *dst_fp, ctf_fil
         * unless dst_type is a forward declaration and src_type is a struct,
         * union, or enum (i.e. the definition of the previous forward decl).
         */
-       if (dst_type != CTF_ERR && dst_kind != kind && (
-           dst_kind != CTF_K_FORWARD || (kind != CTF_K_ENUM &&
-           kind != CTF_K_STRUCT && kind != CTF_K_UNION)))
-               return (ctf_set_errno(dst_fp, ECTF_CONFLICT));
+       if (dst_type != CTF_ERR && dst_kind != kind) {
+               if (dst_kind != CTF_K_FORWARD || (kind != CTF_K_ENUM &&
+                   kind != CTF_K_STRUCT && kind != CTF_K_UNION))
+                       return (ctf_set_errno(dst_fp, ECTF_CONFLICT));
+               else
+                       dst_type = CTF_ERR;
+       }
 
        /*
         * If the non-empty name was not found in the appropriate hash, search
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to