Skip to content

Commit

Permalink
Have dt_cg_load_scalar report runtime error if it fails
Browse files Browse the repository at this point in the history
Signed-off-by: Eugene Loh <eugene.loh@oracle.com>
Reviewed-by: Nick Alcock <nick.alcock@oracle.com>
Reviewed-by: Kris Van Hees <kris.van.hees@oracle.com>
  • Loading branch information
euloh authored and kvanhees committed May 25, 2023
1 parent 531e492 commit 7877da7
Show file tree
Hide file tree
Showing 13 changed files with 145 additions and 2 deletions.
17 changes: 15 additions & 2 deletions libdtrace/dt_cg.c
Original file line number Diff line number Diff line change
Expand Up @@ -2585,22 +2585,35 @@ dt_cg_promote(const dt_node_t *dnp, ssize_t size, dt_irlist_t *dlp,
}
}

/*
* Load a scalar from an arbitrary address.
*/
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 scalar onto the 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));
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_1, BPF_REG_FP, DT_STK_SP));
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);

/* Report a fault if the copy failed. */
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 scalar from the 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);
}

Expand Down
23 changes: 23 additions & 0 deletions test/unittest/codegen/err.deref_0.d
Original file line number Diff line number Diff line change
@@ -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);
}
3 changes: 3 additions & 0 deletions test/unittest/codegen/err.deref_0.r
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions test/unittest/codegen/err.deref_0.r.p
Original file line number Diff line number Diff line change
@@ -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//
23 changes: 23 additions & 0 deletions test/unittest/codegen/err.deref_1.d
Original file line number Diff line number Diff line change
@@ -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);
}
3 changes: 3 additions & 0 deletions test/unittest/codegen/err.deref_1.r
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions test/unittest/codegen/err.deref_1.r.p
Original file line number Diff line number Diff line change
@@ -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//
24 changes: 24 additions & 0 deletions test/unittest/codegen/err.deref_i0.d
Original file line number Diff line number Diff line change
@@ -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);
}
3 changes: 3 additions & 0 deletions test/unittest/codegen/err.deref_i0.r
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions test/unittest/codegen/err.deref_i0.r.p
Original file line number Diff line number Diff line change
@@ -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//
24 changes: 24 additions & 0 deletions test/unittest/codegen/err.deref_i1.d
Original file line number Diff line number Diff line change
@@ -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);
}
3 changes: 3 additions & 0 deletions test/unittest/codegen/err.deref_i1.r
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions test/unittest/codegen/err.deref_i1.r.p
Original file line number Diff line number Diff line change
@@ -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//

0 comments on commit 7877da7

Please sign in to comment.