[DTrace-devel] [PATCH] Cast should not change writable

eugene.loh at oracle.com eugene.loh at oracle.com
Tue Oct 22 20:47:27 UTC 2024


From: Eugene Loh <eugene.loh at oracle.com>

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 libdtrace/dt_parser.c                  |  4 ++++
 test/unittest/types/tst.castwritable.d | 22 ++++++++++++++++++++++
 test/unittest/types/tst.castwritable.r |  1 +
 3 files changed, 27 insertions(+)
 create mode 100644 test/unittest/types/tst.castwritable.d
 create mode 100644 test/unittest/types/tst.castwritable.r

diff --git a/libdtrace/dt_parser.c b/libdtrace/dt_parser.c
index 59293ebce..325ba881e 100644
--- a/libdtrace/dt_parser.c
+++ b/libdtrace/dt_parser.c
@@ -4209,6 +4209,10 @@ asgn_common:
 			dt_cook_taint_alloca(lp, NULL, rp);
 
 		dt_node_type_propagate(lp, dnp); /* see K&R[A7.5] */
+
+		if (rp->dn_flags & DT_NF_WRITABLE)
+			dnp->dn_flags |= DT_NF_WRITABLE;
+
 		dt_node_attr_assign(dnp, dt_attr_min(lp->dn_attr, rp->dn_attr));
 		break;
 	}
diff --git a/test/unittest/types/tst.castwritable.d b/test/unittest/types/tst.castwritable.d
new file mode 100644
index 000000000..1b419228c
--- /dev/null
+++ b/test/unittest/types/tst.castwritable.d
@@ -0,0 +1,22 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION:  casting keeps a variable writable.
+ *
+ * SECTION: Types, Operators, and Expressions/Constants
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+	x = (char *) alloca(8);
+	*((long long*)x) = 0x0067666564636261;
+	trace(stringof(x));
+	exit(0);
+}
diff --git a/test/unittest/types/tst.castwritable.r b/test/unittest/types/tst.castwritable.r
new file mode 100644
index 000000000..b5b9ef6c6
--- /dev/null
+++ b/test/unittest/types/tst.castwritable.r
@@ -0,0 +1 @@
+abcdefg
-- 
2.43.5




More information about the DTrace-devel mailing list