svn commit: r279869 - head/cddl/contrib/opensolaris/common/ctf

Mark Johnston markj at FreeBSD.org
Wed Mar 11 00:01:40 UTC 2015


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


More information about the svn-src-head mailing list