[DTrace-devel] [PATCH 01/14] Have dt_cg_load_scalar report runtime error if it fails
eugene.loh at oracle.com
eugene.loh at oracle.com
Tue May 2 03:47:09 UTC 2023
From: Eugene Loh <eugene.loh at oracle.com>
Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
libdtrace/dt_cg.c | 17 +++++++++++++++--
test/unittest/codegen/err.deref_0.d | 23 +++++++++++++++++++++++
test/unittest/codegen/err.deref_0.r | 3 +++
test/unittest/codegen/err.deref_0.r.p | 6 ++++++
test/unittest/codegen/err.deref_1.d | 23 +++++++++++++++++++++++
test/unittest/codegen/err.deref_1.r | 3 +++
test/unittest/codegen/err.deref_1.r.p | 6 ++++++
test/unittest/codegen/err.deref_i0.d | 24 ++++++++++++++++++++++++
test/unittest/codegen/err.deref_i0.r | 3 +++
test/unittest/codegen/err.deref_i0.r.p | 6 ++++++
test/unittest/codegen/err.deref_i1.d | 24 ++++++++++++++++++++++++
test/unittest/codegen/err.deref_i1.r | 3 +++
test/unittest/codegen/err.deref_i1.r.p | 6 ++++++
13 files changed, 145 insertions(+), 2 deletions(-)
create mode 100644 test/unittest/codegen/err.deref_0.d
create mode 100644 test/unittest/codegen/err.deref_0.r
create mode 100755 test/unittest/codegen/err.deref_0.r.p
create mode 100644 test/unittest/codegen/err.deref_1.d
create mode 100644 test/unittest/codegen/err.deref_1.r
create mode 100755 test/unittest/codegen/err.deref_1.r.p
create mode 100644 test/unittest/codegen/err.deref_i0.d
create mode 100644 test/unittest/codegen/err.deref_i0.r
create mode 100755 test/unittest/codegen/err.deref_i0.r.p
create mode 100644 test/unittest/codegen/err.deref_i1.d
create mode 100644 test/unittest/codegen/err.deref_i1.r
create mode 100755 test/unittest/codegen/err.deref_i1.r.p
diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 14ae21f7..483603ef 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -2468,10 +2468,16 @@ dt_cg_promote(const dt_node_t *dnp, ssize_t size, dt_irlist_t *dlp,
}
}
+/*
+ * Dereference a pointer to a scalar that is in potentially unsafe memory.
+ */
static void
dt_cg_load_scalar(dt_node_t *dnp, uint_t op, ssize_t size, dt_irlist_t *dlp,
dt_regset_t *drp)
{
+ uint_t Lokay = dt_irlist_label(dlp);
+
+ /* copy the potentially unsafe memory into the D stack */
if (dt_regset_xalloc_args(drp) == -1)
longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
emit(dlp, BPF_MOV_REG(BPF_REG_3, dnp->dn_reg));
@@ -2479,11 +2485,18 @@ dt_cg_load_scalar(dt_node_t *dnp, uint_t op, ssize_t size, dt_irlist_t *dlp,
emit(dlp, BPF_MOV_IMM(BPF_REG_2, size));
dt_regset_xalloc(drp, BPF_REG_0);
emit(dlp, BPF_CALL_HELPER(BPF_FUNC_probe_read));
- dt_regset_free(drp, BPF_REG_0);
dt_regset_free_args(drp);
+
+ /* check if we were successful */
+ emit(dlp, BPF_BRANCH_IMM(BPF_JEQ, BPF_REG_0, 0, Lokay));
+ dt_regset_free(drp, BPF_REG_0);
+ dt_cg_probe_error(yypcb, DTRACEFLT_BADADDR, DT_ISREG, dnp->dn_reg);
+ emitl(dlp, Lokay,
+ BPF_NOP());
+
+ /* load the copy of the data in "safe" memory (D stack) */
emit(dlp, BPF_LOAD(BPF_DW, dnp->dn_reg, BPF_REG_FP, DT_STK_SP));
emit(dlp, BPF_LOAD(op, dnp->dn_reg, dnp->dn_reg, 0));
-
dt_cg_promote(dnp, size, dlp, drp);
}
diff --git a/test/unittest/codegen/err.deref_0.d b/test/unittest/codegen/err.deref_0.d
new file mode 100644
index 00000000..0149513b
--- /dev/null
+++ b/test/unittest/codegen/err.deref_0.d
@@ -0,0 +1,23 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2023, 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.
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+ trace(*((char*)0));
+}
+
+BEGIN
+{
+ exit(0);
+}
+
+ERROR
+{
+ exit(1);
+}
diff --git a/test/unittest/codegen/err.deref_0.r b/test/unittest/codegen/err.deref_0.r
new file mode 100644
index 00000000..07c1dc52
--- /dev/null
+++ b/test/unittest/codegen/err.deref_0.r
@@ -0,0 +1,3 @@
+
+-- @@stderr --
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (0) in action #1 at BPF pc NNN
diff --git a/test/unittest/codegen/err.deref_0.r.p b/test/unittest/codegen/err.deref_0.r.p
new file mode 100755
index 00000000..68ebc99b
--- /dev/null
+++ b/test/unittest/codegen/err.deref_0.r.p
@@ -0,0 +1,6 @@
+#!/usr/bin/sed -f
+
+# runtest.sh looks for "0x" to filter out pointer values.
+# Strip the 0x so that the illegal address will not be filtered out;
+# we want the address to be checked.
+s/0x//
diff --git a/test/unittest/codegen/err.deref_1.d b/test/unittest/codegen/err.deref_1.d
new file mode 100644
index 00000000..f0d9719b
--- /dev/null
+++ b/test/unittest/codegen/err.deref_1.d
@@ -0,0 +1,23 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2023, 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.
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+ trace(*((char*)1));
+}
+
+BEGIN
+{
+ exit(0);
+}
+
+ERROR
+{
+ exit(1);
+}
diff --git a/test/unittest/codegen/err.deref_1.r b/test/unittest/codegen/err.deref_1.r
new file mode 100644
index 00000000..a2ca8ac4
--- /dev/null
+++ b/test/unittest/codegen/err.deref_1.r
@@ -0,0 +1,3 @@
+
+-- @@stderr --
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (1) in action #1 at BPF pc NNN
diff --git a/test/unittest/codegen/err.deref_1.r.p b/test/unittest/codegen/err.deref_1.r.p
new file mode 100755
index 00000000..68ebc99b
--- /dev/null
+++ b/test/unittest/codegen/err.deref_1.r.p
@@ -0,0 +1,6 @@
+#!/usr/bin/sed -f
+
+# runtest.sh looks for "0x" to filter out pointer values.
+# Strip the 0x so that the illegal address will not be filtered out;
+# we want the address to be checked.
+s/0x//
diff --git a/test/unittest/codegen/err.deref_i0.d b/test/unittest/codegen/err.deref_i0.d
new file mode 100644
index 00000000..228c412c
--- /dev/null
+++ b/test/unittest/codegen/err.deref_i0.d
@@ -0,0 +1,24 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2023, 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.
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+ i = 0;
+ trace(*((char*)i));
+}
+
+BEGIN
+{
+ exit(0);
+}
+
+ERROR
+{
+ exit(1);
+}
diff --git a/test/unittest/codegen/err.deref_i0.r b/test/unittest/codegen/err.deref_i0.r
new file mode 100644
index 00000000..07c1dc52
--- /dev/null
+++ b/test/unittest/codegen/err.deref_i0.r
@@ -0,0 +1,3 @@
+
+-- @@stderr --
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (0) in action #1 at BPF pc NNN
diff --git a/test/unittest/codegen/err.deref_i0.r.p b/test/unittest/codegen/err.deref_i0.r.p
new file mode 100755
index 00000000..68ebc99b
--- /dev/null
+++ b/test/unittest/codegen/err.deref_i0.r.p
@@ -0,0 +1,6 @@
+#!/usr/bin/sed -f
+
+# runtest.sh looks for "0x" to filter out pointer values.
+# Strip the 0x so that the illegal address will not be filtered out;
+# we want the address to be checked.
+s/0x//
diff --git a/test/unittest/codegen/err.deref_i1.d b/test/unittest/codegen/err.deref_i1.d
new file mode 100644
index 00000000..b47ba198
--- /dev/null
+++ b/test/unittest/codegen/err.deref_i1.d
@@ -0,0 +1,24 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2023, 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.
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+ i = 1;
+ trace(*((char*)i));
+}
+
+BEGIN
+{
+ exit(0);
+}
+
+ERROR
+{
+ exit(1);
+}
diff --git a/test/unittest/codegen/err.deref_i1.r b/test/unittest/codegen/err.deref_i1.r
new file mode 100644
index 00000000..a2ca8ac4
--- /dev/null
+++ b/test/unittest/codegen/err.deref_i1.r
@@ -0,0 +1,3 @@
+
+-- @@stderr --
+dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (1) in action #1 at BPF pc NNN
diff --git a/test/unittest/codegen/err.deref_i1.r.p b/test/unittest/codegen/err.deref_i1.r.p
new file mode 100755
index 00000000..68ebc99b
--- /dev/null
+++ b/test/unittest/codegen/err.deref_i1.r.p
@@ -0,0 +1,6 @@
+#!/usr/bin/sed -f
+
+# runtest.sh looks for "0x" to filter out pointer values.
+# Strip the 0x so that the illegal address will not be filtered out;
+# we want the address to be checked.
+s/0x//
--
2.18.4
More information about the DTrace-devel
mailing list