Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 10 May 2015 21:39:25 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r282739 - head/cddl/contrib/opensolaris/common/ctf
Message-ID:  <201505102139.t4ALdPXD082744@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Sun May 10 21:39:24 2015
New Revision: 282739
URL: https://svnweb.freebsd.org/changeset/base/282739

Log:
  ctf_add_type(): when looking up an integer or floating point type in the
  list of pending dynamic type definitions, a match on the type name is not
  sufficient - we need to compare the type encodings as well. For example,
  bitfields have their own distinct type definitions which share the name of
  the underlying integer type, and these types aren't generally
  interchangeable.
  
  This bug was causing the following libdtrace error when attempting to trace
  the th_flags member of a struct tcphdr:
    cg: bad field: off 104 type <32877> bits 539620016
  
  Reported by:	rwatson
  MFC after:	3 weeks

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	Sun May 10 21:26:07 2015	(r282738)
+++ head/cddl/contrib/opensolaris/common/ctf/ctf_create.c	Sun May 10 21:39:24 2015	(r282739)
@@ -1328,15 +1328,28 @@ ctf_add_type(ctf_file_t *dst_fp, ctf_fil
 	 * we are looking for.  This is necessary to permit ctf_add_type() to
 	 * operate recursively on entities such as a struct that contains a
 	 * pointer member that refers to the same struct type.
+	 *
+	 * In the case of integer and floating point types, we match using the
+	 * type encoding as well - else we may incorrectly return a bitfield
+	 * type, for instance.
 	 */
 	if (dst_type == CTF_ERR && name[0] != '\0') {
 		for (dtd = ctf_list_prev(&dst_fp->ctf_dtdefs); dtd != NULL &&
 		    CTF_TYPE_TO_INDEX(dtd->dtd_type) > dst_fp->ctf_dtoldid;
 		    dtd = ctf_list_prev(dtd)) {
-			if (CTF_INFO_KIND(dtd->dtd_data.ctt_info) == kind &&
-			    dtd->dtd_name != NULL &&
-			    strcmp(dtd->dtd_name, name) == 0)
-				return (dtd->dtd_type);
+			if (CTF_INFO_KIND(dtd->dtd_data.ctt_info) != kind ||
+			    dtd->dtd_name == NULL ||
+			    strcmp(dtd->dtd_name, name) != 0)
+				continue;
+			if (kind == CTF_K_INTEGER || kind == CTF_K_FLOAT) {
+				if (ctf_type_encoding(src_fp, src_type,
+				    &src_en) != 0)
+					continue;
+				if (bcmp(&src_en, &dtd->dtd_u.dtu_enc,
+				    sizeof (ctf_encoding_t)) != 0)
+					continue;
+			}
+			return (dtd->dtd_type);
 		}
 	}
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201505102139.t4ALdPXD082744>