Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Jun 2014 01:55:27 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-vendor@freebsd.org
Subject:   svn commit: r266994 - in vendor/illumos/dist: cmd/dtrace/test/tst/common/arithmetic lib/libdtrace/common
Message-ID:  <201406030155.s531tRBE056462@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Tue Jun  3 01:55:27 2014
New Revision: 266994
URL: http://svnweb.freebsd.org/changeset/base/266994

Log:
  4470 overly aggressive D integer narrowing breaks 32-bit ustack helpers
  
  illumos/illumos-gate@2e0552679e3175533ade93573ac1229d20a8367b

Added:
  vendor/illumos/dist/cmd/dtrace/test/tst/common/arithmetic/tst.nonarrow.ksh
Modified:
  vendor/illumos/dist/lib/libdtrace/common/dt_cg.c

Added: vendor/illumos/dist/cmd/dtrace/test/tst/common/arithmetic/tst.nonarrow.ksh
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ vendor/illumos/dist/cmd/dtrace/test/tst/common/arithmetic/tst.nonarrow.ksh	Tue Jun  3 01:55:27 2014	(r266994)
@@ -0,0 +1,48 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2012, Joyent, Inc. All rights reserved.
+#
+
+#
+# Somewhat surprisingly, DTrace very much relies on the fact that when 32-bit
+# is forced, pointers are not, in fact, narrowed to 32-bits.  In particular, if
+# this is not so (that is, if pointers are narrowed to their seemingly correct
+# 32-bit width), helpers attached to 32-bit programs will fail to operate:
+# they will erroneously zero the high 32-bits of the return values of 64-bit
+# kernel pointers as returned by copyin(), alloca(), etc.  This test asserts
+# this implicit behavior -- and this comment regrettably serves as this
+# behavior's only documentation.
+#
+doit()
+{
+	/usr/sbin/dtrace $1 -n BEGIN'{trace(sizeof (long))}' \
+	    -n 'BEGIN{*(int *)alloca(4) = 21506; exit(0)}' \
+	    -n 'ERROR{exit(1)}'
+
+	if [ "$?" -ne 0 ]; then
+		exit $?
+	fi
+}
+
+doit
+doit -32

Modified: vendor/illumos/dist/lib/libdtrace/common/dt_cg.c
==============================================================================
--- vendor/illumos/dist/lib/libdtrace/common/dt_cg.c	Tue Jun  3 01:52:05 2014	(r266993)
+++ vendor/illumos/dist/lib/libdtrace/common/dt_cg.c	Tue Jun  3 01:55:27 2014	(r266994)
@@ -476,7 +476,7 @@ dt_cg_typecast(const dt_node_t *src, con
 	if (!dt_node_is_scalar(dst))
 		return; /* not a scalar */
 	if (dstsize == srcsize &&
-	    ((src->dn_flags ^ dst->dn_flags) & DT_NF_SIGNED) != 0)
+	    ((src->dn_flags ^ dst->dn_flags) & DT_NF_SIGNED) == 0)
 		return; /* not narrowing or changing signed-ness */
 	if (dstsize > srcsize && (src->dn_flags & DT_NF_SIGNED) == 0)
 		return; /* nothing to do in this case */



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