Deprecate enabled probe ID (epid)
PATCH v6 3/19 Deprecate enabled probe ID (epid)
From: Eugene Loh <[email protected]>
Historically, the enabled probe id (epid) was an integer, passed from producer to consumer, that uniquely identified probe ID and statement (data description). It was used in error reporting and was available to D users via a built-in variable "epid".
However, its value was opaque to users and difficult to use.
Deprecate the use of EPID:
*) Have the producer pass to the consumer the probe ID and statement
ID explicitly, instead of passing an opaque integer that requires additional lookup tables.
*) Keep an array dt_stmts[] of statements, from which we can retrieve
probe descriptions and data descriptions.
*) Remove data structures related to epid: dt_ddesc[], dt_pdesc[],
dt_nextepid, dt_maxprobe, etc.
Nevertheless, continue to provide a value for the built-in "epid" variable for back compatability. Expand the epid from 4 bytes to 8 bytes: the upper half is the probe ID and the lower half the statement ID.
The output buffer (written by the producer, read by the consumer) is rearranged slightly. Note that:
*) It starts with a 4-byte size, which perf_event writes.
*) The beginning of the output buffer should have 8-byte alignment.
*) The beginning of the trace data within the output buffer should
also have 8-byte alignment.
*) So we rearrange as follows:
old new
0: pad / size pad / size <==
4: pad specid
8: epid <== prid
12: specid stid
16: data[n] data[n]
The arrow <== indicates where the buffer starts.
For error reporting:
*) Report errors in terms of the probe ID (and description) and the
clause function name, which is decipherable in terms of the disassembly output. Specifically, change ERROR-probe arguments:
-) arg1 changes from epid to the probe ID
-) arg2 changes from "clause index" (which is no longer needed)
to the statement ID that identifies the clause named in disassembly output
*) No longer report the "action number", which has lost much of its
meaning in the port to eBPF. Nonetheless, keep dteda_action; its value is not used, but set the value to stid for possible future use.
--- bpf/get_bvar.c | 5 +- bpf/probe_error.c | 8 +- include/dtrace/metadesc.h | 4 +- include/dtrace/universal.h | 3 +- libdtrace/dt_bpf.c | 2 - libdtrace/dt_bpf.h | 46 +++++---- libdtrace/dt_cc.c | 47 +++------- libdtrace/dt_cg.c | 49 +++++----- libdtrace/dt_consume.c | 85 +++++++++-------- libdtrace/dt_dctx.h | 21 +++-- libdtrace/dt_dlibs.c | 2 - libdtrace/dt_error.c | 2 +- libdtrace/dt_handle.c | 41 ++++---- libdtrace/dt_impl.h | 15 +-- libdtrace/dt_map.c | 94 ++----------------- libdtrace/dt_open.c | 5 +- libdtrace/dt_program.c | 9 +- libdtrace/dtrace.h | 3 +- test/demo/builtin/eipd.d | 4 - test/demo/dtrace/error.r | 2 +- test/demo/spec/specopen.d | 5 +- test/stress/buffering/tst.resize3-manual.d | 2 +- test/stress/buffering/tst.resize3-manual.r | 2 +- test/stress/buffering/tst.resize3.d | 2 +- test/stress/buffering/tst.resize3.r | 2 +- test/unittest/actions/setopt/tst.badopt.r | 14 +-- .../arrays/tst.declared-bounds.runtime_out.r | 2 +- test/unittest/codegen/err.deref_0.r | 2 +- test/unittest/codegen/err.deref_1.r | 2 +- test/unittest/codegen/err.deref_i0.r | 2 +- test/unittest/codegen/err.deref_i1.r | 2 +- .../unittest/codegen/err.deref_string-assoc.r | 2 +- test/unittest/codegen/err.deref_string-gvar.r | 2 +- test/unittest/codegen/err.deref_string-lvar.r | 2 +- test/unittest/codegen/err.deref_string-tvar.r | 2 +- .../codegen/err.str_NULL_plus_offset-assoc.r | 2 +- .../codegen/err.str_NULL_plus_offset-lvar.r | 2 +- .../codegen/err.str_NULL_plus_offset-tvar.r | 2 +- .../codegen/err.str_NULL_plus_offset.r | 2 +- test/unittest/disasm/tst.vartab-bvar.r | 2 +- test/unittest/drops/drp.DTRACEDROP_DBLERROR.r | 2 +- .../tst.DTRACEFLT_BADADDR.null_ptr_field.d | 6 +- .../tst.DTRACEFLT_BADADDR.null_ptr_field.r | 2 +- test/unittest/error/tst.DTRACEFLT_BADADDR.r | 4 +- test/unittest/error/tst.DTRACEFLT_BADADDR2.r | 4 +- .../error/tst.DTRACEFLT_DIVZERO.div.d | 11 ++- .../error/tst.DTRACEFLT_DIVZERO.div.r | 2 +- .../error/tst.DTRACEFLT_DIVZERO.mod.d | 11 ++- .../error/tst.DTRACEFLT_DIVZERO.mod.r | 2 +- test/unittest/error/tst.DTRACEFLT_UNKNOWN.r | 4 +- .../error/tst.clause_scope-begin-ended.r | 2 +- test/unittest/error/tst.clause_scope-begin.r | 2 +- .../unittest/error/tst.clause_scope-regular.r | 2 +- .../error/tst.clause_scope-regular.r.p | 8 +- test/unittest/error/tst.error.r | 2 +- test/unittest/error/tst.errorend.r | 2 +- .../alloca/err.alloca-bcopy-before-beyond.r | 2 +- .../alloca/err.alloca-bcopy-before-bottom.r | 2 +- .../alloca/err.alloca-bcopy-beyond-top.r | 2 +- .../alloca/err.alloca-bcopy-crossing-bottom.r | 2 +- .../alloca/err.alloca-bcopy-crossing-top.r | 2 +- .../alloca/err.alloca-crossing-clauses.r | 2 +- .../alloca/err.alloca-load-before-bottom.r | 2 +- .../funcs/alloca/err.alloca-load-beyond-top.r | 2 +- .../alloca/err.alloca-load-crossing-bottom.r | 2 +- .../alloca/err.alloca-null-deref-lvalue.r | 2 +- .../funcs/alloca/err.alloca-null-deref.r | 2 +- .../err.alloca-scratch-exceeding-bcopy.r | 2 +- .../alloca/err.alloca-store-before-bottom.r | 2 +- .../alloca/err.alloca-store-beyond-top.r | 2 +- .../alloca/err.alloca-store-crossing-bottom.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy1.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy4.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy5.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy6.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy7.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy8.r | 2 +- test/unittest/funcs/copyin/err.badaddr.r | 2 +- test/unittest/funcs/copyin/err.null_arg1.r | 2 +- test/unittest/funcs/copyinstr/err.badaddr.r | 2 +- test/unittest/funcs/copyinstr/err.null_arg1.r | 2 +- test/unittest/funcs/copyinto/err.badaddr.r | 2 +- test/unittest/funcs/copyinto/err.badsize.r | 2 +- test/unittest/funcs/copyinto/err.null_arg1.r | 2 +- test/unittest/funcs/err.badalloca.r | 2 +- test/unittest/funcs/err.badalloca.r.p | 8 +- test/unittest/funcs/err.link_ntopbadaddr.r | 2 +- test/unittest/funcs/err.link_ntopbadarg.r | 2 +- .../inet_ntoa6/err.inet_ntoa6.arg1_null.r | 2 +- .../err.inet_ntoa6.arg1_null_const.r | 2 +- test/unittest/funcs/strlen/tst.null.r | 2 +- test/unittest/funcs/strtok/tst.strtok_null.r | 2 +- .../funcs/strtok/tst.strtok_nulldel.r | 2 +- .../funcs/strtok/tst.strtok_nullstr.r | 2 +- .../funcs/strtok/tst.strtok_nullstr2.r | 2 +- .../funcs/substr/err.substr_null_arg1.r | 2 +- test/unittest/pointers/err.AllocaOverrun.r | 2 +- test/unittest/pointers/err.BadAlign.r | 2 +- test/unittest/pointers/err.InvalidAddress2.r | 2 +- test/unittest/pointers/err.InvalidAddress4.r | 2 +- .../speculation/err.CommitWithInvalid.r | 2 +- .../speculation/err.DiscardWithInvalid.r | 2 +- .../speculation/tst.SpecSizeVariations.r | 22 ----- .../speculation/tst.SpecSizeVariations.sh | 2 +- test/unittest/speculation/tst.negcommit.r | 2 +- .../variables/bvar/tst.arg3-ERROR-b.sh | 2 +- .../unittest/variables/bvar/tst.arg3-ERROR.sh | 2 +- 107 files changed, 292 insertions(+), 404 deletions(-) delete mode 100644 test/demo/builtin/eipd.d
bpf/get_bvar.c +3 -2
@@ -48,8 +48,9 @@ noinline uint64_t dt_get_bvar(const dt_dctx_t *dctx, uint32_t id, uint32_t idx) mst->tstamp =bpf_ktime_get_ns ();return mst->tstamp; -case DIF_VAR_EPID : -return mst->epid; +case DIF_VAR_EPID : { +return (((uint64_t )mst->prid) <<32 ) | mst->stid; + }case DIF_VAR_ID :return mst->prid;case DIF_VAR_ARG0 :case DIF_VAR_ARG1 :case DIF_VAR_ARG2 :
bpf/probe_error.c +4 -4
@@ -16,8 +16,8 @@ extern int64_t dt_error(const dt_dctx_t *dctx);/* * DTrace ERROR probes provide 6 arguments: * arg0 = always NULL (used to be kernel consumer state pointer) -* arg1 = EPID of probe that triggered the fault -* arg2 = clause index of code that triggered the fault +* arg1 = probe ID that triggered the fault +* arg2 = statement ID that triggered the fault * arg3 = BPF offset in the clause that triggered the fault (or -1) * arg4 = fault type * arg5 = fault-specific value (usually address being accessed or 0)
@@ -30,8 +30,8 @@ noinline void dt_probe_error(const dt_dctx_t *dctx, uint64_t pc, uint64_t fault,__builtin_memcpy (mst->saved_argv, mst->argv,sizeof (mst->saved_argv)); mst->argv[0 ] =0 ; - mst->argv[1 ] = mst->epid; - mst->argv[2 ] = mst->clid; + mst->argv[1 ] = mst->prid; + mst->argv[2 ] = mst->stid; mst->argv[3 ] = pc; mst->argv[4 ] = fault; mst->argv[5 ] = illval;
include/dtrace/metadesc.h +2 -2
@@ -19,8 +19,8 @@/* * DTrace separates the trace data stream from the metadata stream. The only -* metadata tokens placed in the data stream are enabled probe identifiers -* (EPIDs) or (in the case of aggregations) aggregation identifiers. In order +* metadata tokens placed in the data stream are probe and statement identifiers +* or (in the case of aggregations) aggregation identifiers. In order * to determine the structure of the data, DTrace uses the token to perform a * lookup to retrieve the corresponding description of the enabled probe (via * the dtrace_datadesc structure) or the aggregation (via the dtrace_aggdesc
include/dtrace/universal.h +1 -2
@@ -17,7 +17,6 @@#define DTRACE_CPUALL -1/* all CPUs */ #define DTRACE_IDNONE 0/* invalid probe identifier */ -#define DTRACE_EPIDNONE 0/* invalid enabled probe identifier */ #define DTRACE_AGGIDNONE 0/* invalid aggregation identifier */ #define DTRACE_AGGVARIDNONE 0/* invalid aggregation variable ID */ #define DTRACE_CACHEIDNONE 0/* invalid predicate cache */
@@ -37,7 +36,7 @@ typedef uint16_t dtrace_actkind_t; /* action kind */typedef uint32_t dtrace_aggid_t ;/* aggregation identifier */ typedef uint32_t dtrace_cacheid_t ;/* predicate cache identifier */ -typedef uint32_t dtrace_epid_t ;/* enabled probe identifier */ +typedef uint32_t dtrace_stid_t ;/* statement identifier */ typedef uint32_t dtrace_optid_t ;/* option identifier */ typedef uint32_t dtrace_specid_t ;/* speculation identifier */
libdtrace/dt_bpf.c +0 -2
@@ -774,7 +774,6 @@ gmap_create_cpuinfo(dtrace_hdl_t *dtp)* The size of the memory region is the sum of: * - size of the DTrace machine state, rounded up to the nearest * multiple of 8 -* - 8 bytes padding for trace buffer alignment purposes * - maximum trace buffer record size, rounded up to the nearest * multiple of 8 * - size of dctx->mem (see dt_dctx.h)
@@ -783,7 +782,6 @@ static int gmap_create_mem(dtrace_hdl_t *dtp) {size_t sz =roundup (sizeof (dt_mstate_t),8 ) + -8 +roundup (dtp->dt_maxreclen,8 ) +DMEM_SIZE (dtp);
libdtrace/dt_bpf.h +22 -24
52 lines not on this page · raw message
libdtrace/dt_cc.c +12 -35
137 lines not on this page · raw message
libdtrace/dt_cg.c +22 -27
114 lines not on this page · raw message
libdtrace/dt_consume.c +46 -39
213 lines not on this page · raw message
libdtrace/dt_dctx.h +13 -8
@@ -25,9 +25,8 @@* The DTrace machine state. */ typedef struct dt_mstate { - uint32_t epid; /* Enabled probe ID */ uint32_t prid; /* Probe ID */ - uint32_t clid; /* Clause ID (unique per probe) */ + uint32_t stid; /* Statement ID */ uint32_t tag; /* Tag (for future use) */ uint32_t scratch_top; /* Current top of scratch space */ int32_t syscall_errno; /* syscall errno */
@@ -41,9 +40,8 @@ typedef struct dt_mstate {uint64_t saved_argv[6 ];/* Saved arguments */ } dt_mstate_t; -#define DMST_EPID offsetof(dt_mstate_t, epid)#define DMST_PRID offsetof(dt_mstate_t, prid) -#define DMST_CLID offsetof(dt_mstate_t, clid) +#define DMST_STID offsetof(dt_mstate_t, stid)#define DMST_TAG offsetof(dt_mstate_t, tag)#define DMST_SCRATCH_TOP offsetof(dt_mstate_t, scratch_top)#define DMST_ERRNO offsetof(dt_mstate_t, syscall_errno)
@@ -90,16 +88,23 @@ typedef struct dt_dctx {* The dctx->buf pointer references a block of memory that contains: * * +----------------+ -* 0 -> | EPID | +* 0 -> | size | * +----------------+ -* 4 -> | Speculation ID | +* 4 -> | Speculation ID | * +----------------+ -* | Trace Data | +* 8 -> | PRID | +* +----------------+ +* 12 -> | STID | +* +----------------+ +* 16 -> | Trace Data | * | ... | * +----------------+ */ -#define DBUF_EPID 0 +#define DBUF_SIZE 0#define DBUF_SPECID 4 +#define DBUF_PRID 8 +#define DBUF_STID 12 +#define DBUF_DATA 16/* * The dctx->mem pointer references a block of memory that contains:
libdtrace/dt_dlibs.c +0 -2
@@ -73,9 +73,7 @@ static const dt_ident_t dt_bpf_symbols[] = {DT_BPF_SYMBOL (tuples,DT_IDENT_PTR ),/* BPF internal identifiers */ -DT_BPF_SYMBOL_ID (EPID ,DT_IDENT_SCALAR ,DT_CONST_EPID ),DT_BPF_SYMBOL_ID (PRID ,DT_IDENT_SCALAR ,DT_CONST_PRID ), -DT_BPF_SYMBOL_ID (CLID ,DT_IDENT_SCALAR ,DT_CONST_CLID ),DT_BPF_SYMBOL_ID (ARGC ,DT_IDENT_SCALAR ,DT_CONST_ARGC ),DT_BPF_SYMBOL_ID (STBSZ ,DT_IDENT_SCALAR ,DT_CONST_STBSZ ), DT_BPF_SYMBOL_ID(STRSZ, DT_IDENT_SCALAR, DT_CONST_STRSZ),
libdtrace/dt_error.c +1 -1
@@ -54,7 +54,7 @@ static const struct { { EDT_DOFFSET, "Data record offset exceeds buffer boundary" }, { EDT_DALIGN, "Data record has inappropriate alignment" }, { EDT_DSIZE, "Data record has incorrect size" }, - { EDT_BADEPID, "Invalid EPID" }, + { EDT_BADSTID, "Invalid statement ID" }, { EDT_BADOPTNAME, "Invalid option name" }, { EDT_BADOPTVAL, "Invalid value for specified option" }, { EDT_BADOPTCTX, "Option cannot be used from within a D program" },
libdtrace/dt_handle.c +21 -20
89 lines not on this page · raw message
libdtrace/dt_impl.h +4 -11
@@ -271,10 +271,11 @@ struct dtrace_hdl {const char *dt_errtag;/* tag used with last call to dt_set_errmsg() */ dt_pcb_t *dt_pcb;/* pointer to current parsing control block */ ulong_t dt_gen;/* compiler generation number */ -uint_t dt_clause_nextid;/* next ID to use for programs */ +uint_t dt_stmt_nextid;/* next ID to use for statements */ dt_list_t dt_programs;/* linked list of dtrace_prog_t's */ dt_list_t dt_xlators;/* linked list of dt_xlator_t's */ dt_list_t dt_enablings;/* list of (to be) enabled probes */ +dtrace_stmtdesc_t **dt_stmts;/* array of stmts */ struct dt_xlator **dt_xlatormap;/* dt_xlator_t's indexed by dx_id */ id_t dt_xlatorid;/* next dt_xlator_t id to assign */ dt_ident_t *dt_externs;/* linked list of external symbol identifiers */
@@ -341,10 +342,6 @@ struct dtrace_hdl {ctf_id_t dt_type_symaddr;/* cached CTF identifier for _symaddr type */ ctf_id_t dt_type_usymaddr;/* cached CTF ident. for _usymaddr type */ ctf_id_t dt_type_void;/* cached CTF identifier for void type */ -dtrace_epid_t dt_nextepid;/* next enabled probe ID to assign */ -size_t dt_maxprobe;/* max enabled probe ID */ -dtrace_datadesc_t **dt_ddesc;/* probe data descriptions */ -dtrace_probedesc_t **dt_pdesc;/* probe descriptions for enabled prbs */ size_t dt_maxagg;/* max aggregation ID */ dtrace_aggdesc_t **dt_adesc;/* aggregation descriptions */ struct dt_aggregate *dt_aggregate;/* aggregate */
@@ -604,7 +601,7 @@ enum {EDT_DOFFSET ,/* record data offset error */ EDT_DALIGN ,/* record data alignment error */ EDT_DSIZE ,/* record data size error */ -EDT_BADEPID ,/* invalid enabled probe id */ +EDT_BADSTID ,/* invalid statement id */ EDT_BADOPTNAME ,/* invalid dtrace_setopt option name */ EDT_BADOPTVAL ,/* invalid dtrace_setopt option value */ EDT_BADOPTCTX, /* invalid dtrace_setopt option context */
@@ -771,11 +768,7 @@ extern dtrace_datadesc_t *dt_datadesc_hold(dtrace_datadesc_t *ddp);extern void dt_datadesc_release (dtrace_hdl_t *,dtrace_datadesc_t *);extern dtrace_datadesc_t *dt_datadesc_create (dtrace_hdl_t *);extern int dt_datadesc_finalize (dtrace_hdl_t *,dtrace_datadesc_t *); -extern dtrace_epid_t dt_epid_add (dtrace_hdl_t *,dtrace_datadesc_t *, -dtrace_id_t ); -extern int dt_epid_lookup (dtrace_hdl_t *,dtrace_epid_t ,dtrace_datadesc_t **, -dtrace_probedesc_t **); -extern void dt_epid_destroy (dtrace_hdl_t *); +extern int dt_stid_lookup (dtrace_hdl_t *,dtrace_stid_t ,dtrace_datadesc_t **);typedef void (*dt_cg_gap_f )(dt_pcb_t *,int );extern uint32_t dt_rec_add (dtrace_hdl_t *,dt_cg_gap_f ,dtrace_actkind_t ,uint32_t ,uint16_t ,dt_pfargv_t *,uint64_t );
libdtrace/dt_map.c +7 -87
105 lines not on this page · raw message
libdtrace/dt_open.c +1 -4
@@ -170,7 +170,7 @@ static const dt_ident_t _dtrace_globals[] = { {"discard" ,DT_IDENT_ACTFUNC ,0 ,DT_ACT_DISCARD ,DT_ATTR_STABCMN ,DT_VERS_1_0 , &dt_idops_func, "void(int)" }, { "epid", DT_IDENT_SCALAR, 0, DIF_VAR_EPID, DT_ATTR_STABCMN, DT_VERS_1_0, - &dt_idops_type, "uint_t" }, + &dt_idops_type, "uint64_t" }, { "errno", DT_IDENT_SCALAR, 0, DIF_VAR_ERRNO, DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_type, "int" }, { "execname", DT_IDENT_SCALAR, 0, DIF_VAR_EXECNAME,
@@ -739,8 +739,6 @@ dt_vopen(int version, int flags, int *errp,dt_proc_hash_create (dtp);dt_proc_signal_init (dtp); dtp->dt_proc_fd =eventfd (0 ,EFD_CLOEXEC |EFD_NONBLOCK ); - dtp->dt_nextepid =1 ; - dtp->dt_maxprobe =0 ;if (dt_aggregate_init (dtp) ==-1 )return set_open_errno (dtp, errp,dtrace_errno (dtp)); dtp->dt_vmax =DT_VERS_LATEST ;
@@ -1303,7 +1301,6 @@ dtrace_close(dtrace_hdl_t *dtp)if (dtp->dt_poll_fd !=-1 )close (dtp->dt_poll_fd); -dt_epid_destroy (dtp);dt_aggid_destroy (dtp);dt_buffered_destroy (dtp);dt_aggregate_destroy (dtp);
libdtrace/dt_program.c +8 -1
@@ -100,7 +100,7 @@ dtrace_program_info(dtrace_hdl_t *dtp, dtrace_prog_t *pgp,/* * If there aren't any actions, account for the fact that -* recording the epid will generate a record. +* the default action will generate a record. */ dp =dt_dlib_get_func_difo (dtp, stp->ds_desc->dtsd_clause);if (dp !=NULL )
@@ -165,6 +165,13 @@ dt_prog_stmt(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, dtrace_stmtdesc_t *sdp,dtrace_probedesc_t *pdp = &sdp->dtsd_ecbdesc->dted_probe;int rc; +if (dtp->dt_stmts ==NULL ) { + dtp->dt_stmts =dt_calloc (dtp, dtp->dt_stmt_nextid,sizeof (dtrace_stmtdesc_t *)); +if (dtp->dt_stmts ==NULL ) +return dt_set_errno (dtp,EDT_NOMEM ); + } + dtp->dt_stmts[sdp->dtsd_id] = sdp; + st.cnt = cnt; st.sdp = sdp; rc =dt_probe_iter (dtp, pdp, (dt_probe_f *)dt_stmt_probe,NULL , &st);
libdtrace/dtrace.h +2 -1
@@ -150,6 +150,7 @@ typedef struct dtrace_stmtdesc {dtrace_attribute_t dtsd_descattr;/* probedesc attributes */ dtrace_attribute_t dtsd_stmtattr;/* statement attributes */ int dtsd_clauseflags;/* clause flags */ +int dtsd_id;/* index in dtp->dt_stmts */ } dtrace_stmtdesc_t;/* dtsd clause flags */
@@ -189,7 +190,7 @@ typedef enum { typedef struct dtrace_probedata { dtrace_hdl_t *dtpda_handle; /* handle to DTrace library */ - dtrace_epid_t dtpda_epid; /* enabled probe ID */ + dtrace_stid_t dtpda_stid; /* statement ID */ dtrace_datadesc_t *dtpda_ddesc; /* probe data description */ dtrace_probedesc_t *dtpda_pdesc; /* probe description */ unsigned int dtpda_cpu; /* CPU for data */
test/demo/builtin/eipd.d deleted +0 -4
@@ -1,4 +0,0 @@ -BEGIN { - trace(epid); - exit(0); -}
test/demo/dtrace/error.r +1 -1
@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/demo/dtrace/error.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/demo/spec/specopen.d +2 -3
@@ -2,7 +2,7 @@ /* * Oracle Linux DTrace. - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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. */
@@ -33,8 +33,7 @@ fbt::: /self->spec/ { /* - * A speculate() with no other actions speculates the default action: - * tracing the EPID. + * A speculate() with no other actions speculates the default action. */ speculate(self->spec); }
test/stress/buffering/tst.resize3-manual.d +1 -1
@@ -31,7 +31,7 @@ BEGIN BEGIN { speculate(spec); - trace(epid); + trace(12345678); } BEGIN
test/stress/buffering/tst.resize3-manual.r +1 -1
@@ -1,5 +1,5 @@ FUNCTION:NAME - :BEGIN 3 + :BEGIN 12345678 :BEGIN -- @@stderr --
test/stress/buffering/tst.resize3.d +1 -1
@@ -27,7 +27,7 @@ BEGIN BEGIN { speculate(spec); - trace(epid); + trace(12345678); } BEGIN
test/stress/buffering/tst.resize3.r +1 -1
@@ -1,5 +1,5 @@ FUNCTION:NAME - :BEGIN 3 + :BEGIN 12345678 :BEGIN -- @@stderr --
test/unittest/actions/setopt/tst.badopt.r +7 -7
@@ -1,16 +1,16 @@ -- @@stderr -- -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "Nixon" to "1": Invalid option name +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "Nixon" to "1": Invalid option name -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "Harding" to "1": Invalid option name +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "Harding" to "1": Invalid option name -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "Hoover" to "1": Invalid option name +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "Hoover" to "1": Invalid option name -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "Bush" to "1": Invalid option name +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "Bush" to "1": Invalid option name -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "quiet" to "um, no": Invalid value for specified option +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "quiet" to "um, no": Invalid value for specified option -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "aggrate" to "0.5hz": Invalid value for specified option +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "aggrate" to "0.5hz": Invalid value for specified option -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "bufsize" to "1m": Operation illegal when tracing is active +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "bufsize" to "1m": Operation illegal when tracing is active
test/unittest/arrays/tst.declared-bounds.runtime_out.r +1 -1
@@ -1,3 +1,3 @@ expected run-time error -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): index out of bounds (8) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): index out of bounds (8) at BPF pc NNN
test/unittest/codegen/err.deref_0.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (0) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address (0) at BPF pc NNN
test/unittest/codegen/err.deref_1.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (1) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNN
test/unittest/codegen/err.deref_i0.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (0) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address (0) at BPF pc NNN
test/unittest/codegen/err.deref_i1.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (1) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNN
test/unittest/codegen/err.deref_string-assoc.r +1 -1
@@ -1,3 +1,3 @@ 66 -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address (1) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNN
test/unittest/codegen/err.deref_string-gvar.r +1 -1
@@ -1,3 +1,3 @@ 66 -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address (1) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNN
test/unittest/codegen/err.deref_string-lvar.r +1 -1
@@ -1,3 +1,3 @@ 66 -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address (1) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNN
test/unittest/codegen/err.deref_string-tvar.r +1 -1
@@ -1,3 +1,3 @@ 66 -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address (1) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNN
test/unittest/codegen/err.str_NULL_plus_offset-assoc.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/codegen/err.str_NULL_plus_offset-lvar.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/codegen/err.str_NULL_plus_offset-tvar.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/codegen/err.str_NULL_plus_offset.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/disasm/tst.vartab-bvar.r +1 -1
@@ -4,7 +4,7 @@ curthread scl glb r D type (pointer) (size 8) timestamp scl glb r D type (integer) (size 8) vtimestamp scl glb r D type (integer) (size 8) ipl scl glb r D type (integer) (size 4) -epid scl glb r D type (integer) (size 4) +epid scl glb r D type (integer) (size 8) id scl glb r D type (integer) (size 4) arg0 scl glb r D type (integer) (size 8) arg1 scl glb r D type (integer) (size 8)
test/unittest/drops/drp.DTRACEDROP_DBLERROR.r +1 -1
@@ -4,4 +4,4 @@ -- @@stderr -- dtrace: script 'test/unittest/drops/drp.DTRACEDROP_DBLERROR.d' matched 3 probes dtrace: [DTRACEDROP_DBLERROR] 1 error in ERROR probe enabling -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.d +3 -3
@@ -1,6 +1,6 @@ /* * Oracle Linux DTrace. - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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. */
@@ -15,13 +15,13 @@ BEGIN { - myepid = epid; + myid = id; trace(((struct task_struct *)NULL)->pid); exit(1); } ERROR { - exit(arg1 != myepid || arg2 != 1 || arg4 != DTRACEFLT_BADADDR || + exit(arg1 != myid || arg2 != 0 || arg4 != DTRACEFLT_BADADDR || arg5 != 0); }
test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/error/tst.DTRACEFLT_BADADDR.r +2 -2
@@ -1,6 +1,6 @@ -The arguments are 3 1 1 0 +The arguments are 1 1 1 0 The value of arg4 should be 1 The value of arg5 should be 0 -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/error/tst.DTRACEFLT_BADADDR2.r +2 -2
@@ -1,6 +1,6 @@ -The arguments are 3 1 1 16384 +The arguments are 1 1 1 16384 The value of arg4 should be 1 The value of arg5 should be 16384 -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/error/tst.DTRACEFLT_DIVZERO.div.d +8 -3
@@ -1,6 +1,6 @@ /* * Oracle Linux DTrace. - * Copyright (c) 2006, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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. */
@@ -13,9 +13,14 @@ #pragma D option quiet +BEGIN { myid = id } /* clause 0 */ +BEGIN { myid = id } /* clause 1 */ +BEGIN { myid = id } /* clause 2 */ +BEGIN { myid = id } /* clause 3 */ + BEGIN { - myepid = epid; + myid = id; i = 1; j = 2; j = i / (j - 2);
@@ -24,6 +29,6 @@ BEGIN ERROR { - exit(arg1 != myepid || arg2 != 1 || arg4 != DTRACEFLT_DIVZERO || + exit(arg1 != myid || arg2 != 4 || arg4 != DTRACEFLT_DIVZERO || arg5 != 0); }
test/unittest/error/tst.DTRACEFLT_DIVZERO.div.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): divide-by-zero in action #1 at BPF pc NNN +dtrace: error in dt_clause_4 for probe ID 1 (dtrace:::BEGIN): divide-by-zero at BPF pc NNN
test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.d +8 -3
@@ -1,6 +1,6 @@ /* * Oracle Linux DTrace. - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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. */
@@ -13,9 +13,14 @@ #pragma D option quiet +BEGIN { myid = id; } /* clause 0 */ +BEGIN { myid = id; } /* clause 1 */ +BEGIN { myid = id; } /* clause 2 */ +BEGIN { myid = id; } /* clause 3 */ + BEGIN { - myepid = epid; + myid = id; i = 1; j = 2; j = i % (j - 2);
@@ -24,6 +29,6 @@ BEGIN ERROR { - exit(arg1 != myepid || arg2 != 1 || arg4 != DTRACEFLT_DIVZERO || + exit(arg1 != myid || arg2 != 4 || arg4 != DTRACEFLT_DIVZERO || arg5 != 0); }
test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): divide-by-zero in action #1 at BPF pc NNN +dtrace: error in dt_clause_4 for probe ID 1 (dtrace:::BEGIN): divide-by-zero at BPF pc NNN
test/unittest/error/tst.DTRACEFLT_UNKNOWN.r +2 -2
@@ -1,5 +1,5 @@ -The arguments are 3 1 PC 1 64 +The arguments are 1 1 PC 1 64 The value of arg4 = 0 -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/error/tst.clause_scope-begin-ended.r +1 -1
@@ -2,4 +2,4 @@ Error fired Clause executed -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/error/tst.clause_scope-begin.r +1 -1
@@ -2,4 +2,4 @@ Error fired Clause executed -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/error/tst.clause_scope-regular.r +1 -1
@@ -2,4 +2,4 @@ Error fired Clause executed -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID nnn: profile:::tick-10ms): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID nnn (profile:::tick-10ms): invalid address ({ptr}) at BPF pc NNN
test/unittest/error/tst.clause_scope-regular.r.p +6 -2
@@ -1,3 +1,7 @@ -#!/bin/sed -f +#!/usr/bin/awk -f + # This report has a variable probe ID in it. -s/ID [0-9][0-9]*: profile/ID nnn: profile/ +{ + sub("for probe ID [0-9][0-9]* .profile", "for probe ID nnn (profile"); + print; +}
test/unittest/error/tst.error.r +1 -1
@@ -1,4 +1,4 @@ Error fired -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/error/tst.errorend.r +1 -1
@@ -2,4 +2,4 @@ Error fired End fired after exit -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_2 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/alloca/err.alloca-bcopy-before-beyond.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/alloca/err.alloca-bcopy-before-bottom.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/alloca/err.alloca-bcopy-beyond-top.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/alloca/err.alloca-bcopy-crossing-bottom.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/alloca/err.alloca-bcopy-crossing-top.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNN
test/unittest/funcs/alloca/err.alloca-crossing-clauses.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/alloca/err.alloca-load-before-bottom.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/alloca/err.alloca-load-beyond-top.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/alloca/err.alloca-load-crossing-bottom.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/alloca/err.alloca-null-deref-lvalue.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/alloca/err.alloca-null-deref.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/alloca/err.alloca-scratch-exceeding-bcopy.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNN
test/unittest/funcs/alloca/err.alloca-store-before-bottom.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/alloca/err.alloca-store-beyond-top.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/alloca/err.alloca-store-crossing-bottom.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/bcopy/err.badbcopy1.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/bcopy/err.badbcopy4.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/bcopy/err.badbcopy5.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/bcopy/err.badbcopy6.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNN
test/unittest/funcs/bcopy/err.badbcopy7.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNN
test/unittest/funcs/bcopy/err.badbcopy8.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNN
test/unittest/funcs/copyin/err.badaddr.r +1 -1
@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyin/err.badaddr.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/copyin/err.null_arg1.r +1 -1
@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyin/err.null_arg1.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/copyinstr/err.badaddr.r +1 -1
@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyinstr/err.badaddr.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/copyinstr/err.null_arg1.r +1 -1
@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyinstr/err.null_arg1.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/copyinto/err.badaddr.r +1 -1
@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyinto/err.badaddr.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/copyinto/err.badsize.r +1 -1
@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyinto/err.badsize.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNN
test/unittest/funcs/copyinto/err.null_arg1.r +1 -1
@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyinto/err.null_arg1.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/err.badalloca.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID NNN: profile:::tick-1): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID NNN (profile:::tick-1): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/err.badalloca.r.p +6 -2
@@ -1,3 +1,7 @@ -#!/bin/sed -f +#!/usr/bin/awk -f -s/(ID [0-9]*/(ID NNN/g +# This report has a variable probe ID in it. +{ + sub("for probe ID [0-9]* .profile", "for probe ID NNN (profile"); + print; +}
test/unittest/funcs/err.link_ntopbadaddr.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/err.link_ntopbadarg.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): illegal operation in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): illegal operation at BPF pc NNN
test/unittest/funcs/inet_ntoa6/err.inet_ntoa6.arg1_null.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/inet_ntoa6/err.inet_ntoa6.arg1_null_const.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/strlen/tst.null.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/strtok/tst.strtok_null.r +1 -1
@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/strtok/tst.strtok_null.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/strtok/tst.strtok_nulldel.r +1 -1
@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/strtok/tst.strtok_nulldel.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/strtok/tst.strtok_nullstr.r +1 -1
@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/strtok/tst.strtok_nullstr.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/strtok/tst.strtok_nullstr2.r +1 -1
@@ -4,4 +4,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/strtok/tst.strtok_nullstr2.d' matched 4 probes -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/funcs/substr/err.substr_null_arg1.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/pointers/err.AllocaOverrun.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/pointers/err.BadAlign.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/pointers/err.InvalidAddress2.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/pointers/err.InvalidAddress4.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNN
test/unittest/speculation/err.CommitWithInvalid.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): illegal operation in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): illegal operation at BPF pc NNN
test/unittest/speculation/err.DiscardWithInvalid.r +1 -1
@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): illegal operation in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): illegal operation at BPF pc NNN
test/unittest/speculation/tst.SpecSizeVariations.r +0 -22
@@ -11,26 +11,6 @@ Speculative buffer ID: 1 123456706 counts: 1 1 -Speculative buffer ID: 1 -123456700 -123456701 -123456702 -123456703 -123456704 -123456705 -123456706 -counts: 1 1 - -Speculative buffer ID: 1 -123456700 -123456701 -123456702 -123456703 -123456704 -123456705 -123456706 -counts: 2 1 - Speculative buffer ID: 1 123456700 123456701
@@ -64,5 +44,3 @@ counts: 2 1 dtrace: 2 speculative drops dtrace: 1 speculative drop dtrace: 1 speculative drop -dtrace: 1 speculative drop -dtrace: 1 speculative drop
test/unittest/speculation/tst.SpecSizeVariations.sh +1 -1
@@ -9,7 +9,7 @@ dtrace=$1 -for x in 63 64 79 80 143 144; do +for x in 71 72 159 160; do $dtrace $dt_flags -xspecsize=$x -qn ' BEGIN {
test/unittest/speculation/tst.negcommit.r +1 -1
@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/speculation/tst.negcommit.d' matched 2 probes -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): illegal operation in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): illegal operation at BPF pc NNN
test/unittest/variables/bvar/tst.arg3-ERROR-b.sh +1 -1
@@ -59,7 +59,7 @@ awk 'BEGIN { next; } - /error on enabled probe/ { + /error in dt_clause_/ { if (!($NF in sites)) { print; print " No call to dt_probe_error found at PC " $NF;
test/unittest/variables/bvar/tst.arg3-ERROR.sh +1 -1
@@ -120,7 +120,7 @@ done # Do a sanity check on DTrace's error output. -awk '/^dtrace: error on enabled probe ID [0-9]* \(ID 1: dtrace:::BEGIN): invalid address \(0x40) in action #[0-9] at BPF pc [0-9]*$/ { print $NF }' \ +awk '/^dtrace: error in dt_clause_[1-4] for probe ID 1 \(dtrace:::BEGIN): invalid address \(0x40) at BPF pc [0-9]*$/ { print $NF }' \ disasm.out > err_pcs.txt.chk1 if ! diff -q err_pcs.txt err_pcs.txt.chk1; then echo ERROR: problem with DTrace error output
Signature · 1 line
2.43.5
Great patch. Found a few smallish things though that we probably want to address before putting this in (potential risks for buffer overruns).
Also, because dt_stmts is constructed from the programs being presented for loading by the consumer (which is a 2nd step after the consumer uses libdtrace to compile the statements), it is technically possible that not all elements in dt_stmts will be filled in. There is no guarantee that a consumer will present every compiled program for loading (though in practice that is of course not going to happen).
But since libdtrace allows this by design, every indexing of dt_stmts (there are only a few - marked below) should first make sure that the element is not NULL.
Quoted 981 lines · On Tue, Sep 17, 2024 at 02:08:12PM -0400, [email protected] wrote:
From: Eugene Loh <[email protected]>
Historically, the enabled probe id (epid) was an integer, passed from producer to consumer, that uniquely identified probe ID and statement (data description). It was used in error reporting and was available to D users via a built-in variable "epid".
However, its value was opaque to users and difficult to use.
Deprecate the use of EPID:
*) Have the producer pass to the consumer the probe ID and statement
ID explicitly, instead of passing an opaque integer that requires additional lookup tables.*) Keep an array dt_stmts[] of statements, from which we can retrieve
probe descriptions and data descriptions.*) Remove data structures related to epid: dt_ddesc[], dt_pdesc[],
dt_nextepid,dt_maxprobe, etc.Nevertheless, continue to provide a value for the built-in "epid" variable for back compatability. Expand the epid from 4 bytes to 8 bytes: the upper half is the probe ID and the lower half the statement ID.
The output buffer (written by the producer, read by the consumer) is rearranged slightly. Note that:
*) It starts with a 4-byte size, which
perf_eventwrites.*) The beginning of the output buffer should have 8-byte alignment.
*) The beginning of the trace data within the output buffer should
also have 8-byte alignment.*) So we rearrange as follows:
old new
0: pad / size pad / size <==
4: pad specid
8: epid <== prid
12: specid stid
16: data[n] data[n]The arrow <== indicates where the buffer starts.
For error reporting:
*) Report errors in terms of the probe ID (and description) and the
clause function name, which is decipherable in terms of the disassembly output. Specifically, change ERROR-probe arguments:-) arg1 changes from epid to the probe ID
-) arg2 changes from "clause index" (which is no longer needed)
to the statement ID that identifies the clause named in disassembly output*) No longer report the "action number", which has lost much of its
meaning in the port to eBPF. Nonetheless, keepdteda_action; its value is not used, but set the value to stid for possible future use.Signed-off-by Eugene Loh <[email protected]>--- bpf/get_bvar.c | 5 +- bpf/probe_error.c | 8 +- include/dtrace/metadesc.h | 4 +- include/dtrace/universal.h | 3 +- libdtrace/dt_bpf.c | 2 - libdtrace/dt_bpf.h | 46 +++++---- libdtrace/dt_cc.c | 47 +++------- libdtrace/dt_cg.c | 49 +++++----- libdtrace/dt_consume.c | 85 +++++++++-------- libdtrace/dt_dctx.h | 21 +++-- libdtrace/dt_dlibs.c | 2 - libdtrace/dt_error.c | 2 +- libdtrace/dt_handle.c | 41 ++++---- libdtrace/dt_impl.h | 15 +-- libdtrace/dt_map.c | 94 ++----------------- libdtrace/dt_open.c | 5 +- libdtrace/dt_program.c | 9 +- libdtrace/dtrace.h | 3 +- test/demo/builtin/eipd.d | 4 - test/demo/dtrace/error.r | 2 +- test/demo/spec/specopen.d | 5 +- test/stress/buffering/tst.resize3-manual.d | 2 +- test/stress/buffering/tst.resize3-manual.r | 2 +- test/stress/buffering/tst.resize3.d | 2 +- test/stress/buffering/tst.resize3.r | 2 +- test/unittest/actions/setopt/tst.badopt.r | 14 +-- .../arrays/tst.declared-bounds.runtime_out.r | 2 +- test/unittest/codegen/err.deref_0.r | 2 +- test/unittest/codegen/err.deref_1.r | 2 +- test/unittest/codegen/err.deref_i0.r | 2 +- test/unittest/codegen/err.deref_i1.r | 2 +- .../unittest/codegen/err.deref_string-assoc.r | 2 +- test/unittest/codegen/err.deref_string-gvar.r | 2 +- test/unittest/codegen/err.deref_string-lvar.r | 2 +- test/unittest/codegen/err.deref_string-tvar.r | 2 +- .../codegen/err.str_NULL_plus_offset-assoc.r | 2 +- .../codegen/err.str_NULL_plus_offset-lvar.r | 2 +- .../codegen/err.str_NULL_plus_offset-tvar.r | 2 +- .../codegen/err.str_NULL_plus_offset.r | 2 +- test/unittest/disasm/tst.vartab-bvar.r | 2 +- test/unittest/drops/drp.DTRACEDROP_DBLERROR.r | 2 +- .../tst.DTRACEFLT_BADADDR.null_ptr_field.d | 6 +- .../tst.DTRACEFLT_BADADDR.null_ptr_field.r | 2 +- test/unittest/error/tst.DTRACEFLT_BADADDR.r | 4 +- test/unittest/error/tst.DTRACEFLT_BADADDR2.r | 4 +- .../error/tst.DTRACEFLT_DIVZERO.div.d | 11 ++- .../error/tst.DTRACEFLT_DIVZERO.div.r | 2 +- .../error/tst.DTRACEFLT_DIVZERO.mod.d | 11 ++- .../error/tst.DTRACEFLT_DIVZERO.mod.r | 2 +- test/unittest/error/tst.DTRACEFLT_UNKNOWN.r | 4 +- .../error/tst.clause_scope-begin-ended.r | 2 +- test/unittest/error/tst.clause_scope-begin.r | 2 +- .../unittest/error/tst.clause_scope-regular.r | 2 +- .../error/tst.clause_scope-regular.r.p | 8 +- test/unittest/error/tst.error.r | 2 +- test/unittest/error/tst.errorend.r | 2 +- .../alloca/err.alloca-bcopy-before-beyond.r | 2 +- .../alloca/err.alloca-bcopy-before-bottom.r | 2 +- .../alloca/err.alloca-bcopy-beyond-top.r | 2 +- .../alloca/err.alloca-bcopy-crossing-bottom.r | 2 +- .../alloca/err.alloca-bcopy-crossing-top.r | 2 +- .../alloca/err.alloca-crossing-clauses.r | 2 +- .../alloca/err.alloca-load-before-bottom.r | 2 +- .../funcs/alloca/err.alloca-load-beyond-top.r | 2 +- .../alloca/err.alloca-load-crossing-bottom.r | 2 +- .../alloca/err.alloca-null-deref-lvalue.r | 2 +- .../funcs/alloca/err.alloca-null-deref.r | 2 +- .../err.alloca-scratch-exceeding-bcopy.r | 2 +- .../alloca/err.alloca-store-before-bottom.r | 2 +- .../alloca/err.alloca-store-beyond-top.r | 2 +- .../alloca/err.alloca-store-crossing-bottom.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy1.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy4.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy5.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy6.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy7.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy8.r | 2 +- test/unittest/funcs/copyin/err.badaddr.r | 2 +- test/unittest/funcs/copyin/err.null_arg1.r | 2 +- test/unittest/funcs/copyinstr/err.badaddr.r | 2 +- test/unittest/funcs/copyinstr/err.null_arg1.r | 2 +- test/unittest/funcs/copyinto/err.badaddr.r | 2 +- test/unittest/funcs/copyinto/err.badsize.r | 2 +- test/unittest/funcs/copyinto/err.null_arg1.r | 2 +- test/unittest/funcs/err.badalloca.r | 2 +- test/unittest/funcs/err.badalloca.r.p | 8 +- test/unittest/funcs/err.link_ntopbadaddr.r | 2 +- test/unittest/funcs/err.link_ntopbadarg.r | 2 +- .../inet_ntoa6/err.inet_ntoa6.arg1_null.r | 2 +- .../err.inet_ntoa6.arg1_null_const.r | 2 +- test/unittest/funcs/strlen/tst.null.r | 2 +- test/unittest/funcs/strtok/tst.strtok_null.r | 2 +- .../funcs/strtok/tst.strtok_nulldel.r | 2 +- .../funcs/strtok/tst.strtok_nullstr.r | 2 +- .../funcs/strtok/tst.strtok_nullstr2.r | 2 +- .../funcs/substr/err.substr_null_arg1.r | 2 +- test/unittest/pointers/err.AllocaOverrun.r | 2 +- test/unittest/pointers/err.BadAlign.r | 2 +- test/unittest/pointers/err.InvalidAddress2.r | 2 +- test/unittest/pointers/err.InvalidAddress4.r | 2 +- .../speculation/err.CommitWithInvalid.r | 2 +- .../speculation/err.DiscardWithInvalid.r | 2 +- .../speculation/tst.SpecSizeVariations.r | 22 ----- .../speculation/tst.SpecSizeVariations.sh | 2 +- test/unittest/speculation/tst.negcommit.r | 2 +- .../variables/bvar/tst.arg3-ERROR-b.sh | 2 +- .../unittest/variables/bvar/tst.arg3-ERROR.sh | 2 +- 107 files changed, 292 insertions(+), 404 deletions(-) delete mode 100644 test/demo/builtin/eipd.dbpf/get_bvar.c +3
-2@@ -48,8 +48,9 @@ noinline uint64_t dt_get_bvar(const dt_dctx_t *dctx, uint32_t id, uint32_t idx) mst->tstamp =bpf_ktime_get_ns ();return mst->tstamp; -case DIF_VAR_EPID : -return mst->epid; +case DIF_VAR_EPID : { +return (((uint64_t )mst->prid) <<32 ) | mst->stid; + }case DIF_VAR_ID :return mst->prid;case DIF_VAR_ARG0 :case DIF_VAR_ARG1 :case DIF_VAR_ARG2 :bpf/probe_error.c +4
-4@@ -16,8 +16,8 @@ extern int64_t dt_error(const dt_dctx_t *dctx);/* * DTrace ERROR probes provide 6 arguments: * arg0 = always NULL (used to be kernel consumer state pointer) -* arg1 = EPID of probe that triggered the fault -* arg2 = clause index of code that triggered the fault +* arg1 = probe ID that triggered the fault +* arg2 = statement ID that triggered the fault * arg3 = BPF offset in the clause that triggered the fault (or -1) * arg4 = fault type * arg5 = fault-specific value (usually address being accessed or 0) @@ -30,8 +30,8 @@ noinline void dt_probe_error(const dt_dctx_t *dctx, uint64_t pc, uint64_t fault,__builtin_memcpy (mst->saved_argv, mst->argv,sizeof (mst->saved_argv)); mst->argv[0 ] =0 ; - mst->argv[1 ] = mst->epid; - mst->argv[2 ] = mst->clid; + mst->argv[1 ] = mst->prid; + mst->argv[2 ] = mst->stid; mst->argv[3 ] = pc; mst->argv[4 ] = fault; mst->argv[5 ] = illval;include/dtrace/metadesc.h +2
-2@@ -19,8 +19,8 @@/* * DTrace separates the trace data stream from the metadata stream. The only -* metadata tokens placed in the data stream are enabled probe identifiers -* (EPIDs) or (in the case of aggregations) aggregation identifiers. In order +* metadata tokens placed in the data stream are probe and statement identifiers +* or (in the case of aggregations) aggregation identifiers. In order * to determine the structure of the data, DTrace uses the token to perform a * lookup to retrieve the corresponding description of the enabled probe (via * the dtrace_datadesc structure) or the aggregation (via the dtrace_aggdesc include/dtrace/universal.h +1
-2@@ -17,7 +17,6 @@#define DTRACE_CPUALL -1/* all CPUs */ #define DTRACE_IDNONE 0/* invalid probe identifier */ -#define DTRACE_EPIDNONE 0/* invalid enabled probe identifier */ #define DTRACE_AGGIDNONE 0/* invalid aggregation identifier */ #define DTRACE_AGGVARIDNONE 0/* invalid aggregation variable ID */ #define DTRACE_CACHEIDNONE 0/* invalid predicate cache */ @@ -37,7 +36,7 @@ typedef uint16_t dtrace_actkind_t; /* action kind */typedef uint32_t dtrace_aggid_t ;/* aggregation identifier */ typedef uint32_t dtrace_cacheid_t ;/* predicate cache identifier */ -typedef uint32_t dtrace_epid_t ;/* enabled probe identifier */ +typedef uint32_t dtrace_stid_t ;/* statement identifier */ typedef uint32_t dtrace_optid_t ;/* option identifier */ typedef uint32_t dtrace_specid_t ;/* speculation identifier */ libdtrace/dt_bpf.c +0
-2@@ -774,7 +774,6 @@ gmap_create_cpuinfo(dtrace_hdl_t *dtp)* The size of the memory region is the sum of: * - size of the DTrace machine state, rounded up to the nearest * multiple of 8 -* - 8 bytes padding for trace buffer alignment purposes * - maximum trace buffer record size, rounded up to the nearest * multiple of 8 * - size of dctx->mem (see dt_dctx.h) @@ -783,7 +782,6 @@ static int gmap_create_mem(dtrace_hdl_t *dtp) {size_t sz =roundup (sizeof (dt_mstate_t),8 ) + -8 +roundup (dtp->dt_maxreclen,8 ) +DMEM_SIZE (dtp);libdtrace/dt_bpf.h +22
-24@@ -32,30 +32,28 @@ extern "C" { (dtp)->dt_bpffeatures |= (feat); \ } while (0) -#define DT_CONST_EPID 1 -#define DT_CONST_PRID 2 -#define DT_CONST_CLID 3 -#define DT_CONST_ARGC 4 -#define DT_CONST_STBSZ 5 -#define DT_CONST_STRSZ 6 -#define DT_CONST_STKSIZ 7 -#define DT_CONST_BOOTTM 8 -#define DT_CONST_NSPEC 9 -#define DT_CONST_NCPUS 10 -#define DT_CONST_PC 11 -#define DT_CONST_TUPSZ 12 -#define DT_CONST_TASK_PID 13 -#define DT_CONST_TASK_TGID 14 -#define DT_CONST_TASK_REAL_PARENT 15 -#define DT_CONST_TASK_COMM 16 -#define DT_CONST_MUTEX_OWNER 17 -#define DT_CONST_RWLOCK_CNTS 18 -#define DT_CONST_DCTX_RODATA 19 -#define DT_CONST_RODATA_OFF 20 -#define DT_CONST_RODATA_SIZE 21 -#define DT_CONST_ZERO_OFF 22 -#define DT_CONST_STACK_OFF 23 -#define DT_CONST_STACK_SKIP 24 +#define DT_CONST_PRID 1 +#define DT_CONST_ARGC 2 +#define DT_CONST_STBSZ 3 +#define DT_CONST_STRSZ 4 +#define DT_CONST_STKSIZ 5 +#define DT_CONST_BOOTTM 6 +#define DT_CONST_NSPEC 7 +#define DT_CONST_NCPUS 8 +#define DT_CONST_PC 9 +#define DT_CONST_TUPSZ 10 +#define DT_CONST_TASK_PID 11 +#define DT_CONST_TASK_TGID 12 +#define DT_CONST_TASK_REAL_PARENT 13 +#define DT_CONST_TASK_COMM 14 +#define DT_CONST_MUTEX_OWNER 15 +#define DT_CONST_RWLOCK_CNTS 16 +#define DT_CONST_DCTX_RODATA 17 +#define DT_CONST_RODATA_OFF 18 +#define DT_CONST_RODATA_SIZE 19 +#define DT_CONST_ZERO_OFF 20 +#define DT_CONST_STACK_OFF 21 +#define DT_CONST_STACK_SKIP 22#define DT_BPF_LOG_SIZE_DEFAULT (UINT32_MAX >> 8)#define DT_BPF_LOG_SIZE_SMALL 4096libdtrace/dt_cc.c +12
-35@@ -123,6 +123,7 @@ dt_stmt_create(dtrace_hdl_t *dtp, dtrace_ecbdesc_t *edp,if (sdp ==NULL )longjmp (yypcb->pcb_jmpbuf,EDT_NOMEM ); + sdp->dtsd_id = dtp->dt_stmt_nextid++;assert (yypcb->pcb_stmt ==NULL ); yypcb->pcb_stmt = sdp; yypcb->pcb_maxrecs =0 ;@@ -130,11 +131,10 @@ dt_stmt_create(dtrace_hdl_t *dtp, dtrace_ecbdesc_t *edp,return sdp; } -static dt_ident_t * -dt_clause_create (dtrace_hdl_t *dtp,dtrace_difo_t *dp) +static void +dt_stmt_set_clause (dtrace_hdl_t *dtp,dtrace_difo_t *dp,dtrace_stmtdesc_t *sdp) {char *name; -int len;dt_ident_t *idp;/* @@ -153,25 +153,21 @@ dt_clause_create(dtrace_hdl_t *dtp, dtrace_difo_t *dp)/* * Generate a symbol name. */ - len =snprintf (NULL ,0 ,"dt_clause_%d" , dtp->dt_clause_nextid) +1 ; - name =dt_alloc (dtp, len); -if (name ==NULL ) +if (asprintf (&name,"dt_clause_%d" , sdp->dtsd_id) <0 )longjmp (yypcb->pcb_jmpbuf,EDT_NOMEM ); -snprintf (name, len,"dt_clause_%d" , dtp->dt_clause_nextid++); -/* * Add the symbol to the BPF identifier table and associate the DIFO * with the symbol. */ idp =dt_dlib_add_func (dtp, name); -dt_free (dtp, name); +free (name);if (idp ==NULL )longjmp (yypcb->pcb_jmpbuf,EDT_NOMEM );dt_ident_set_data (idp, dp); -return idp; + sdp->dtsd_clause = idp; } static void@@ -211,7 +207,7 @@ dt_compile_one_clause(dtrace_hdl_t *dtp, dt_node_t *cnp, dt_node_t *pnp)* Compile the clause (predicate and action). */ dt_cg (yypcb, cnp); - sdp->dtsd_clause =dt_clause_create (dtp,dt_as (yypcb)); +dt_stmt_set_clause (dtp,dt_as (yypcb), sdp);assert (yypcb->pcb_stmt == sdp);if (dtrace_stmt_add (yypcb->pcb_hdl, yypcb->pcb_prog, sdp) !=0 )@@ -944,7 +940,7 @@ static int get_boottime() {static int dt_link_construct (dtrace_hdl_t *dtp,const dt_probe_t *prp,dtrace_difo_t *dp,dt_ident_t *idp,const dtrace_difo_t *sdp,uint_t *pcp, -uint_t *rcp,uint_t *vcp,dtrace_epid_t epid,uint_t clid) +uint_t *rcp,uint_t *vcp) {uint_t pc = *pcp;uint_t rc = *rcp;@@ -955,7 +951,6 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,uint_t len = sdp->dtdo_brelen;const dof_relodesc_t *rp = sdp->dtdo_breltab;dof_relodesc_t *nrp = &dp->dtdo_breltab[rc]; -dtrace_id_t prid = prp->desc->id;int no_deps =0 ;if (idp !=NULL ) {@@ -1026,7 +1021,6 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,for (; len !=0 ; len--, rp++, nrp++) {const char *name =dt_difo_getstr (sdp, rp->dofr_name);dtrace_difo_t *rdp; -dtrace_epid_t nepid;int ipc; idp =dt_dlib_get_sym (dtp, name);@@ -1041,15 +1035,9 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp, }switch (idp->di_id) { -case DT_CONST_EPID : - nrp->dofr_data = epid; -continue ;case DT_CONST_PRID : nrp->dofr_data = prp->desc->id;continue ; -case DT_CONST_CLID : - nrp->dofr_data = clid; -continue ;case DT_CONST_ARGC : nrp->dofr_data =0 ;/* FIXME */ continue ;@@ -1193,11 +1181,6 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,case DT_CONST_STACK_SKIP : nrp->dofr_data = prp->prov->impl->stack_skip;continue ; -default : -/* probe name -> value is probe id */ -if (strchr (idp->di_name,':' ) !=NULL ) - prid = rp->dofr_data; -continue ; }continue ;@@ -1213,13 +1196,8 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp, rdp =dt_dlib_get_func_difo (dtp, idp);if (rdp ==NULL )return -1 ; -if (rdp->dtdo_ddesc !=NULL ) { - nepid =dt_epid_add (dtp, rdp->dtdo_ddesc, prid); - clid++; - }else - nepid =0 ; ipc =dt_link_construct (dtp, prp, dp, idp, rdp, pcp, - rcp, vcp, nepid, clid); + rcp, vcp);if (ipc ==-1 )return -1 ;@@ -1260,8 +1238,8 @@ dt_link_resolve(dtrace_hdl_t *dtp, dtrace_difo_t *dp)continue ;/* -* We are only relocating constants (EPID and ARGC) and call -* instructions to functions that have been linked in. +* We are only relocating constants and call instructions to +* functions that have been linked in. */ switch (idp->di_kind) {case DT_IDENT_SCALAR :@@ -1333,8 +1311,7 @@ dt_link(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,*/ insc = relc = varc =0 ; - rc =dt_link_construct (dtp, prp, fdp, idp, dp, &insc, &relc, &varc,0 , -0 ); + rc =dt_link_construct (dtp, prp, fdp, idp, dp, &insc, &relc, &varc);dt_dlib_reset (dtp,B_FALSE );if (rc ==-1 ) goto fail;libdtrace/dt_cg.c +22
-27@@ -277,15 +277,9 @@ dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act)* buf = rc + roundup(sizeof(dt_mstate_t), 8); * // add %r0, roundup( * sizeof(dt_mstate_t), 8) -* *((uint64_t *)&buf[0]) = 0; -* // stdw [%r0 + 0], 0 -* buf += 8; // add %r0, 8 -* // (%r0 = pointer to buffer space) * dctx.buf = buf; // stdw [%r9 + DCTX_BUF], %r0 */ emit (dlp,BPF_ALU64_IMM (BPF_ADD ,BPF_REG_0 ,roundup (sizeof (dt_mstate_t),8 ))); -emit (dlp,BPF_STORE_IMM (BPF_DW ,BPF_REG_0 ,0 ,0 )); -emit (dlp,BPF_ALU64_IMM (BPF_ADD ,BPF_REG_0 ,8 ));emit (dlp,BPF_STORE (BPF_DW ,BPF_REG_9 ,DCTX_BUF ,BPF_REG_0 ));/* @@ -1047,8 +1041,9 @@ dt_cg_tramp_error(dt_pcb_t *pcb)* * - Store the base pointer to the output data buffer in %r9. * - Initialize the machine state (dctx->mst). -* - Store the epid at [%r9 + DBUF_EPID]. * - Store 0 to indicate no active speculation at [%r9 + DBUF_SPECID]. +* - Store the prid at [%r9 + DBUF_PRID]. +* - Store the stid at [%r9 + DBUF_STID]. * - Evaluate the predicate expression and return if false. * * The dt_program() function will always return 0. @@ -1057,11 +1052,6 @@ static void dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred) {dt_irlist_t *dlp = &pcb->pcb_ir; -dt_ident_t *epid =dt_dlib_get_var (pcb->pcb_hdl,"EPID" ); -dt_ident_t *clid =dt_dlib_get_var (pcb->pcb_hdl,"CLID" ); - -assert (epid !=NULL ); -assert (clid !=NULL );/* * void dt_program(dt_dctx_t *dctx) @@ -1093,18 +1083,13 @@ dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred)* // stdw [%r0 + DMST_FAULT], 0 * dctx->mst->tstamp = 0; // stdw [%r0 + DMST_TSTAMP], 0 * dctx->mst->specsize = 0;// stdw [%r0 + DMST_SPECSIZE], 0 -* dctx->mst->epid = EPID; // stw [%r0 + DMST_EPID], EPID -* dctx->mst->clid = CLID; // stw [%r0 + DMST_CLID], CLID -* *((uint32_t *)&buf[DBUF_EPID]) = EPID; -* // stw [%r9 + DBUF_EPID], EPID +* dctx->mst->stid = STID; // stw [%r0 + DMST_STID], STID */ emit (dlp,BPF_LOAD (BPF_DW ,BPF_REG_0 ,BPF_REG_0 ,DCTX_MST ));emit (dlp,BPF_STORE_IMM (BPF_DW ,BPF_REG_0 ,DMST_FAULT ,0 ));emit (dlp,BPF_STORE_IMM (BPF_DW ,BPF_REG_0 ,DMST_TSTAMP ,0 ));emit (dlp,BPF_STORE_IMM (BPF_DW ,BPF_REG_0 ,DMST_SPECSIZE ,0 )); -emite (dlp,BPF_STORE_IMM (BPF_W ,BPF_REG_0 ,DMST_EPID ,-1 ), epid); -emite (dlp,BPF_STORE_IMM (BPF_W ,BPF_REG_0 ,DMST_CLID ,-1 ), clid); -emite (dlp,BPF_STORE_IMM (BPF_W ,BPF_REG_9 ,DBUF_EPID ,-1 ), epid); +emit (dlp,BPF_STORE_IMM (BPF_W ,BPF_REG_0 ,DMST_STID , pcb->pcb_stmt->dtsd_id));/* * Set the speculation ID field to zero to indicate no active @@ -1114,6 +1099,17 @@ dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred)*/ emit (dlp,BPF_STORE_IMM (BPF_W ,BPF_REG_9 ,DBUF_SPECID ,0 )); +/* +* *((uint32_t *)&buf[DBUF_PRID]) = dctx->mst->prid; +* // ld %r1, [%r0 + DMST_PRID] +* // st [%r9 + DBUF_PRID], %r1 +* *((uint32_t *)&buf[DBUF_STID]) = stid; +* // st [%r9 + DBUF_STID], stid +*/ +emit (dlp,BPF_LOAD (BPF_W ,BPF_REG_1 ,BPF_REG_0 ,DMST_PRID )); +emit (dlp,BPF_STORE (BPF_W ,BPF_REG_9 ,DBUF_PRID ,BPF_REG_1 )); +emit (dlp,BPF_STORE_IMM (BPF_W ,BPF_REG_9 ,DBUF_STID , pcb->pcb_stmt->dtsd_id)); +/* * If there is a predicate: * @@ -1132,10 +1128,9 @@ dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred)TRACE_REGSET ("Prologue: End " );/* -* Account for 32-bit EPID (at offset 0) and 32-bit speculation ID (at -* offset 4). +* Set the offset for the beginning of trace data. */ - pcb->pcb_bufoff +=2 *sizeof (uint32_t ); + pcb->pcb_bufoff =DBUF_DATA ; }/* @@ -1170,15 +1165,15 @@ dt_cg_epilogue(dt_pcb_t *pcb)/* * rc = bpf_perf_event_output(dctx->ctx, &buffers, * BPF_F_CURRENT_CPU, -* buf - 4, bufoff + 4); +* buf + 4, bufoff - 4); * // lddw %r1, [%fp + DT_STK_DCTX] * // lddw %r1, [%r1 + DCTX_CTX] * // lddw %r2, &buffers * // lddw %r3, BPF_F_CURRENT_CPU * // mov %r4, %r9 -* // add %r4, -4 +* // add %r4, 4 * // mov %r5, pcb->pcb_bufoff -* // add %r5, 4 +* // add %r5, -4 * // call bpf_perf_event_output */ emit (dlp,BPF_LOAD (BPF_DW ,BPF_REG_1 ,BPF_REG_FP ,DT_STK_DCTX ));@@ -1186,9 +1181,9 @@ dt_cg_epilogue(dt_pcb_t *pcb)dt_cg_xsetx (dlp, buffers,DT_LBL_NONE ,BPF_REG_2 , buffers->di_id);dt_cg_xsetx (dlp,NULL ,DT_LBL_NONE ,BPF_REG_3 ,BPF_F_CURRENT_CPU );emit (dlp,BPF_MOV_REG (BPF_REG_4 ,BPF_REG_9 )); -emit (dlp,BPF_ALU64_IMM (BPF_ADD ,BPF_REG_4 ,-4 )); +emit (dlp,BPF_ALU64_IMM (BPF_ADD ,BPF_REG_4 ,4 ));emit (dlp,BPF_MOV_IMM (BPF_REG_5 , pcb->pcb_bufoff)); -emit (dlp,BPF_ALU64_IMM (BPF_ADD ,BPF_REG_5 ,4 )); +emit (dlp,BPF_ALU64_IMM (BPF_ADD ,BPF_REG_5 ,-4 ));emit (dlp,BPF_CALL_HELPER (BPF_FUNC_perf_event_output));/* libdtrace/dt_consume.c +46
-39@@ -15,9 +15,11 @@#include <alloca.h> #include <dt_impl.h> #include <dt_aggregate.h> +#include <dt_dctx.h> #include <dt_module.h> #include <dt_pcap.h> #include <dt_peb.h> +#include <dt_probe.h> #include <dt_state.h> #include <dt_string.h> #include <libproc.h> @@ -433,7 +435,7 @@ static dt_htab_ops_t dt_spec_buf_htab_ops = { };static int -dt_flowindent (dtrace_hdl_t *dtp,dtrace_probedata_t *data,dtrace_epid_t last) +dt_flowindent (dtrace_hdl_t *dtp,dtrace_probedata_t *data,dtrace_id_t lastprid,dtrace_stid_t laststid) {dtrace_probedesc_t *pd = data->dtpda_pdesc;dtrace_flowkind_t flow =DTRACEFLOW_NONE ;@@ -445,7 +447,7 @@ dt_flowindent(dtrace_hdl_t *dtp, dtrace_probedata_t *data, dtrace_epid_t last)static const char *r_str[2 ] = {" <- " ," <= " };static const char *ent ="entry" , *ret ="return" ;static int entlen =0 , retlen =0 ; -dtrace_epid_t id = data->dtpda_epid; +dtrace_stid_t stid = data->dtpda_stid;if (entlen ==0 ) {assert (retlen ==0 );@@ -473,13 +475,12 @@ dt_flowindent(dtrace_hdl_t *dtp, dtrace_probedata_t *data, dtrace_epid_t last)/* * If we're going to indent this, we need to check the ID of our last -* call. If we're looking at the same probe ID but a different EPID, +* call. If we're looking at the same probe ID but a different STID, * we _don't_ want to indent. (Yes, there are some minor holes in * this scheme -- it's a heuristic.) */ if (flow ==DTRACEFLOW_ENTRY ) { -if (last !=DTRACE_EPIDNONE && id != last && - pd->id == dtp->dt_pdesc[last]->id) +if (stid != laststid && pd->id == lastprid) flow =DTRACEFLOW_NONE ; }@@ -2145,8 +2146,8 @@ static dtrace_workstatus_t dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size, dtrace_probedata_t *pdat, dtrace_consume_probe_f *efunc, dtrace_consume_rec_f *rfunc, int flow, int quiet, - int peekflags, dtrace_epid_t *last, int committing, - void *arg); + int peekflags, dtrace_id_t *lastprid, + dtrace_stid_t *laststid, int committing, void *arg);/* * Commit one speculation. @@ -2155,7 +2156,8 @@ static dtrace_workstatus_tdt_commit_one_spec (dtrace_hdl_t *dtp,FILE *fp, dt_spec_buf_t *dtsb, dtrace_probedata_t *pdat, dtrace_consume_probe_f *efunc, dtrace_consume_rec_f *rfunc, int flow, int quiet, - int peekflags, dtrace_epid_t *last, void *arg) + int peekflags, dtrace_id_t *lastprid, + dtrace_stid_t *laststid, void *arg) {dt_spec_buf_data_t *dsbd;@@ -2169,7 +2171,7 @@ dt_commit_one_spec(dtrace_hdl_t *dtp, FILE *fp, dt_spec_buf_t *dtsb, ret =dt_consume_one_probe (dtp, fp, dsbd->dsbd_data, dsbd->dsbd_size, &specpdat, efunc, rfunc, flow, quiet, - peekflags, last,1 , arg); + peekflags, lastprid, laststid,1 , arg);if (ret !=DTRACE_WORKSTATUS_OKAY )return ret; }@@ -2181,34 +2183,33 @@ static dtrace_workstatus_t dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size, dtrace_probedata_t *pdat, dtrace_consume_probe_f *efunc, dtrace_consume_rec_f *rfunc, int flow, int quiet, - int peekflags, dtrace_epid_t *last, int committing, - void *arg) + int peekflags, dtrace_id_t *lastprid, + dtrace_stid_t *laststid, int committing, void *arg) { -dtrace_epid_t epid; +dtrace_specid_t specid; +dtrace_id_t prid; +dtrace_stid_t stid;dtrace_datadesc_t *epd;dt_spec_buf_t tmpl;dt_spec_buf_t *dtsb; -int specid;int i;int rval;dtrace_workstatus_t ret;int commit_discard_seen, only_commit_discards;int data_recording =1 ; - epid = ((uint32_t *)data)[0 ]; - specid = ((uint32_t *)data)[1 ]; + specid = *((dtrace_specid_t *)(data +DBUF_SPECID )); + prid = *((dtrace_id_t *)(data +DBUF_PRID )); + stid = *((dtrace_stid_t *)(data +DBUF_STID )); -/* -* Fill in the epid and address of the epid in the buffer. We need to -* pass this to the efunc and possibly to create speculations. -*/ - pdat->dtpda_epid = epid; + pdat->dtpda_stid = stid; pdat->dtpda_data = data; - rval =dt_epid_lookup (dtp, epid, &pdat->dtpda_ddesc, - &pdat->dtpda_pdesc); -if (rval !=0 ) -return dt_set_errno (dtp,EDT_BADEPID ); +if (prid > dtp->dt_probe_id) +return dt_set_errno (dtp,EDT_BADID ); + pdat->dtpda_pdesc = (dtrace_probedesc_t *)dtp->dt_probes[prid]->desc; +if (dt_stid_lookup (dtp, stid, &pdat->dtpda_ddesc) !=0 ) +return dt_set_errno (dtp,EDT_BADSTID ); epd = pdat->dtpda_ddesc;if (epd->dtdd_uarg !=DT_ECB_DEFAULT ) {@@ -2306,7 +2307,7 @@ dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size,if (data_recording) {if (flow) -dt_flowindent (dtp, pdat, *last); +dt_flowindent (dtp, pdat, *lastprid, *laststid); rval = (*efunc)(pdat, arg);@@ -2569,14 +2570,15 @@ dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size, }/* -* Call the record callback with a NULL record to indicate -* that we're done processing this EPID. The return value is ignored in -* this case. XXX should we respect at least DTRACE_CONSUME_ABORT? +* Call the record callback with a NULL record to indicate that we're +* done processing this record. The return value is ignored in this +* case. XXX should we respect at least DTRACE_CONSUME_ABORT? */ if (data_recording) { (*rfunc)(pdat,NULL , arg); - *last = epid; + *lastprid = prid; + *laststid = stid; }/* @@ -2597,7 +2599,7 @@ dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size,if ((ret =dt_commit_one_spec (dtp, fp, dtsb, pdat, efunc, rfunc, flow, quiet, peekflags, - last, arg)) != + lastprid, laststid, arg)) !=DTRACE_WORKSTATUS_OKAY ) {dt_spec_buf_data_destroy (dtp, dtsb);return ret;@@ -2623,7 +2625,7 @@ static dtrace_workstatus_tdt_consume_one (dtrace_hdl_t *dtp,FILE *fp, char *buf, dtrace_probedata_t *pdat, dtrace_consume_probe_f *efunc, dtrace_consume_rec_f *rfunc, int flow, int quiet, int peekflags, - dtrace_epid_t *last, void *arg) + dtrace_id_t *lastprid, dtrace_stid_t *laststid, void *arg) {char *data = buf;struct perf_event_header *hdr;@@ -2639,9 +2641,9 @@ dt_consume_one(dtrace_hdl_t *dtp, FILE *fp, char *buf,* struct { * struct perf_event_header header; * uint32_t size; -* uint32_t pad; -* uint32_t epid; * uint32_t specid; +* uint32_t prid; +* uint32_t stid; * uint64_t data[n]; * } * and 'data' points to the 'size' member at this point. @@ -2651,17 +2653,21 @@ dt_consume_one(dtrace_hdl_t *dtp, FILE *fp, char *buf,return dt_set_errno (dtp,EDT_DSIZE ); size = *(uint32_t *)data; - data +=sizeof (size); ptr +=sizeof (size) + size;if (ptr != buf + hdr->size)return dt_set_errno (dtp,EDT_DSIZE ); - data +=sizeof (uint32_t );/* skip padding */ - size -=sizeof (uint32_t ); +/* +* "size" measures from after &size to the end. But buffer +* offsets are relative to &size itself, to preserve 8-byte +* alignment. So, we leave data pointing at &size, and we +* increase size by 4 bytes. +*/ + size +=4 ;return dt_consume_one_probe (dtp, fp, data, size, pdat, efunc, rfunc, flow, quiet, peekflags, - last,0 , arg); + lastprid, laststid,0 , arg); }else if (hdr->type ==PERF_RECORD_LOST ) {return DTRACE_WORKSTATUS_OKAY ; }else @@ -2692,7 +2698,8 @@ dt_consume_cpu(dtrace_hdl_t *dtp, FILE *fp, dt_peb_t *peb, {struct perf_event_mmap_page *rb_page = (void *)peb->base;struct perf_event_header *hdr; -dtrace_epid_t last =DTRACE_EPIDNONE ; +dtrace_id_t lastprid; +dtrace_stid_t laststid;char *base;char *event;uint32_t len;@@ -2764,7 +2771,7 @@ dt_consume_cpu(dtrace_hdl_t *dtp, FILE *fp, dt_peb_t *peb, } rval =dt_consume_one (dtp, fp, event, &pdat, efunc, rfunc, flow, - quiet, peekflags, &last, arg); + quiet, peekflags, &lastprid, &laststid, arg);if (rval ==DTRACE_WORKSTATUS_DONE )return DTRACE_WORKSTATUS_OKAY ;if (rval !=DTRACE_WORKSTATUS_OKAY )libdtrace/dt_dctx.h +13
-8@@ -25,9 +25,8 @@* The DTrace machine state. */ typedef struct dt_mstate { - uint32_t epid; /* Enabled probe ID */ uint32_t prid; /* Probe ID */ - uint32_t clid; /* Clause ID (unique per probe) */ + uint32_t stid; /* Statement ID */ uint32_t tag; /* Tag (for future use) */ uint32_t scratch_top; /* Current top of scratch space */ int32_t syscall_errno; /* syscall errno */@@ -41,9 +40,8 @@ typedef struct dt_mstate {uint64_t saved_argv[6 ];/* Saved arguments */ } dt_mstate_t; -#define DMST_EPID offsetof(dt_mstate_t, epid)#define DMST_PRID offsetof(dt_mstate_t, prid) -#define DMST_CLID offsetof(dt_mstate_t, clid) +#define DMST_STID offsetof(dt_mstate_t, stid)#define DMST_TAG offsetof(dt_mstate_t, tag)#define DMST_SCRATCH_TOP offsetof(dt_mstate_t, scratch_top)#define DMST_ERRNO offsetof(dt_mstate_t, syscall_errno)@@ -90,16 +88,23 @@ typedef struct dt_dctx {* The dctx->buf pointer references a block of memory that contains: * * +----------------+ -* 0 -> | EPID | +* 0 -> | size | * +----------------+ -* 4 -> | Speculation ID | +* 4 -> | Speculation ID | * +----------------+ -* | Trace Data | +* 8 -> | PRID | +* +----------------+ +* 12 -> | STID | +* +----------------+ +* 16 -> | Trace Data | * | ... | * +----------------+ */ -#define DBUF_EPID 0 +#define DBUF_SIZE 0#define DBUF_SPECID 4 +#define DBUF_PRID 8 +#define DBUF_STID 12 +#define DBUF_DATA 16/* * The dctx->mem pointer references a block of memory that contains: libdtrace/dt_dlibs.c +0
-2@@ -73,9 +73,7 @@ static const dt_ident_t dt_bpf_symbols[] = {DT_BPF_SYMBOL (tuples,DT_IDENT_PTR ),/* BPF internal identifiers */ -DT_BPF_SYMBOL_ID (EPID ,DT_IDENT_SCALAR ,DT_CONST_EPID ),DT_BPF_SYMBOL_ID (PRID ,DT_IDENT_SCALAR ,DT_CONST_PRID ), -DT_BPF_SYMBOL_ID (CLID ,DT_IDENT_SCALAR ,DT_CONST_CLID ),DT_BPF_SYMBOL_ID (ARGC ,DT_IDENT_SCALAR ,DT_CONST_ARGC ),DT_BPF_SYMBOL_ID (STBSZ ,DT_IDENT_SCALAR ,DT_CONST_STBSZ ), DT_BPF_SYMBOL_ID(STRSZ, DT_IDENT_SCALAR, DT_CONST_STRSZ),libdtrace/dt_error.c +1
-1@@ -54,7 +54,7 @@ static const struct { { EDT_DOFFSET, "Data record offset exceeds buffer boundary" }, { EDT_DALIGN, "Data record has inappropriate alignment" }, { EDT_DSIZE, "Data record has incorrect size" }, - { EDT_BADEPID, "Invalid EPID" }, + { EDT_BADSTID, "Invalid statement ID" }, { EDT_BADOPTNAME, "Invalid option name" }, { EDT_BADOPTVAL, "Invalid value for specified option" }, { EDT_BADOPTCTX, "Option cannot be used from within a D program" },libdtrace/dt_handle.c +13
-9@@ -14,6 +14,7 @@#include <alloca.h> #include <dt_impl.h> +#include <dt_probe.h> #include <dt_program.h> static const char _dt_errprog[] =@@ -127,9 +128,9 @@ dt_handle_err(dtrace_hdl_t *dtp, dtrace_probedata_t *data)dtrace_datadesc_t *dd = data->dtpda_ddesc, *errdd;dtrace_probedesc_t *pd = data->dtpda_pdesc, *errpd;dtrace_errdata_t err; -dtrace_epid_t epid; +dtrace_id_t prid; +dtrace_stid_t stid; -char where[30 ];char details[30 ];char offinfo[30 ];const int slop =80 ;@@ -144,34 +145,32 @@ dt_handle_err(dtrace_hdl_t *dtp, dtrace_probedata_t *data)return dt_set_errno (dtp,EDT_BADERROR );/* -* This is an error. We have the following items here: EPID, -* faulting action, BPF pc, fault code and faulting address. +* This is an error. We have the following items here: PRID, +* statement ID, BPF pc, fault code and faulting address. */ - epid = (uint32_t )DT_REC (uint64_t,0 ); + prid =DT_REC (uint64_t,0 ); + stid =DT_REC (uint64_t,1 ); -if (dt_epid_lookup (dtp, epid, &errdd, &errpd) !=0 ) +if (prid > dtp->dt_probe_id)return dt_set_errno (dtp,EDT_BADERROR ); - +if (dt_stid_lookup (dtp, stid, &errdd) !=0 ) +return dt_set_errno (dtp,EDT_BADERROR ); + errpd = (dtrace_probedesc_t *)dtp->dt_probes[prid]->desc; err.dteda_ddesc = errdd; err.dteda_pdesc = errpd; err.dteda_cpu = data->dtpda_cpu; - err.dteda_action = (int )DT_REC (uint64_t,1 ); + err.dteda_action = stid; err.dteda_offset = (int )DT_REC (uint64_t,2 ); err.dteda_fault = (int )DT_REC (uint64_t,3 ); err.dteda_addr =DT_REC (uint64_t,4 ); faultstr =dtrace_faultstr (dtp, err.dteda_fault); - len =sizeof (where) +sizeof (offinfo) +strlen (faultstr) + + len =sizeof (offinfo) +strlen (faultstr) +strlen (errpd->prv) +strlen (errpd->mod) +strlen (errpd->fun) +strlen (errpd->prb) + slop;
libdtrace/dt_handle.c dt_handle_err(dtrace_hdl_t *dtp, dtrace_probedata_t *data) · line 175
Quoted 10 lines
libdtrace/dt_handle.c +0
-5str = (char *)alloca (len); -if (err.dteda_action ==0 ) -sprintf (where,"predicate" ); -else -sprintf (where,"action #%d" , err.dteda_action); -if (err.dteda_offset !=-1 )sprintf (offinfo," at BPF pc %d" , err.dteda_offset);
Pre-existing, but this should probably use asprintf() and avoid the constant size limit. Especially since the sprintf() is potentially dangerous because it should at least have been snprintf().
libdtrace/dt_handle.c no_addr: · line 195
Quoted 4 lines
libdtrace/dt_handle.c +0
-0else @@ -195,11 +194,12 @@ no_addr: details[0 ] =0 ; }
Pre-existing, but this should probably use asprintf() and avoid the constant size limit. Especially since the sprintf() is potentially dangerous because it should at least have been snprintf().
libdtrace/dt_handle.c no_addr: · line 202
Quoted 11 lines
libdtrace/dt_handle.c +5
-4-snprintf (str, len,"error on enabled probe ID %u (ID %u: %s:%s:%s:%s): " -"%s%s in %s%s" , - epid, errpd->id, errpd->prv, errpd->mod, errpd->fun, +snprintf (str, len,"error in %s for probe ID %u (%s:%s:%s:%s): " +"%s%s%s" , + dtp->dt_stmts[stid]->dtsd_clause->di_name, + errpd->id, errpd->prv, errpd->mod, errpd->fun, errpd->prb,dtrace_faultstr (dtp, err.dteda_fault), details, - where, offinfo); + offinfo);
This definitely should use asprintf() (and free the string at the end), because of the potential for buffer overwrite due to the fixed size of len. Yes, in reality we know that all the strings being copied into the output string will be bound correctly, but it is still a risk if someone changing this code and makes a calculation mistake. Using asprintf() will avoid all that.
Also an unsafe indexing of dtp->dt_stmts,
libdtrace/dt_handle.c dt_handle_liberr(dtrace_hdl_t *dtp, const dtrace_probedata_t *data, · line 262
Quoted 13 lines
libdtrace/dt_handle.c +3
-2err.dteda_msg = str;@@ -256,8 +256,9 @@ dt_handle_liberr(dtrace_hdl_t *dtp, const dtrace_probedata_t *data, str =alloca (len);snprintf (str, len, -"error on enabled probe ID %u (ID %u: %s:%s:%s:%s): %s" , - data->dtpda_epid, errpd->id, errpd->prv, errpd->mod, +"error in %s for probe ID %u (%s:%s:%s:%s): %s" , + dtp->dt_stmts[data->dtpda_stid]->dtsd_clause->di_name, + errpd->id, errpd->prv, errpd->mod, errpd->fun, errpd->prb, faultstr);
Same as above... Use asprintf() to avoid the risk of buffer overrun at some point.
Also an unsafe indexing of dtp->dt_stmts,
Quoted 141 lines
libdtrace/dt_handle.c +0
-0err.dteda_msg = str;libdtrace/dt_impl.h +4
-11@@ -271,10 +271,11 @@ struct dtrace_hdl {const char *dt_errtag;/* tag used with last call to dt_set_errmsg() */ dt_pcb_t *dt_pcb;/* pointer to current parsing control block */ ulong_t dt_gen;/* compiler generation number */ -uint_t dt_clause_nextid;/* next ID to use for programs */ +uint_t dt_stmt_nextid;/* next ID to use for statements */ dt_list_t dt_programs;/* linked list of dtrace_prog_t's */ dt_list_t dt_xlators;/* linked list of dt_xlator_t's */ dt_list_t dt_enablings;/* list of (to be) enabled probes */ +dtrace_stmtdesc_t **dt_stmts;/* array of stmts */ struct dt_xlator **dt_xlatormap;/* dt_xlator_t's indexed by dx_id */ id_t dt_xlatorid;/* next dt_xlator_t id to assign */ dt_ident_t *dt_externs;/* linked list of external symbol identifiers */ @@ -341,10 +342,6 @@ struct dtrace_hdl {ctf_id_t dt_type_symaddr;/* cached CTF identifier for _symaddr type */ ctf_id_t dt_type_usymaddr;/* cached CTF ident. for _usymaddr type */ ctf_id_t dt_type_void;/* cached CTF identifier for void type */ -dtrace_epid_t dt_nextepid;/* next enabled probe ID to assign */ -size_t dt_maxprobe;/* max enabled probe ID */ -dtrace_datadesc_t **dt_ddesc;/* probe data descriptions */ -dtrace_probedesc_t **dt_pdesc;/* probe descriptions for enabled prbs */ size_t dt_maxagg;/* max aggregation ID */ dtrace_aggdesc_t **dt_adesc;/* aggregation descriptions */ struct dt_aggregate *dt_aggregate;/* aggregate */ @@ -604,7 +601,7 @@ enum {EDT_DOFFSET ,/* record data offset error */ EDT_DALIGN ,/* record data alignment error */ EDT_DSIZE ,/* record data size error */ -EDT_BADEPID ,/* invalid enabled probe id */ +EDT_BADSTID ,/* invalid statement id */ EDT_BADOPTNAME ,/* invalid dtrace_setopt option name */ EDT_BADOPTVAL ,/* invalid dtrace_setopt option value */ EDT_BADOPTCTX, /* invalid dtrace_setopt option context */@@ -771,11 +768,7 @@ extern dtrace_datadesc_t *dt_datadesc_hold(dtrace_datadesc_t *ddp);extern void dt_datadesc_release (dtrace_hdl_t *,dtrace_datadesc_t *);extern dtrace_datadesc_t *dt_datadesc_create (dtrace_hdl_t *);extern int dt_datadesc_finalize (dtrace_hdl_t *,dtrace_datadesc_t *); -extern dtrace_epid_t dt_epid_add (dtrace_hdl_t *,dtrace_datadesc_t *, -dtrace_id_t ); -extern int dt_epid_lookup (dtrace_hdl_t *,dtrace_epid_t ,dtrace_datadesc_t **, -dtrace_probedesc_t **); -extern void dt_epid_destroy (dtrace_hdl_t *); +extern int dt_stid_lookup (dtrace_hdl_t *,dtrace_stid_t ,dtrace_datadesc_t **);typedef void (*dt_cg_gap_f )(dt_pcb_t *,int );extern uint32_t dt_rec_add (dtrace_hdl_t *,dt_cg_gap_f ,dtrace_actkind_t ,uint32_t ,uint16_t ,dt_pfargv_t *,uint64_t );libdtrace/dt_map.c +2
-77@@ -85,98 +85,18 @@ dt_datadesc_finalize(dtrace_hdl_t *dtp, dtrace_datadesc_t *ddp)return 0 ; } -/* -* Associate a probe data description and probe description with an enabled -* probe ID. This means that the given ID refers to the program matching the -* probe data description being attached to the probe that matches the probe -* description. -*/ -dtrace_epid_t -dt_epid_add (dtrace_hdl_t *dtp,dtrace_datadesc_t *ddp,dtrace_id_t prid) -{ -dtrace_id_t max = dtp->dt_maxprobe; -dtrace_epid_t epid; - - epid = dtp->dt_nextepid++; -if (epid >= max || dtp->dt_ddesc ==NULL ) { -dtrace_id_t nmax = max ? (max <<1 ) :2 ; -dtrace_datadesc_t **nddesc; -dtrace_probedesc_t **npdesc; - - nddesc =dt_calloc (dtp, nmax,sizeof (void *)); - npdesc =dt_calloc (dtp, nmax,sizeof (void *)); -if (nddesc ==NULL || npdesc ==NULL ) { -dt_free (dtp, nddesc); -dt_free (dtp, npdesc); -return dt_set_errno (dtp,EDT_NOMEM ); - } - -if (dtp->dt_ddesc !=NULL ) { -size_t osize = max *sizeof (void *); - -memcpy (nddesc, dtp->dt_ddesc, osize); -dt_free (dtp, dtp->dt_ddesc); -memcpy (npdesc, dtp->dt_pdesc, osize); -dt_free (dtp, dtp->dt_pdesc); - } - - dtp->dt_ddesc = nddesc; - dtp->dt_pdesc = npdesc; - dtp->dt_maxprobe = nmax; - } - -if (dtp->dt_ddesc[epid] !=NULL ) -return epid; - - dtp->dt_ddesc[epid] =dt_datadesc_hold (ddp); - dtp->dt_pdesc[epid] = (dtrace_probedesc_t *)dtp->dt_probes[prid]->desc; - -return epid; -} -int -dt_epid_lookup (dtrace_hdl_t *dtp,dtrace_epid_t epid,dtrace_datadesc_t **ddp, -dtrace_probedesc_t **pdp) +dt_stid_lookup (dtrace_hdl_t *dtp,dtrace_stid_t stid,dtrace_datadesc_t **ddp) { -if (epid >= dtp->dt_maxprobe || - dtp->dt_ddesc[epid] ==NULL || dtp->dt_pdesc[epid] ==NULL ) -return -1 ; - - *ddp = dtp->dt_ddesc[epid]; - *pdp = dtp->dt_pdesc[epid]; - -return 0 ; -} - -void -dt_epid_destroy (dtrace_hdl_t *dtp) -{ -size_t i; - -assert ((dtp->dt_pdesc !=NULL && dtp->dt_ddesc !=NULL && - dtp->dt_maxprobe >0 ) || (dtp->dt_pdesc ==NULL && - dtp->dt_ddesc ==NULL && dtp->dt_maxprobe ==0 )); - -if (dtp->dt_pdesc ==NULL ) -return ; +dtrace_difo_t *rdp; -for (i =0 ; i < dtp->dt_maxprobe; i++) { -if (dtp->dt_ddesc[i] ==NULL ) { -assert (dtp->dt_pdesc[i] ==NULL ); -continue ; - }
libdtrace/dt_map.c dt_datadesc_finalize(dtrace_hdl_t *dtp, dtrace_datadesc_t *ddp) · line 96
Quoted 10 lines
libdtrace/dt_map.c +3
-6- -dt_datadesc_release (dtp, dtp->dt_ddesc[i]); -assert (dtp->dt_pdesc[i] !=NULL ); - } +if (stid >= dtp->dt_stmt_nextid) +return -1 ; -free (dtp->dt_pdesc); - dtp->dt_pdesc =NULL ; + rdp =dt_dlib_get_func_difo (dtp, dtp->dt_stmts[stid]->dtsd_clause);
Unsafe indexing of dtp->dt_stmts,
Quoted 1,095 lines
libdtrace/dt_map.c +2
-4+ *ddp = rdp->dtdo_ddesc; -free (dtp->dt_ddesc); - dtp->dt_ddesc =NULL ; - dtp->dt_nextepid =0 ; - dtp->dt_maxprobe =0 ; +return (*ddp ==NULL ) ?-1 :0 ; }uint32_t libdtrace/dt_open.c +1
-4@@ -170,7 +170,7 @@ static const dt_ident_t _dtrace_globals[] = { {"discard" ,DT_IDENT_ACTFUNC ,0 ,DT_ACT_DISCARD ,DT_ATTR_STABCMN ,DT_VERS_1_0 , &dt_idops_func, "void(int)" }, { "epid", DT_IDENT_SCALAR, 0, DIF_VAR_EPID, DT_ATTR_STABCMN, DT_VERS_1_0, - &dt_idops_type, "uint_t" }, + &dt_idops_type, "uint64_t" }, { "errno", DT_IDENT_SCALAR, 0, DIF_VAR_ERRNO, DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_type, "int" }, { "execname", DT_IDENT_SCALAR, 0, DIF_VAR_EXECNAME,@@ -739,8 +739,6 @@ dt_vopen(int version, int flags, int *errp,dt_proc_hash_create (dtp);dt_proc_signal_init (dtp); dtp->dt_proc_fd =eventfd (0 ,EFD_CLOEXEC |EFD_NONBLOCK ); - dtp->dt_nextepid =1 ; - dtp->dt_maxprobe =0 ;if (dt_aggregate_init (dtp) ==-1 )return set_open_errno (dtp, errp,dtrace_errno (dtp)); dtp->dt_vmax =DT_VERS_LATEST ;@@ -1303,7 +1301,6 @@ dtrace_close(dtrace_hdl_t *dtp)if (dtp->dt_poll_fd !=-1 )close (dtp->dt_poll_fd); -dt_epid_destroy (dtp);dt_aggid_destroy (dtp);dt_buffered_destroy (dtp);dt_aggregate_destroy (dtp);libdtrace/dt_program.c +8
-1@@ -100,7 +100,7 @@ dtrace_program_info(dtrace_hdl_t *dtp, dtrace_prog_t *pgp,/* * If there aren't any actions, account for the fact that -* recording the epid will generate a record. +* the default action will generate a record. */ dp =dt_dlib_get_func_difo (dtp, stp->ds_desc->dtsd_clause);if (dp !=NULL )@@ -165,6 +165,13 @@ dt_prog_stmt(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, dtrace_stmtdesc_t *sdp,dtrace_probedesc_t *pdp = &sdp->dtsd_ecbdesc->dted_probe;int rc; +if (dtp->dt_stmts ==NULL ) { + dtp->dt_stmts =dt_calloc (dtp, dtp->dt_stmt_nextid,sizeof (dtrace_stmtdesc_t *)); +if (dtp->dt_stmts ==NULL ) +return dt_set_errno (dtp,EDT_NOMEM ); + } + dtp->dt_stmts[sdp->dtsd_id] = sdp; + st.cnt = cnt; st.sdp = sdp; rc =dt_probe_iter (dtp, pdp, (dt_probe_f *)dt_stmt_probe,NULL , &st);libdtrace/dtrace.h +2
-1@@ -150,6 +150,7 @@ typedef struct dtrace_stmtdesc {dtrace_attribute_t dtsd_descattr;/* probedesc attributes */ dtrace_attribute_t dtsd_stmtattr;/* statement attributes */ int dtsd_clauseflags;/* clause flags */ +int dtsd_id;/* index in dtp->dt_stmts */ } dtrace_stmtdesc_t;/* dtsd clause flags */ @@ -189,7 +190,7 @@ typedef enum { typedef struct dtrace_probedata { dtrace_hdl_t *dtpda_handle; /* handle to DTrace library */ - dtrace_epid_t dtpda_epid; /* enabled probe ID */ + dtrace_stid_t dtpda_stid; /* statement ID */ dtrace_datadesc_t *dtpda_ddesc; /* probe data description */ dtrace_probedesc_t *dtpda_pdesc; /* probe description */ unsigned int dtpda_cpu; /* CPU for data */test/demo/builtin/eipd.d deleted +0
-4@@ -1,4 +0,0 @@ -BEGIN { - trace(epid); - exit(0); -}test/demo/dtrace/error.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/demo/dtrace/error.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/demo/spec/specopen.d +2
-3@@ -2,7 +2,7 @@ /* * Oracle Linux DTrace. - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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. */@@ -33,8 +33,7 @@ fbt::: /self->spec/ { /* - * A speculate() with no other actions speculates the default action: - * tracing the EPID. + * A speculate() with no other actions speculates the default action. */ speculate(self->spec); }test/stress/buffering/tst.resize3-manual.d +1
-1@@ -31,7 +31,7 @@ BEGIN BEGIN { speculate(spec); - trace(epid); + trace(12345678); } BEGINtest/stress/buffering/tst.resize3-manual.r +1
-1@@ -1,5 +1,5 @@ FUNCTION:NAME - :BEGIN 3 + :BEGIN 12345678 :BEGIN -- @@stderr --test/stress/buffering/tst.resize3.d +1
-1@@ -27,7 +27,7 @@ BEGIN BEGIN { speculate(spec); - trace(epid); + trace(12345678); } BEGINtest/stress/buffering/tst.resize3.r +1
-1@@ -1,5 +1,5 @@ FUNCTION:NAME - :BEGIN 3 + :BEGIN 12345678 :BEGIN -- @@stderr --test/unittest/actions/setopt/tst.badopt.r +7
-7@@ -1,16 +1,16 @@ -- @@stderr -- -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "Nixon" to "1": Invalid option name +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "Nixon" to "1": Invalid option name -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "Harding" to "1": Invalid option name +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "Harding" to "1": Invalid option name -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "Hoover" to "1": Invalid option name +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "Hoover" to "1": Invalid option name -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "Bush" to "1": Invalid option name +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "Bush" to "1": Invalid option name -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "quiet" to "um, no": Invalid value for specified option +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "quiet" to "um, no": Invalid value for specified option -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "aggrate" to "0.5hz": Invalid value for specified option +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "aggrate" to "0.5hz": Invalid value for specified option -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "bufsize" to "1m": Operation illegal when tracing is active +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "bufsize" to "1m": Operation illegal when tracing is activetest/unittest/arrays/tst.declared-bounds.runtime_out.r +1
-1@@ -1,3 +1,3 @@ expected run-time error -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): index out of bounds (8) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): index out of bounds (8) at BPF pc NNNtest/unittest/codegen/err.deref_0.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (0) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address (0) at BPF pc NNNtest/unittest/codegen/err.deref_1.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (1) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNNtest/unittest/codegen/err.deref_i0.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (0) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address (0) at BPF pc NNNtest/unittest/codegen/err.deref_i1.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (1) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNNtest/unittest/codegen/err.deref_string-assoc.r +1
-1@@ -1,3 +1,3 @@ 66 -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address (1) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNNtest/unittest/codegen/err.deref_string-gvar.r +1
-1@@ -1,3 +1,3 @@ 66 -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address (1) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNNtest/unittest/codegen/err.deref_string-lvar.r +1
-1@@ -1,3 +1,3 @@ 66 -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address (1) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNNtest/unittest/codegen/err.deref_string-tvar.r +1
-1@@ -1,3 +1,3 @@ 66 -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address (1) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNNtest/unittest/codegen/err.str_NULL_plus_offset-assoc.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/codegen/err.str_NULL_plus_offset-lvar.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/codegen/err.str_NULL_plus_offset-tvar.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/codegen/err.str_NULL_plus_offset.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/disasm/tst.vartab-bvar.r +1
-1@@ -4,7 +4,7 @@ curthread scl glb r D type (pointer) (size 8) timestamp scl glb r D type (integer) (size 8) vtimestamp scl glb r D type (integer) (size 8) ipl scl glb r D type (integer) (size 4) -epid scl glb r D type (integer) (size 4) +epid scl glb r D type (integer) (size 8) id scl glb r D type (integer) (size 4) arg0 scl glb r D type (integer) (size 8) arg1 scl glb r D type (integer) (size 8)test/unittest/drops/drp.DTRACEDROP_DBLERROR.r +1
-1@@ -4,4 +4,4 @@ -- @@stderr -- dtrace: script 'test/unittest/drops/drp.DTRACEDROP_DBLERROR.d' matched 3 probes dtrace: [DTRACEDROP_DBLERROR] 1 error in ERROR probe enabling -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.d +3
-3@@ -1,6 +1,6 @@ /* * Oracle Linux DTrace. - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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. */@@ -15,13 +15,13 @@ BEGIN { - myepid = epid; + myid = id; trace(((struct task_struct *)NULL)->pid); exit(1); } ERROR { - exit(arg1 != myepid || arg2 != 1 || arg4 != DTRACEFLT_BADADDR || + exit(arg1 != myid || arg2 != 0 || arg4 != DTRACEFLT_BADADDR || arg5 != 0); }test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.DTRACEFLT_BADADDR.r +2
-2@@ -1,6 +1,6 @@ -The arguments are 3 1 1 0 +The arguments are 1 1 1 0 The value of arg4 should be 1 The value of arg5 should be 0 -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.DTRACEFLT_BADADDR2.r +2
-2@@ -1,6 +1,6 @@ -The arguments are 3 1 1 16384 +The arguments are 1 1 1 16384 The value of arg4 should be 1 The value of arg5 should be 16384 -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.DTRACEFLT_DIVZERO.div.d +8
-3@@ -1,6 +1,6 @@ /* * Oracle Linux DTrace. - * Copyright (c) 2006, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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. */@@ -13,9 +13,14 @@ #pragma D option quiet +BEGIN { myid = id } /* clause 0 */ +BEGIN { myid = id } /* clause 1 */ +BEGIN { myid = id } /* clause 2 */ +BEGIN { myid = id } /* clause 3 */ + BEGIN { - myepid = epid; + myid = id; i = 1; j = 2; j = i / (j - 2);@@ -24,6 +29,6 @@ BEGIN ERROR { - exit(arg1 != myepid || arg2 != 1 || arg4 != DTRACEFLT_DIVZERO || + exit(arg1 != myid || arg2 != 4 || arg4 != DTRACEFLT_DIVZERO || arg5 != 0); }test/unittest/error/tst.DTRACEFLT_DIVZERO.div.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): divide-by-zero in action #1 at BPF pc NNN +dtrace: error in dt_clause_4 for probe ID 1 (dtrace:::BEGIN): divide-by-zero at BPF pc NNNtest/unittest/error/tst.DTRACEFLT_DIVZERO.mod.d +8
-3@@ -1,6 +1,6 @@ /* * Oracle Linux DTrace. - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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. */@@ -13,9 +13,14 @@ #pragma D option quiet +BEGIN { myid = id; } /* clause 0 */ +BEGIN { myid = id; } /* clause 1 */ +BEGIN { myid = id; } /* clause 2 */ +BEGIN { myid = id; } /* clause 3 */ + BEGIN { - myepid = epid; + myid = id; i = 1; j = 2; j = i % (j - 2);@@ -24,6 +29,6 @@ BEGIN ERROR { - exit(arg1 != myepid || arg2 != 1 || arg4 != DTRACEFLT_DIVZERO || + exit(arg1 != myid || arg2 != 4 || arg4 != DTRACEFLT_DIVZERO || arg5 != 0); }test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): divide-by-zero in action #1 at BPF pc NNN +dtrace: error in dt_clause_4 for probe ID 1 (dtrace:::BEGIN): divide-by-zero at BPF pc NNNtest/unittest/error/tst.DTRACEFLT_UNKNOWN.r +2
-2@@ -1,5 +1,5 @@ -The arguments are 3 1 PC 1 64 +The arguments are 1 1 PC 1 64 The value of arg4 = 0 -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.clause_scope-begin-ended.r +1
-1@@ -2,4 +2,4 @@ Error fired Clause executed -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.clause_scope-begin.r +1
-1@@ -2,4 +2,4 @@ Error fired Clause executed -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.clause_scope-regular.r +1
-1@@ -2,4 +2,4 @@ Error fired Clause executed -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID nnn: profile:::tick-10ms): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID nnn (profile:::tick-10ms): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.clause_scope-regular.r.p +6
-2@@ -1,3 +1,7 @@ -#!/bin/sed -f +#!/usr/bin/awk -f + # This report has a variable probe ID in it. -s/ID [0-9][0-9]*: profile/ID nnn: profile/ +{ + sub("for probe ID [0-9][0-9]* .profile", "for probe ID nnn (profile"); + print; +}test/unittest/error/tst.error.r +1
-1@@ -1,4 +1,4 @@ Error fired -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.errorend.r +1
-1@@ -2,4 +2,4 @@ Error fired End fired after exit -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_2 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-bcopy-before-beyond.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-bcopy-before-bottom.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-bcopy-beyond-top.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-bcopy-crossing-bottom.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-bcopy-crossing-top.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-crossing-clauses.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-load-before-bottom.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-load-beyond-top.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-load-crossing-bottom.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-null-deref-lvalue.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-null-deref.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-scratch-exceeding-bcopy.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-store-before-bottom.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-store-beyond-top.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-store-crossing-bottom.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/bcopy/err.badbcopy1.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/bcopy/err.badbcopy4.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/bcopy/err.badbcopy5.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/bcopy/err.badbcopy6.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNNtest/unittest/funcs/bcopy/err.badbcopy7.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNNtest/unittest/funcs/bcopy/err.badbcopy8.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNNtest/unittest/funcs/copyin/err.badaddr.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyin/err.badaddr.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/copyin/err.null_arg1.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyin/err.null_arg1.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/copyinstr/err.badaddr.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyinstr/err.badaddr.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/copyinstr/err.null_arg1.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyinstr/err.null_arg1.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/copyinto/err.badaddr.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyinto/err.badaddr.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/copyinto/err.badsize.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyinto/err.badsize.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNNtest/unittest/funcs/copyinto/err.null_arg1.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyinto/err.null_arg1.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/err.badalloca.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID NNN: profile:::tick-1): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID NNN (profile:::tick-1): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/err.badalloca.r.p +6
-2@@ -1,3 +1,7 @@ -#!/bin/sed -f +#!/usr/bin/awk -f -s/(ID [0-9]*/(ID NNN/g +# This report has a variable probe ID in it. +{ + sub("for probe ID [0-9]* .profile", "for probe ID NNN (profile"); + print; +}test/unittest/funcs/err.link_ntopbadaddr.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/err.link_ntopbadarg.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): illegal operation in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): illegal operation at BPF pc NNNtest/unittest/funcs/inet_ntoa6/err.inet_ntoa6.arg1_null.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/inet_ntoa6/err.inet_ntoa6.arg1_null_const.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/strlen/tst.null.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/strtok/tst.strtok_null.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/strtok/tst.strtok_null.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/strtok/tst.strtok_nulldel.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/strtok/tst.strtok_nulldel.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/strtok/tst.strtok_nullstr.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/strtok/tst.strtok_nullstr.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/strtok/tst.strtok_nullstr2.r +1
-1@@ -4,4 +4,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/strtok/tst.strtok_nullstr2.d' matched 4 probes -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/substr/err.substr_null_arg1.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/pointers/err.AllocaOverrun.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/pointers/err.BadAlign.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/pointers/err.InvalidAddress2.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/pointers/err.InvalidAddress4.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/speculation/err.CommitWithInvalid.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): illegal operation in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): illegal operation at BPF pc NNNtest/unittest/speculation/err.DiscardWithInvalid.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): illegal operation in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): illegal operation at BPF pc NNNtest/unittest/speculation/tst.SpecSizeVariations.r +0
-22@@ -11,26 +11,6 @@ Speculative buffer ID: 1 123456706 counts: 1 1 -Speculative buffer ID: 1 -123456700 -123456701 -123456702 -123456703 -123456704 -123456705 -123456706 -counts: 1 1 - -Speculative buffer ID: 1 -123456700 -123456701 -123456702 -123456703 -123456704 -123456705 -123456706 -counts: 2 1 - Speculative buffer ID: 1 123456700 123456701@@ -64,5 +44,3 @@ counts: 2 1 dtrace: 2 speculative drops dtrace: 1 speculative drop dtrace: 1 speculative drop -dtrace: 1 speculative drop -dtrace: 1 speculative droptest/unittest/speculation/tst.SpecSizeVariations.sh +1
-1@@ -9,7 +9,7 @@ dtrace=$1 -for x in 63 64 79 80 143 144; do +for x in 71 72 159 160; do $dtrace $dt_flags -xspecsize=$x -qn ' BEGIN {test/unittest/speculation/tst.negcommit.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/speculation/tst.negcommit.d' matched 2 probes -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): illegal operation in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): illegal operation at BPF pc NNNtest/unittest/variables/bvar/tst.arg3-ERROR-b.sh +1
-1@@ -59,7 +59,7 @@ awk 'BEGIN { next; } - /error on enabled probe/ { + /error in dt_clause_/ { if (!($NF in sites)) { print; print " No call to dt_probe_error found at PC " $NF;test/unittest/variables/bvar/tst.arg3-ERROR.sh +1
-1@@ -120,7 +120,7 @@ done # Do a sanity check on DTrace's error output. -awk '/^dtrace: error on enabled probe ID [0-9]* \(ID 1: dtrace:::BEGIN): invalid address \(0x40) in action #[0-9] at BPF pc [0-9]*$/ { print $NF }' \ +awk '/^dtrace: error in dt_clause_[1-4] for probe ID 1 \(dtrace:::BEGIN): invalid address \(0x40) at BPF pc [0-9]*$/ { print $NF }' \ disasm.out > err_pcs.txt.chk1 if ! diff -q err_pcs.txt err_pcs.txt.chk1; then echo ERROR: problem with DTrace error outputSignature · 1 line
2.43.5
Quoted 991 lines · Kris Van Hees
Great patch. Found a few smallish things though that we probably want to address before putting this in (potential risks for buffer overruns).
Also, because
dt_stmtsis constructed from the programs being presented for loading by the consumer (which is a 2nd step after the consumer uses libdtrace to compile the statements), it is technically possible that not all elements indt_stmtswill be filled in. There is no guarantee that a consumer will present every compiled program for loading (though in practice that is of course not going to happen).But since libdtrace allows this by design, every indexing of
dt_stmts(there are only a few - marked below) should first make sure that the element is not NULL.Quoted 976 lines · On Tue, Sep 17, 2024 at 02:08:12PM -0400, [email protected] wrote:
From: Eugene Loh <[email protected]>
Historically, the enabled probe id (epid) was an integer, passed from producer to consumer, that uniquely identified probe ID and statement (data description). It was used in error reporting and was available to D users via a built-in variable "epid".
However, its value was opaque to users and difficult to use.
Deprecate the use of EPID:
*) Have the producer pass to the consumer the probe ID and statement
ID explicitly, instead of passing an opaque integer that requires additional lookup tables.*) Keep an array dt_stmts[] of statements, from which we can retrieve
probe descriptions and data descriptions.*) Remove data structures related to epid: dt_ddesc[], dt_pdesc[],
dt_nextepid,dt_maxprobe, etc.Nevertheless, continue to provide a value for the built-in "epid" variable for back compatability. Expand the epid from 4 bytes to 8 bytes: the upper half is the probe ID and the lower half the statement ID.
The output buffer (written by the producer, read by the consumer) is rearranged slightly. Note that:
*) It starts with a 4-byte size, which
perf_eventwrites.*) The beginning of the output buffer should have 8-byte alignment.
*) The beginning of the trace data within the output buffer should
also have 8-byte alignment.*) So we rearrange as follows:
old new
0: pad / size pad / size <==
4: pad specid
8: epid <== prid
12: specid stid
16: data[n] data[n]The arrow <== indicates where the buffer starts.
For error reporting:
*) Report errors in terms of the probe ID (and description) and the
clause function name, which is decipherable in terms of the disassembly output. Specifically, change ERROR-probe arguments:-) arg1 changes from epid to the probe ID
-) arg2 changes from "clause index" (which is no longer needed)
to the statement ID that identifies the clause named in disassembly output*) No longer report the "action number", which has lost much of its
meaning in the port to eBPF. Nonetheless, keepdteda_action; its value is not used, but set the value to stid for possible future use.Signed-off-by Eugene Loh <[email protected]>--- bpf/get_bvar.c | 5 +- bpf/probe_error.c | 8 +- include/dtrace/metadesc.h | 4 +- include/dtrace/universal.h | 3 +- libdtrace/dt_bpf.c | 2 - libdtrace/dt_bpf.h | 46 +++++---- libdtrace/dt_cc.c | 47 +++------- libdtrace/dt_cg.c | 49 +++++----- libdtrace/dt_consume.c | 85 +++++++++-------- libdtrace/dt_dctx.h | 21 +++-- libdtrace/dt_dlibs.c | 2 - libdtrace/dt_error.c | 2 +- libdtrace/dt_handle.c | 41 ++++---- libdtrace/dt_impl.h | 15 +-- libdtrace/dt_map.c | 94 ++----------------- libdtrace/dt_open.c | 5 +- libdtrace/dt_program.c | 9 +- libdtrace/dtrace.h | 3 +- test/demo/builtin/eipd.d | 4 - test/demo/dtrace/error.r | 2 +- test/demo/spec/specopen.d | 5 +- test/stress/buffering/tst.resize3-manual.d | 2 +- test/stress/buffering/tst.resize3-manual.r | 2 +- test/stress/buffering/tst.resize3.d | 2 +- test/stress/buffering/tst.resize3.r | 2 +- test/unittest/actions/setopt/tst.badopt.r | 14 +-- .../arrays/tst.declared-bounds.runtime_out.r | 2 +- test/unittest/codegen/err.deref_0.r | 2 +- test/unittest/codegen/err.deref_1.r | 2 +- test/unittest/codegen/err.deref_i0.r | 2 +- test/unittest/codegen/err.deref_i1.r | 2 +- .../unittest/codegen/err.deref_string-assoc.r | 2 +- test/unittest/codegen/err.deref_string-gvar.r | 2 +- test/unittest/codegen/err.deref_string-lvar.r | 2 +- test/unittest/codegen/err.deref_string-tvar.r | 2 +- .../codegen/err.str_NULL_plus_offset-assoc.r | 2 +- .../codegen/err.str_NULL_plus_offset-lvar.r | 2 +- .../codegen/err.str_NULL_plus_offset-tvar.r | 2 +- .../codegen/err.str_NULL_plus_offset.r | 2 +- test/unittest/disasm/tst.vartab-bvar.r | 2 +- test/unittest/drops/drp.DTRACEDROP_DBLERROR.r | 2 +- .../tst.DTRACEFLT_BADADDR.null_ptr_field.d | 6 +- .../tst.DTRACEFLT_BADADDR.null_ptr_field.r | 2 +- test/unittest/error/tst.DTRACEFLT_BADADDR.r | 4 +- test/unittest/error/tst.DTRACEFLT_BADADDR2.r | 4 +- .../error/tst.DTRACEFLT_DIVZERO.div.d | 11 ++- .../error/tst.DTRACEFLT_DIVZERO.div.r | 2 +- .../error/tst.DTRACEFLT_DIVZERO.mod.d | 11 ++- .../error/tst.DTRACEFLT_DIVZERO.mod.r | 2 +- test/unittest/error/tst.DTRACEFLT_UNKNOWN.r | 4 +- .../error/tst.clause_scope-begin-ended.r | 2 +- test/unittest/error/tst.clause_scope-begin.r | 2 +- .../unittest/error/tst.clause_scope-regular.r | 2 +- .../error/tst.clause_scope-regular.r.p | 8 +- test/unittest/error/tst.error.r | 2 +- test/unittest/error/tst.errorend.r | 2 +- .../alloca/err.alloca-bcopy-before-beyond.r | 2 +- .../alloca/err.alloca-bcopy-before-bottom.r | 2 +- .../alloca/err.alloca-bcopy-beyond-top.r | 2 +- .../alloca/err.alloca-bcopy-crossing-bottom.r | 2 +- .../alloca/err.alloca-bcopy-crossing-top.r | 2 +- .../alloca/err.alloca-crossing-clauses.r | 2 +- .../alloca/err.alloca-load-before-bottom.r | 2 +- .../funcs/alloca/err.alloca-load-beyond-top.r | 2 +- .../alloca/err.alloca-load-crossing-bottom.r | 2 +- .../alloca/err.alloca-null-deref-lvalue.r | 2 +- .../funcs/alloca/err.alloca-null-deref.r | 2 +- .../err.alloca-scratch-exceeding-bcopy.r | 2 +- .../alloca/err.alloca-store-before-bottom.r | 2 +- .../alloca/err.alloca-store-beyond-top.r | 2 +- .../alloca/err.alloca-store-crossing-bottom.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy1.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy4.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy5.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy6.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy7.r | 2 +- test/unittest/funcs/bcopy/err.badbcopy8.r | 2 +- test/unittest/funcs/copyin/err.badaddr.r | 2 +- test/unittest/funcs/copyin/err.null_arg1.r | 2 +- test/unittest/funcs/copyinstr/err.badaddr.r | 2 +- test/unittest/funcs/copyinstr/err.null_arg1.r | 2 +- test/unittest/funcs/copyinto/err.badaddr.r | 2 +- test/unittest/funcs/copyinto/err.badsize.r | 2 +- test/unittest/funcs/copyinto/err.null_arg1.r | 2 +- test/unittest/funcs/err.badalloca.r | 2 +- test/unittest/funcs/err.badalloca.r.p | 8 +- test/unittest/funcs/err.link_ntopbadaddr.r | 2 +- test/unittest/funcs/err.link_ntopbadarg.r | 2 +- .../inet_ntoa6/err.inet_ntoa6.arg1_null.r | 2 +- .../err.inet_ntoa6.arg1_null_const.r | 2 +- test/unittest/funcs/strlen/tst.null.r | 2 +- test/unittest/funcs/strtok/tst.strtok_null.r | 2 +- .../funcs/strtok/tst.strtok_nulldel.r | 2 +- .../funcs/strtok/tst.strtok_nullstr.r | 2 +- .../funcs/strtok/tst.strtok_nullstr2.r | 2 +- .../funcs/substr/err.substr_null_arg1.r | 2 +- test/unittest/pointers/err.AllocaOverrun.r | 2 +- test/unittest/pointers/err.BadAlign.r | 2 +- test/unittest/pointers/err.InvalidAddress2.r | 2 +- test/unittest/pointers/err.InvalidAddress4.r | 2 +- .../speculation/err.CommitWithInvalid.r | 2 +- .../speculation/err.DiscardWithInvalid.r | 2 +- .../speculation/tst.SpecSizeVariations.r | 22 ----- .../speculation/tst.SpecSizeVariations.sh | 2 +- test/unittest/speculation/tst.negcommit.r | 2 +- .../variables/bvar/tst.arg3-ERROR-b.sh | 2 +- .../unittest/variables/bvar/tst.arg3-ERROR.sh | 2 +- 107 files changed, 292 insertions(+), 404 deletions(-) delete mode 100644 test/demo/builtin/eipd.dbpf/get_bvar.c +3
-2@@ -48,8 +48,9 @@ noinline uint64_t dt_get_bvar(const dt_dctx_t *dctx, uint32_t id, uint32_t idx) mst->tstamp =bpf_ktime_get_ns ();return mst->tstamp; -case DIF_VAR_EPID : -return mst->epid; +case DIF_VAR_EPID : { +return (((uint64_t )mst->prid) <<32 ) | mst->stid; + }case DIF_VAR_ID :return mst->prid;case DIF_VAR_ARG0 :case DIF_VAR_ARG1 :case DIF_VAR_ARG2 :bpf/probe_error.c +4
-4@@ -16,8 +16,8 @@ extern int64_t dt_error(const dt_dctx_t *dctx);/* * DTrace ERROR probes provide 6 arguments: * arg0 = always NULL (used to be kernel consumer state pointer) -* arg1 = EPID of probe that triggered the fault -* arg2 = clause index of code that triggered the fault +* arg1 = probe ID that triggered the fault +* arg2 = statement ID that triggered the fault * arg3 = BPF offset in the clause that triggered the fault (or -1) * arg4 = fault type * arg5 = fault-specific value (usually address being accessed or 0) @@ -30,8 +30,8 @@ noinline void dt_probe_error(const dt_dctx_t *dctx, uint64_t pc, uint64_t fault,__builtin_memcpy (mst->saved_argv, mst->argv,sizeof (mst->saved_argv)); mst->argv[0 ] =0 ; - mst->argv[1 ] = mst->epid; - mst->argv[2 ] = mst->clid; + mst->argv[1 ] = mst->prid; + mst->argv[2 ] = mst->stid; mst->argv[3 ] = pc; mst->argv[4 ] = fault; mst->argv[5 ] = illval;include/dtrace/metadesc.h +2
-2@@ -19,8 +19,8 @@/* * DTrace separates the trace data stream from the metadata stream. The only -* metadata tokens placed in the data stream are enabled probe identifiers -* (EPIDs) or (in the case of aggregations) aggregation identifiers. In order +* metadata tokens placed in the data stream are probe and statement identifiers +* or (in the case of aggregations) aggregation identifiers. In order * to determine the structure of the data, DTrace uses the token to perform a * lookup to retrieve the corresponding description of the enabled probe (via * the dtrace_datadesc structure) or the aggregation (via the dtrace_aggdesc include/dtrace/universal.h +1
-2@@ -17,7 +17,6 @@#define DTRACE_CPUALL -1/* all CPUs */ #define DTRACE_IDNONE 0/* invalid probe identifier */ -#define DTRACE_EPIDNONE 0/* invalid enabled probe identifier */ #define DTRACE_AGGIDNONE 0/* invalid aggregation identifier */ #define DTRACE_AGGVARIDNONE 0/* invalid aggregation variable ID */ #define DTRACE_CACHEIDNONE 0/* invalid predicate cache */ @@ -37,7 +36,7 @@ typedef uint16_t dtrace_actkind_t; /* action kind */typedef uint32_t dtrace_aggid_t ;/* aggregation identifier */ typedef uint32_t dtrace_cacheid_t ;/* predicate cache identifier */ -typedef uint32_t dtrace_epid_t ;/* enabled probe identifier */ +typedef uint32_t dtrace_stid_t ;/* statement identifier */ typedef uint32_t dtrace_optid_t ;/* option identifier */ typedef uint32_t dtrace_specid_t ;/* speculation identifier */ libdtrace/dt_bpf.c +0
-2@@ -774,7 +774,6 @@ gmap_create_cpuinfo(dtrace_hdl_t *dtp)* The size of the memory region is the sum of: * - size of the DTrace machine state, rounded up to the nearest * multiple of 8 -* - 8 bytes padding for trace buffer alignment purposes * - maximum trace buffer record size, rounded up to the nearest * multiple of 8 * - size of dctx->mem (see dt_dctx.h) @@ -783,7 +782,6 @@ static int gmap_create_mem(dtrace_hdl_t *dtp) {size_t sz =roundup (sizeof (dt_mstate_t),8 ) + -8 +roundup (dtp->dt_maxreclen,8 ) +DMEM_SIZE (dtp);libdtrace/dt_bpf.h +22
-24@@ -32,30 +32,28 @@ extern "C" { (dtp)->dt_bpffeatures |= (feat); \ } while (0) -#define DT_CONST_EPID 1 -#define DT_CONST_PRID 2 -#define DT_CONST_CLID 3 -#define DT_CONST_ARGC 4 -#define DT_CONST_STBSZ 5 -#define DT_CONST_STRSZ 6 -#define DT_CONST_STKSIZ 7 -#define DT_CONST_BOOTTM 8 -#define DT_CONST_NSPEC 9 -#define DT_CONST_NCPUS 10 -#define DT_CONST_PC 11 -#define DT_CONST_TUPSZ 12 -#define DT_CONST_TASK_PID 13 -#define DT_CONST_TASK_TGID 14 -#define DT_CONST_TASK_REAL_PARENT 15 -#define DT_CONST_TASK_COMM 16 -#define DT_CONST_MUTEX_OWNER 17 -#define DT_CONST_RWLOCK_CNTS 18 -#define DT_CONST_DCTX_RODATA 19 -#define DT_CONST_RODATA_OFF 20 -#define DT_CONST_RODATA_SIZE 21 -#define DT_CONST_ZERO_OFF 22 -#define DT_CONST_STACK_OFF 23 -#define DT_CONST_STACK_SKIP 24 +#define DT_CONST_PRID 1 +#define DT_CONST_ARGC 2 +#define DT_CONST_STBSZ 3 +#define DT_CONST_STRSZ 4 +#define DT_CONST_STKSIZ 5 +#define DT_CONST_BOOTTM 6 +#define DT_CONST_NSPEC 7 +#define DT_CONST_NCPUS 8 +#define DT_CONST_PC 9 +#define DT_CONST_TUPSZ 10 +#define DT_CONST_TASK_PID 11 +#define DT_CONST_TASK_TGID 12 +#define DT_CONST_TASK_REAL_PARENT 13 +#define DT_CONST_TASK_COMM 14 +#define DT_CONST_MUTEX_OWNER 15 +#define DT_CONST_RWLOCK_CNTS 16 +#define DT_CONST_DCTX_RODATA 17 +#define DT_CONST_RODATA_OFF 18 +#define DT_CONST_RODATA_SIZE 19 +#define DT_CONST_ZERO_OFF 20 +#define DT_CONST_STACK_OFF 21 +#define DT_CONST_STACK_SKIP 22#define DT_BPF_LOG_SIZE_DEFAULT (UINT32_MAX >> 8)#define DT_BPF_LOG_SIZE_SMALL 4096libdtrace/dt_cc.c +12
-35@@ -123,6 +123,7 @@ dt_stmt_create(dtrace_hdl_t *dtp, dtrace_ecbdesc_t *edp,if (sdp ==NULL )longjmp (yypcb->pcb_jmpbuf,EDT_NOMEM ); + sdp->dtsd_id = dtp->dt_stmt_nextid++;assert (yypcb->pcb_stmt ==NULL ); yypcb->pcb_stmt = sdp; yypcb->pcb_maxrecs =0 ;@@ -130,11 +131,10 @@ dt_stmt_create(dtrace_hdl_t *dtp, dtrace_ecbdesc_t *edp,return sdp; } -static dt_ident_t * -dt_clause_create (dtrace_hdl_t *dtp,dtrace_difo_t *dp) +static void +dt_stmt_set_clause (dtrace_hdl_t *dtp,dtrace_difo_t *dp,dtrace_stmtdesc_t *sdp) {char *name; -int len;dt_ident_t *idp;/* @@ -153,25 +153,21 @@ dt_clause_create(dtrace_hdl_t *dtp, dtrace_difo_t *dp)/* * Generate a symbol name. */ - len =snprintf (NULL ,0 ,"dt_clause_%d" , dtp->dt_clause_nextid) +1 ; - name =dt_alloc (dtp, len); -if (name ==NULL ) +if (asprintf (&name,"dt_clause_%d" , sdp->dtsd_id) <0 )longjmp (yypcb->pcb_jmpbuf,EDT_NOMEM ); -snprintf (name, len,"dt_clause_%d" , dtp->dt_clause_nextid++); -/* * Add the symbol to the BPF identifier table and associate the DIFO * with the symbol. */ idp =dt_dlib_add_func (dtp, name); -dt_free (dtp, name); +free (name);if (idp ==NULL )longjmp (yypcb->pcb_jmpbuf,EDT_NOMEM );dt_ident_set_data (idp, dp); -return idp; + sdp->dtsd_clause = idp; } static void@@ -211,7 +207,7 @@ dt_compile_one_clause(dtrace_hdl_t *dtp, dt_node_t *cnp, dt_node_t *pnp)* Compile the clause (predicate and action). */ dt_cg (yypcb, cnp); - sdp->dtsd_clause =dt_clause_create (dtp,dt_as (yypcb)); +dt_stmt_set_clause (dtp,dt_as (yypcb), sdp);assert (yypcb->pcb_stmt == sdp);if (dtrace_stmt_add (yypcb->pcb_hdl, yypcb->pcb_prog, sdp) !=0 )@@ -944,7 +940,7 @@ static int get_boottime() {static int dt_link_construct (dtrace_hdl_t *dtp,const dt_probe_t *prp,dtrace_difo_t *dp,dt_ident_t *idp,const dtrace_difo_t *sdp,uint_t *pcp, -uint_t *rcp,uint_t *vcp,dtrace_epid_t epid,uint_t clid) +uint_t *rcp,uint_t *vcp) {uint_t pc = *pcp;uint_t rc = *rcp;@@ -955,7 +951,6 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,uint_t len = sdp->dtdo_brelen;const dof_relodesc_t *rp = sdp->dtdo_breltab;dof_relodesc_t *nrp = &dp->dtdo_breltab[rc]; -dtrace_id_t prid = prp->desc->id;int no_deps =0 ;if (idp !=NULL ) {@@ -1026,7 +1021,6 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,for (; len !=0 ; len--, rp++, nrp++) {const char *name =dt_difo_getstr (sdp, rp->dofr_name);dtrace_difo_t *rdp; -dtrace_epid_t nepid;int ipc; idp =dt_dlib_get_sym (dtp, name);@@ -1041,15 +1035,9 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp, }switch (idp->di_id) { -case DT_CONST_EPID : - nrp->dofr_data = epid; -continue ;case DT_CONST_PRID : nrp->dofr_data = prp->desc->id;continue ; -case DT_CONST_CLID : - nrp->dofr_data = clid; -continue ;case DT_CONST_ARGC : nrp->dofr_data =0 ;/* FIXME */ continue ;@@ -1193,11 +1181,6 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,case DT_CONST_STACK_SKIP : nrp->dofr_data = prp->prov->impl->stack_skip;continue ; -default : -/* probe name -> value is probe id */ -if (strchr (idp->di_name,':' ) !=NULL ) - prid = rp->dofr_data; -continue ; }continue ;@@ -1213,13 +1196,8 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp, rdp =dt_dlib_get_func_difo (dtp, idp);if (rdp ==NULL )return -1 ; -if (rdp->dtdo_ddesc !=NULL ) { - nepid =dt_epid_add (dtp, rdp->dtdo_ddesc, prid); - clid++; - }else - nepid =0 ; ipc =dt_link_construct (dtp, prp, dp, idp, rdp, pcp, - rcp, vcp, nepid, clid); + rcp, vcp);if (ipc ==-1 )return -1 ;@@ -1260,8 +1238,8 @@ dt_link_resolve(dtrace_hdl_t *dtp, dtrace_difo_t *dp)continue ;/* -* We are only relocating constants (EPID and ARGC) and call -* instructions to functions that have been linked in. +* We are only relocating constants and call instructions to +* functions that have been linked in. */ switch (idp->di_kind) {case DT_IDENT_SCALAR :@@ -1333,8 +1311,7 @@ dt_link(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,*/ insc = relc = varc =0 ; - rc =dt_link_construct (dtp, prp, fdp, idp, dp, &insc, &relc, &varc,0 , -0 ); + rc =dt_link_construct (dtp, prp, fdp, idp, dp, &insc, &relc, &varc);dt_dlib_reset (dtp,B_FALSE );if (rc ==-1 ) goto fail;libdtrace/dt_cg.c +22
-27@@ -277,15 +277,9 @@ dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act)* buf = rc + roundup(sizeof(dt_mstate_t), 8); * // add %r0, roundup( * sizeof(dt_mstate_t), 8) -* *((uint64_t *)&buf[0]) = 0; -* // stdw [%r0 + 0], 0 -* buf += 8; // add %r0, 8 -* // (%r0 = pointer to buffer space) * dctx.buf = buf; // stdw [%r9 + DCTX_BUF], %r0 */ emit (dlp,BPF_ALU64_IMM (BPF_ADD ,BPF_REG_0 ,roundup (sizeof (dt_mstate_t),8 ))); -emit (dlp,BPF_STORE_IMM (BPF_DW ,BPF_REG_0 ,0 ,0 )); -emit (dlp,BPF_ALU64_IMM (BPF_ADD ,BPF_REG_0 ,8 ));emit (dlp,BPF_STORE (BPF_DW ,BPF_REG_9 ,DCTX_BUF ,BPF_REG_0 ));/* @@ -1047,8 +1041,9 @@ dt_cg_tramp_error(dt_pcb_t *pcb)* * - Store the base pointer to the output data buffer in %r9. * - Initialize the machine state (dctx->mst). -* - Store the epid at [%r9 + DBUF_EPID]. * - Store 0 to indicate no active speculation at [%r9 + DBUF_SPECID]. +* - Store the prid at [%r9 + DBUF_PRID]. +* - Store the stid at [%r9 + DBUF_STID]. * - Evaluate the predicate expression and return if false. * * The dt_program() function will always return 0. @@ -1057,11 +1052,6 @@ static void dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred) {dt_irlist_t *dlp = &pcb->pcb_ir; -dt_ident_t *epid =dt_dlib_get_var (pcb->pcb_hdl,"EPID" ); -dt_ident_t *clid =dt_dlib_get_var (pcb->pcb_hdl,"CLID" ); - -assert (epid !=NULL ); -assert (clid !=NULL );/* * void dt_program(dt_dctx_t *dctx) @@ -1093,18 +1083,13 @@ dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred)* // stdw [%r0 + DMST_FAULT], 0 * dctx->mst->tstamp = 0; // stdw [%r0 + DMST_TSTAMP], 0 * dctx->mst->specsize = 0;// stdw [%r0 + DMST_SPECSIZE], 0 -* dctx->mst->epid = EPID; // stw [%r0 + DMST_EPID], EPID -* dctx->mst->clid = CLID; // stw [%r0 + DMST_CLID], CLID -* *((uint32_t *)&buf[DBUF_EPID]) = EPID; -* // stw [%r9 + DBUF_EPID], EPID +* dctx->mst->stid = STID; // stw [%r0 + DMST_STID], STID */ emit (dlp,BPF_LOAD (BPF_DW ,BPF_REG_0 ,BPF_REG_0 ,DCTX_MST ));emit (dlp,BPF_STORE_IMM (BPF_DW ,BPF_REG_0 ,DMST_FAULT ,0 ));emit (dlp,BPF_STORE_IMM (BPF_DW ,BPF_REG_0 ,DMST_TSTAMP ,0 ));emit (dlp,BPF_STORE_IMM (BPF_DW ,BPF_REG_0 ,DMST_SPECSIZE ,0 )); -emite (dlp,BPF_STORE_IMM (BPF_W ,BPF_REG_0 ,DMST_EPID ,-1 ), epid); -emite (dlp,BPF_STORE_IMM (BPF_W ,BPF_REG_0 ,DMST_CLID ,-1 ), clid); -emite (dlp,BPF_STORE_IMM (BPF_W ,BPF_REG_9 ,DBUF_EPID ,-1 ), epid); +emit (dlp,BPF_STORE_IMM (BPF_W ,BPF_REG_0 ,DMST_STID , pcb->pcb_stmt->dtsd_id));/* * Set the speculation ID field to zero to indicate no active @@ -1114,6 +1099,17 @@ dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred)*/ emit (dlp,BPF_STORE_IMM (BPF_W ,BPF_REG_9 ,DBUF_SPECID ,0 )); +/* +* *((uint32_t *)&buf[DBUF_PRID]) = dctx->mst->prid; +* // ld %r1, [%r0 + DMST_PRID] +* // st [%r9 + DBUF_PRID], %r1 +* *((uint32_t *)&buf[DBUF_STID]) = stid; +* // st [%r9 + DBUF_STID], stid +*/ +emit (dlp,BPF_LOAD (BPF_W ,BPF_REG_1 ,BPF_REG_0 ,DMST_PRID )); +emit (dlp,BPF_STORE (BPF_W ,BPF_REG_9 ,DBUF_PRID ,BPF_REG_1 )); +emit (dlp,BPF_STORE_IMM (BPF_W ,BPF_REG_9 ,DBUF_STID , pcb->pcb_stmt->dtsd_id)); +/* * If there is a predicate: * @@ -1132,10 +1128,9 @@ dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred)TRACE_REGSET ("Prologue: End " );/* -* Account for 32-bit EPID (at offset 0) and 32-bit speculation ID (at -* offset 4). +* Set the offset for the beginning of trace data. */ - pcb->pcb_bufoff +=2 *sizeof (uint32_t ); + pcb->pcb_bufoff =DBUF_DATA ; }/* @@ -1170,15 +1165,15 @@ dt_cg_epilogue(dt_pcb_t *pcb)/* * rc = bpf_perf_event_output(dctx->ctx, &buffers, * BPF_F_CURRENT_CPU, -* buf - 4, bufoff + 4); +* buf + 4, bufoff - 4); * // lddw %r1, [%fp + DT_STK_DCTX] * // lddw %r1, [%r1 + DCTX_CTX] * // lddw %r2, &buffers * // lddw %r3, BPF_F_CURRENT_CPU * // mov %r4, %r9 -* // add %r4, -4 +* // add %r4, 4 * // mov %r5, pcb->pcb_bufoff -* // add %r5, 4 +* // add %r5, -4 * // call bpf_perf_event_output */ emit (dlp,BPF_LOAD (BPF_DW ,BPF_REG_1 ,BPF_REG_FP ,DT_STK_DCTX ));@@ -1186,9 +1181,9 @@ dt_cg_epilogue(dt_pcb_t *pcb)dt_cg_xsetx (dlp, buffers,DT_LBL_NONE ,BPF_REG_2 , buffers->di_id);dt_cg_xsetx (dlp,NULL ,DT_LBL_NONE ,BPF_REG_3 ,BPF_F_CURRENT_CPU );emit (dlp,BPF_MOV_REG (BPF_REG_4 ,BPF_REG_9 )); -emit (dlp,BPF_ALU64_IMM (BPF_ADD ,BPF_REG_4 ,-4 )); +emit (dlp,BPF_ALU64_IMM (BPF_ADD ,BPF_REG_4 ,4 ));emit (dlp,BPF_MOV_IMM (BPF_REG_5 , pcb->pcb_bufoff)); -emit (dlp,BPF_ALU64_IMM (BPF_ADD ,BPF_REG_5 ,4 )); +emit (dlp,BPF_ALU64_IMM (BPF_ADD ,BPF_REG_5 ,-4 ));emit (dlp,BPF_CALL_HELPER (BPF_FUNC_perf_event_output));/* libdtrace/dt_consume.c +46
-39@@ -15,9 +15,11 @@#include <alloca.h> #include <dt_impl.h> #include <dt_aggregate.h> +#include <dt_dctx.h> #include <dt_module.h> #include <dt_pcap.h> #include <dt_peb.h> +#include <dt_probe.h> #include <dt_state.h> #include <dt_string.h> #include <libproc.h> @@ -433,7 +435,7 @@ static dt_htab_ops_t dt_spec_buf_htab_ops = { };static int -dt_flowindent (dtrace_hdl_t *dtp,dtrace_probedata_t *data,dtrace_epid_t last) +dt_flowindent (dtrace_hdl_t *dtp,dtrace_probedata_t *data,dtrace_id_t lastprid,dtrace_stid_t laststid) {dtrace_probedesc_t *pd = data->dtpda_pdesc;dtrace_flowkind_t flow =DTRACEFLOW_NONE ;@@ -445,7 +447,7 @@ dt_flowindent(dtrace_hdl_t *dtp, dtrace_probedata_t *data, dtrace_epid_t last)static const char *r_str[2 ] = {" <- " ," <= " };static const char *ent ="entry" , *ret ="return" ;static int entlen =0 , retlen =0 ; -dtrace_epid_t id = data->dtpda_epid; +dtrace_stid_t stid = data->dtpda_stid;if (entlen ==0 ) {assert (retlen ==0 );@@ -473,13 +475,12 @@ dt_flowindent(dtrace_hdl_t *dtp, dtrace_probedata_t *data, dtrace_epid_t last)/* * If we're going to indent this, we need to check the ID of our last -* call. If we're looking at the same probe ID but a different EPID, +* call. If we're looking at the same probe ID but a different STID, * we _don't_ want to indent. (Yes, there are some minor holes in * this scheme -- it's a heuristic.) */ if (flow ==DTRACEFLOW_ENTRY ) { -if (last !=DTRACE_EPIDNONE && id != last && - pd->id == dtp->dt_pdesc[last]->id) +if (stid != laststid && pd->id == lastprid) flow =DTRACEFLOW_NONE ; }@@ -2145,8 +2146,8 @@ static dtrace_workstatus_t dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size, dtrace_probedata_t *pdat, dtrace_consume_probe_f *efunc, dtrace_consume_rec_f *rfunc, int flow, int quiet, - int peekflags, dtrace_epid_t *last, int committing, - void *arg); + int peekflags, dtrace_id_t *lastprid, + dtrace_stid_t *laststid, int committing, void *arg);/* * Commit one speculation. @@ -2155,7 +2156,8 @@ static dtrace_workstatus_tdt_commit_one_spec (dtrace_hdl_t *dtp,FILE *fp, dt_spec_buf_t *dtsb, dtrace_probedata_t *pdat, dtrace_consume_probe_f *efunc, dtrace_consume_rec_f *rfunc, int flow, int quiet, - int peekflags, dtrace_epid_t *last, void *arg) + int peekflags, dtrace_id_t *lastprid, + dtrace_stid_t *laststid, void *arg) {dt_spec_buf_data_t *dsbd;@@ -2169,7 +2171,7 @@ dt_commit_one_spec(dtrace_hdl_t *dtp, FILE *fp, dt_spec_buf_t *dtsb, ret =dt_consume_one_probe (dtp, fp, dsbd->dsbd_data, dsbd->dsbd_size, &specpdat, efunc, rfunc, flow, quiet, - peekflags, last,1 , arg); + peekflags, lastprid, laststid,1 , arg);if (ret !=DTRACE_WORKSTATUS_OKAY )return ret; }@@ -2181,34 +2183,33 @@ static dtrace_workstatus_t dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size, dtrace_probedata_t *pdat, dtrace_consume_probe_f *efunc, dtrace_consume_rec_f *rfunc, int flow, int quiet, - int peekflags, dtrace_epid_t *last, int committing, - void *arg) + int peekflags, dtrace_id_t *lastprid, + dtrace_stid_t *laststid, int committing, void *arg) { -dtrace_epid_t epid; +dtrace_specid_t specid; +dtrace_id_t prid; +dtrace_stid_t stid;dtrace_datadesc_t *epd;dt_spec_buf_t tmpl;dt_spec_buf_t *dtsb; -int specid;int i;int rval;dtrace_workstatus_t ret;int commit_discard_seen, only_commit_discards;int data_recording =1 ; - epid = ((uint32_t *)data)[0 ]; - specid = ((uint32_t *)data)[1 ]; + specid = *((dtrace_specid_t *)(data +DBUF_SPECID )); + prid = *((dtrace_id_t *)(data +DBUF_PRID )); + stid = *((dtrace_stid_t *)(data +DBUF_STID )); -/* -* Fill in the epid and address of the epid in the buffer. We need to -* pass this to the efunc and possibly to create speculations. -*/ - pdat->dtpda_epid = epid; + pdat->dtpda_stid = stid; pdat->dtpda_data = data; - rval =dt_epid_lookup (dtp, epid, &pdat->dtpda_ddesc, - &pdat->dtpda_pdesc); -if (rval !=0 ) -return dt_set_errno (dtp,EDT_BADEPID ); +if (prid > dtp->dt_probe_id) +return dt_set_errno (dtp,EDT_BADID ); + pdat->dtpda_pdesc = (dtrace_probedesc_t *)dtp->dt_probes[prid]->desc; +if (dt_stid_lookup (dtp, stid, &pdat->dtpda_ddesc) !=0 ) +return dt_set_errno (dtp,EDT_BADSTID ); epd = pdat->dtpda_ddesc;if (epd->dtdd_uarg !=DT_ECB_DEFAULT ) {@@ -2306,7 +2307,7 @@ dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size,if (data_recording) {if (flow) -dt_flowindent (dtp, pdat, *last); +dt_flowindent (dtp, pdat, *lastprid, *laststid); rval = (*efunc)(pdat, arg);@@ -2569,14 +2570,15 @@ dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size, }/* -* Call the record callback with a NULL record to indicate -* that we're done processing this EPID. The return value is ignored in -* this case. XXX should we respect at least DTRACE_CONSUME_ABORT? +* Call the record callback with a NULL record to indicate that we're +* done processing this record. The return value is ignored in this +* case. XXX should we respect at least DTRACE_CONSUME_ABORT? */ if (data_recording) { (*rfunc)(pdat,NULL , arg); - *last = epid; + *lastprid = prid; + *laststid = stid; }/* @@ -2597,7 +2599,7 @@ dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size,if ((ret =dt_commit_one_spec (dtp, fp, dtsb, pdat, efunc, rfunc, flow, quiet, peekflags, - last, arg)) != + lastprid, laststid, arg)) !=DTRACE_WORKSTATUS_OKAY ) {dt_spec_buf_data_destroy (dtp, dtsb);return ret;@@ -2623,7 +2625,7 @@ static dtrace_workstatus_tdt_consume_one (dtrace_hdl_t *dtp,FILE *fp, char *buf, dtrace_probedata_t *pdat, dtrace_consume_probe_f *efunc, dtrace_consume_rec_f *rfunc, int flow, int quiet, int peekflags, - dtrace_epid_t *last, void *arg) + dtrace_id_t *lastprid, dtrace_stid_t *laststid, void *arg) {char *data = buf;struct perf_event_header *hdr;@@ -2639,9 +2641,9 @@ dt_consume_one(dtrace_hdl_t *dtp, FILE *fp, char *buf,* struct { * struct perf_event_header header; * uint32_t size; -* uint32_t pad; -* uint32_t epid; * uint32_t specid; +* uint32_t prid; +* uint32_t stid; * uint64_t data[n]; * } * and 'data' points to the 'size' member at this point. @@ -2651,17 +2653,21 @@ dt_consume_one(dtrace_hdl_t *dtp, FILE *fp, char *buf,return dt_set_errno (dtp,EDT_DSIZE ); size = *(uint32_t *)data; - data +=sizeof (size); ptr +=sizeof (size) + size;if (ptr != buf + hdr->size)return dt_set_errno (dtp,EDT_DSIZE ); - data +=sizeof (uint32_t );/* skip padding */ - size -=sizeof (uint32_t ); +/* +* "size" measures from after &size to the end. But buffer +* offsets are relative to &size itself, to preserve 8-byte +* alignment. So, we leave data pointing at &size, and we +* increase size by 4 bytes. +*/ + size +=4 ;return dt_consume_one_probe (dtp, fp, data, size, pdat, efunc, rfunc, flow, quiet, peekflags, - last,0 , arg); + lastprid, laststid,0 , arg); }else if (hdr->type ==PERF_RECORD_LOST ) {return DTRACE_WORKSTATUS_OKAY ; }else @@ -2692,7 +2698,8 @@ dt_consume_cpu(dtrace_hdl_t *dtp, FILE *fp, dt_peb_t *peb, {struct perf_event_mmap_page *rb_page = (void *)peb->base;struct perf_event_header *hdr; -dtrace_epid_t last =DTRACE_EPIDNONE ; +dtrace_id_t lastprid; +dtrace_stid_t laststid;char *base;char *event;uint32_t len;@@ -2764,7 +2771,7 @@ dt_consume_cpu(dtrace_hdl_t *dtp, FILE *fp, dt_peb_t *peb, } rval =dt_consume_one (dtp, fp, event, &pdat, efunc, rfunc, flow, - quiet, peekflags, &last, arg); + quiet, peekflags, &lastprid, &laststid, arg);if (rval ==DTRACE_WORKSTATUS_DONE )return DTRACE_WORKSTATUS_OKAY ;if (rval !=DTRACE_WORKSTATUS_OKAY )libdtrace/dt_dctx.h +13
-8@@ -25,9 +25,8 @@* The DTrace machine state. */ typedef struct dt_mstate { - uint32_t epid; /* Enabled probe ID */ uint32_t prid; /* Probe ID */ - uint32_t clid; /* Clause ID (unique per probe) */ + uint32_t stid; /* Statement ID */ uint32_t tag; /* Tag (for future use) */ uint32_t scratch_top; /* Current top of scratch space */ int32_t syscall_errno; /* syscall errno */@@ -41,9 +40,8 @@ typedef struct dt_mstate {uint64_t saved_argv[6 ];/* Saved arguments */ } dt_mstate_t; -#define DMST_EPID offsetof(dt_mstate_t, epid)#define DMST_PRID offsetof(dt_mstate_t, prid) -#define DMST_CLID offsetof(dt_mstate_t, clid) +#define DMST_STID offsetof(dt_mstate_t, stid)#define DMST_TAG offsetof(dt_mstate_t, tag)#define DMST_SCRATCH_TOP offsetof(dt_mstate_t, scratch_top)#define DMST_ERRNO offsetof(dt_mstate_t, syscall_errno)@@ -90,16 +88,23 @@ typedef struct dt_dctx {* The dctx->buf pointer references a block of memory that contains: * * +----------------+ -* 0 -> | EPID | +* 0 -> | size | * +----------------+ -* 4 -> | Speculation ID | +* 4 -> | Speculation ID | * +----------------+ -* | Trace Data | +* 8 -> | PRID | +* +----------------+ +* 12 -> | STID | +* +----------------+ +* 16 -> | Trace Data | * | ... | * +----------------+ */ -#define DBUF_EPID 0 +#define DBUF_SIZE 0#define DBUF_SPECID 4 +#define DBUF_PRID 8 +#define DBUF_STID 12 +#define DBUF_DATA 16/* * The dctx->mem pointer references a block of memory that contains: libdtrace/dt_dlibs.c +0
-2@@ -73,9 +73,7 @@ static const dt_ident_t dt_bpf_symbols[] = {DT_BPF_SYMBOL (tuples,DT_IDENT_PTR ),/* BPF internal identifiers */ -DT_BPF_SYMBOL_ID (EPID ,DT_IDENT_SCALAR ,DT_CONST_EPID ),DT_BPF_SYMBOL_ID (PRID ,DT_IDENT_SCALAR ,DT_CONST_PRID ), -DT_BPF_SYMBOL_ID (CLID ,DT_IDENT_SCALAR ,DT_CONST_CLID ),DT_BPF_SYMBOL_ID (ARGC ,DT_IDENT_SCALAR ,DT_CONST_ARGC ),DT_BPF_SYMBOL_ID (STBSZ ,DT_IDENT_SCALAR ,DT_CONST_STBSZ ), DT_BPF_SYMBOL_ID(STRSZ, DT_IDENT_SCALAR, DT_CONST_STRSZ),libdtrace/dt_error.c +1
-1@@ -54,7 +54,7 @@ static const struct { { EDT_DOFFSET, "Data record offset exceeds buffer boundary" }, { EDT_DALIGN, "Data record has inappropriate alignment" }, { EDT_DSIZE, "Data record has incorrect size" }, - { EDT_BADEPID, "Invalid EPID" }, + { EDT_BADSTID, "Invalid statement ID" }, { EDT_BADOPTNAME, "Invalid option name" }, { EDT_BADOPTVAL, "Invalid value for specified option" }, { EDT_BADOPTCTX, "Option cannot be used from within a D program" },libdtrace/dt_handle.c +12
-8@@ -14,6 +14,7 @@#include <alloca.h> #include <dt_impl.h> +#include <dt_probe.h> #include <dt_program.h> static const char _dt_errprog[] =@@ -127,9 +128,9 @@ dt_handle_err(dtrace_hdl_t *dtp, dtrace_probedata_t *data)dtrace_datadesc_t *dd = data->dtpda_ddesc, *errdd;dtrace_probedesc_t *pd = data->dtpda_pdesc, *errpd;dtrace_errdata_t err; -dtrace_epid_t epid; +dtrace_id_t prid; +dtrace_stid_t stid; -char where[30 ];char details[30 ];char offinfo[30 ];const int slop =80 ;@@ -144,34 +145,32 @@ dt_handle_err(dtrace_hdl_t *dtp, dtrace_probedata_t *data)return dt_set_errno (dtp,EDT_BADERROR );/* -* This is an error. We have the following items here: EPID, -* faulting action, BPF pc, fault code and faulting address. +* This is an error. We have the following items here: PRID, +* statement ID, BPF pc, fault code and faulting address. */ - epid = (uint32_t )DT_REC (uint64_t,0 ); + prid =DT_REC (uint64_t,0 ); + stid =DT_REC (uint64_t,1 ); -if (dt_epid_lookup (dtp, epid, &errdd, &errpd) !=0 ) +if (prid > dtp->dt_probe_id)return dt_set_errno (dtp,EDT_BADERROR ); - +if (dt_stid_lookup (dtp, stid, &errdd) !=0 ) +return dt_set_errno (dtp,EDT_BADERROR ); + errpd = (dtrace_probedesc_t *)dtp->dt_probes[prid]->desc; err.dteda_ddesc = errdd; err.dteda_pdesc = errpd; err.dteda_cpu = data->dtpda_cpu; - err.dteda_action = (int )DT_REC (uint64_t,1 ); + err.dteda_action = stid; err.dteda_offset = (int )DT_REC (uint64_t,2 ); err.dteda_fault = (int )DT_REC (uint64_t,3 ); err.dteda_addr =DT_REC (uint64_t,4 );
Quoted 1 line
libdtrace/dt_handle.c dt_handle_err(dtrace_hdl_t *dtp, dtrace_probedata_t *data) · line 167
Quoted 1 line
libdtrace/dt_handle.c +0
-0faultstr =dtrace_faultstr (dtp, err.dteda_fault);
Pre-existing, but faultstr is not needed if you use asprintf() below. And without asprintf(), faultstr should be used in the sprintf() below rather than calling dtrace_faultstr() a 2nd time.
Quoted 1,316 lines
Quoted 4 lines
libdtrace/dt_handle.c +1
-1- len =sizeof (where) +sizeof (offinfo) +strlen (faultstr) + + len =sizeof (offinfo) +strlen (faultstr) +strlen (errpd->prv) +strlen (errpd->mod) +strlen (errpd->fun) +strlen (errpd->prb) + slop;libdtrace/dt_handle.c dt_handle_err(dtrace_hdl_t *dtp, dtrace_probedata_t *data) · line 175
Quoted 10 lines
libdtrace/dt_handle.c +0
-5str = (char *)alloca (len); -if (err.dteda_action ==0 ) -sprintf (where,"predicate" ); -else -sprintf (where,"action #%d" , err.dteda_action); -if (err.dteda_offset !=-1 )sprintf (offinfo," at BPF pc %d" , err.dteda_offset);Pre-existing, but this should probably use
asprintf()and avoid the constant size limit. Especially since thesprintf()is potentially dangerous because it should at least have beensnprintf().libdtrace/dt_handle.c no_addr: · line 195
Quoted 4 lines
libdtrace/dt_handle.c +0
-0else @@ -195,11 +194,12 @@ no_addr: details[0 ] =0 ; }Pre-existing, but this should probably use
asprintf()and avoid the constant size limit. Especially since thesprintf()is potentially dangerous because it should at least have beensnprintf().libdtrace/dt_handle.c no_addr: · line 202
Quoted 11 lines
libdtrace/dt_handle.c +5
-4-snprintf (str, len,"error on enabled probe ID %u (ID %u: %s:%s:%s:%s): " -"%s%s in %s%s" , - epid, errpd->id, errpd->prv, errpd->mod, errpd->fun, +snprintf (str, len,"error in %s for probe ID %u (%s:%s:%s:%s): " +"%s%s%s" , + dtp->dt_stmts[stid]->dtsd_clause->di_name, + errpd->id, errpd->prv, errpd->mod, errpd->fun, errpd->prb,dtrace_faultstr (dtp, err.dteda_fault), details, - where, offinfo); + offinfo);This definitely should use
asprintf()(and free the string at the end), because of the potential for buffer overwrite due to the fixed size of len. Yes, in reality we know that all the strings being copied into the output string will be bound correctly, but it is still a risk if someone changing this code and makes a calculation mistake. Usingasprintf()will avoid all that.Also an unsafe indexing of
dtp->dt_stmts,libdtrace/dt_handle.c dt_handle_liberr(dtrace_hdl_t *dtp, const dtrace_probedata_t *data, · line 262
Quoted 13 lines
libdtrace/dt_handle.c +3
-2err.dteda_msg = str;@@ -256,8 +256,9 @@ dt_handle_liberr(dtrace_hdl_t *dtp, const dtrace_probedata_t *data, str =alloca (len);snprintf (str, len, -"error on enabled probe ID %u (ID %u: %s:%s:%s:%s): %s" , - data->dtpda_epid, errpd->id, errpd->prv, errpd->mod, +"error in %s for probe ID %u (%s:%s:%s:%s): %s" , + dtp->dt_stmts[data->dtpda_stid]->dtsd_clause->di_name, + errpd->id, errpd->prv, errpd->mod, errpd->fun, errpd->prb, faultstr);Same as above... Use
asprintf()to avoid the risk of buffer overrun at some point.Also an unsafe indexing of
dtp->dt_stmts,Quoted 141 lines
libdtrace/dt_handle.c +0
-0err.dteda_msg = str;libdtrace/dt_impl.h +4
-11@@ -271,10 +271,11 @@ struct dtrace_hdl {const char *dt_errtag;/* tag used with last call to dt_set_errmsg() */ dt_pcb_t *dt_pcb;/* pointer to current parsing control block */ ulong_t dt_gen;/* compiler generation number */ -uint_t dt_clause_nextid;/* next ID to use for programs */ +uint_t dt_stmt_nextid;/* next ID to use for statements */ dt_list_t dt_programs;/* linked list of dtrace_prog_t's */ dt_list_t dt_xlators;/* linked list of dt_xlator_t's */ dt_list_t dt_enablings;/* list of (to be) enabled probes */ +dtrace_stmtdesc_t **dt_stmts;/* array of stmts */ struct dt_xlator **dt_xlatormap;/* dt_xlator_t's indexed by dx_id */ id_t dt_xlatorid;/* next dt_xlator_t id to assign */ dt_ident_t *dt_externs;/* linked list of external symbol identifiers */ @@ -341,10 +342,6 @@ struct dtrace_hdl {ctf_id_t dt_type_symaddr;/* cached CTF identifier for _symaddr type */ ctf_id_t dt_type_usymaddr;/* cached CTF ident. for _usymaddr type */ ctf_id_t dt_type_void;/* cached CTF identifier for void type */ -dtrace_epid_t dt_nextepid;/* next enabled probe ID to assign */ -size_t dt_maxprobe;/* max enabled probe ID */ -dtrace_datadesc_t **dt_ddesc;/* probe data descriptions */ -dtrace_probedesc_t **dt_pdesc;/* probe descriptions for enabled prbs */ size_t dt_maxagg;/* max aggregation ID */ dtrace_aggdesc_t **dt_adesc;/* aggregation descriptions */ struct dt_aggregate *dt_aggregate;/* aggregate */ @@ -604,7 +601,7 @@ enum {EDT_DOFFSET ,/* record data offset error */ EDT_DALIGN ,/* record data alignment error */ EDT_DSIZE ,/* record data size error */ -EDT_BADEPID ,/* invalid enabled probe id */ +EDT_BADSTID ,/* invalid statement id */ EDT_BADOPTNAME ,/* invalid dtrace_setopt option name */ EDT_BADOPTVAL ,/* invalid dtrace_setopt option value */ EDT_BADOPTCTX, /* invalid dtrace_setopt option context */@@ -771,11 +768,7 @@ extern dtrace_datadesc_t *dt_datadesc_hold(dtrace_datadesc_t *ddp);extern void dt_datadesc_release (dtrace_hdl_t *,dtrace_datadesc_t *);extern dtrace_datadesc_t *dt_datadesc_create (dtrace_hdl_t *);extern int dt_datadesc_finalize (dtrace_hdl_t *,dtrace_datadesc_t *); -extern dtrace_epid_t dt_epid_add (dtrace_hdl_t *,dtrace_datadesc_t *, -dtrace_id_t ); -extern int dt_epid_lookup (dtrace_hdl_t *,dtrace_epid_t ,dtrace_datadesc_t **, -dtrace_probedesc_t **); -extern void dt_epid_destroy (dtrace_hdl_t *); +extern int dt_stid_lookup (dtrace_hdl_t *,dtrace_stid_t ,dtrace_datadesc_t **);typedef void (*dt_cg_gap_f )(dt_pcb_t *,int );extern uint32_t dt_rec_add (dtrace_hdl_t *,dt_cg_gap_f ,dtrace_actkind_t ,uint32_t ,uint16_t ,dt_pfargv_t *,uint64_t );libdtrace/dt_map.c +2
-77@@ -85,98 +85,18 @@ dt_datadesc_finalize(dtrace_hdl_t *dtp, dtrace_datadesc_t *ddp)return 0 ; } -/* -* Associate a probe data description and probe description with an enabled -* probe ID. This means that the given ID refers to the program matching the -* probe data description being attached to the probe that matches the probe -* description. -*/ -dtrace_epid_t -dt_epid_add (dtrace_hdl_t *dtp,dtrace_datadesc_t *ddp,dtrace_id_t prid) -{ -dtrace_id_t max = dtp->dt_maxprobe; -dtrace_epid_t epid; - - epid = dtp->dt_nextepid++; -if (epid >= max || dtp->dt_ddesc ==NULL ) { -dtrace_id_t nmax = max ? (max <<1 ) :2 ; -dtrace_datadesc_t **nddesc; -dtrace_probedesc_t **npdesc; - - nddesc =dt_calloc (dtp, nmax,sizeof (void *)); - npdesc =dt_calloc (dtp, nmax,sizeof (void *)); -if (nddesc ==NULL || npdesc ==NULL ) { -dt_free (dtp, nddesc); -dt_free (dtp, npdesc); -return dt_set_errno (dtp,EDT_NOMEM ); - } - -if (dtp->dt_ddesc !=NULL ) { -size_t osize = max *sizeof (void *); - -memcpy (nddesc, dtp->dt_ddesc, osize); -dt_free (dtp, dtp->dt_ddesc); -memcpy (npdesc, dtp->dt_pdesc, osize); -dt_free (dtp, dtp->dt_pdesc); - } - - dtp->dt_ddesc = nddesc; - dtp->dt_pdesc = npdesc; - dtp->dt_maxprobe = nmax; - } - -if (dtp->dt_ddesc[epid] !=NULL ) -return epid; - - dtp->dt_ddesc[epid] =dt_datadesc_hold (ddp); - dtp->dt_pdesc[epid] = (dtrace_probedesc_t *)dtp->dt_probes[prid]->desc; - -return epid; -} -int -dt_epid_lookup (dtrace_hdl_t *dtp,dtrace_epid_t epid,dtrace_datadesc_t **ddp, -dtrace_probedesc_t **pdp) +dt_stid_lookup (dtrace_hdl_t *dtp,dtrace_stid_t stid,dtrace_datadesc_t **ddp) { -if (epid >= dtp->dt_maxprobe || - dtp->dt_ddesc[epid] ==NULL || dtp->dt_pdesc[epid] ==NULL ) -return -1 ; - - *ddp = dtp->dt_ddesc[epid]; - *pdp = dtp->dt_pdesc[epid]; - -return 0 ; -} - -void -dt_epid_destroy (dtrace_hdl_t *dtp) -{ -size_t i; - -assert ((dtp->dt_pdesc !=NULL && dtp->dt_ddesc !=NULL && - dtp->dt_maxprobe >0 ) || (dtp->dt_pdesc ==NULL && - dtp->dt_ddesc ==NULL && dtp->dt_maxprobe ==0 )); - -if (dtp->dt_pdesc ==NULL ) -return ; +dtrace_difo_t *rdp; -for (i =0 ; i < dtp->dt_maxprobe; i++) { -if (dtp->dt_ddesc[i] ==NULL ) { -assert (dtp->dt_pdesc[i] ==NULL ); -continue ; - }libdtrace/dt_map.c dt_datadesc_finalize(dtrace_hdl_t *dtp, dtrace_datadesc_t *ddp) · line 96
Quoted 10 lines
libdtrace/dt_map.c +3
-6- -dt_datadesc_release (dtp, dtp->dt_ddesc[i]); -assert (dtp->dt_pdesc[i] !=NULL ); - } +if (stid >= dtp->dt_stmt_nextid) +return -1 ; -free (dtp->dt_pdesc); - dtp->dt_pdesc =NULL ; + rdp =dt_dlib_get_func_difo (dtp, dtp->dt_stmts[stid]->dtsd_clause);Unsafe indexing of
dtp->dt_stmts,Quoted 1,095 lines
libdtrace/dt_map.c +2
-4+ *ddp = rdp->dtdo_ddesc; -free (dtp->dt_ddesc); - dtp->dt_ddesc =NULL ; - dtp->dt_nextepid =0 ; - dtp->dt_maxprobe =0 ; +return (*ddp ==NULL ) ?-1 :0 ; }uint32_t libdtrace/dt_open.c +1
-4@@ -170,7 +170,7 @@ static const dt_ident_t _dtrace_globals[] = { {"discard" ,DT_IDENT_ACTFUNC ,0 ,DT_ACT_DISCARD ,DT_ATTR_STABCMN ,DT_VERS_1_0 , &dt_idops_func, "void(int)" }, { "epid", DT_IDENT_SCALAR, 0, DIF_VAR_EPID, DT_ATTR_STABCMN, DT_VERS_1_0, - &dt_idops_type, "uint_t" }, + &dt_idops_type, "uint64_t" }, { "errno", DT_IDENT_SCALAR, 0, DIF_VAR_ERRNO, DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_type, "int" }, { "execname", DT_IDENT_SCALAR, 0, DIF_VAR_EXECNAME,@@ -739,8 +739,6 @@ dt_vopen(int version, int flags, int *errp,dt_proc_hash_create (dtp);dt_proc_signal_init (dtp); dtp->dt_proc_fd =eventfd (0 ,EFD_CLOEXEC |EFD_NONBLOCK ); - dtp->dt_nextepid =1 ; - dtp->dt_maxprobe =0 ;if (dt_aggregate_init (dtp) ==-1 )return set_open_errno (dtp, errp,dtrace_errno (dtp)); dtp->dt_vmax =DT_VERS_LATEST ;@@ -1303,7 +1301,6 @@ dtrace_close(dtrace_hdl_t *dtp)if (dtp->dt_poll_fd !=-1 )close (dtp->dt_poll_fd); -dt_epid_destroy (dtp);dt_aggid_destroy (dtp);dt_buffered_destroy (dtp);dt_aggregate_destroy (dtp);libdtrace/dt_program.c +8
-1@@ -100,7 +100,7 @@ dtrace_program_info(dtrace_hdl_t *dtp, dtrace_prog_t *pgp,/* * If there aren't any actions, account for the fact that -* recording the epid will generate a record. +* the default action will generate a record. */ dp =dt_dlib_get_func_difo (dtp, stp->ds_desc->dtsd_clause);if (dp !=NULL )@@ -165,6 +165,13 @@ dt_prog_stmt(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, dtrace_stmtdesc_t *sdp,dtrace_probedesc_t *pdp = &sdp->dtsd_ecbdesc->dted_probe;int rc; +if (dtp->dt_stmts ==NULL ) { + dtp->dt_stmts =dt_calloc (dtp, dtp->dt_stmt_nextid,sizeof (dtrace_stmtdesc_t *)); +if (dtp->dt_stmts ==NULL ) +return dt_set_errno (dtp,EDT_NOMEM ); + } + dtp->dt_stmts[sdp->dtsd_id] = sdp; + st.cnt = cnt; st.sdp = sdp; rc =dt_probe_iter (dtp, pdp, (dt_probe_f *)dt_stmt_probe,NULL , &st);libdtrace/dtrace.h +2
-1@@ -150,6 +150,7 @@ typedef struct dtrace_stmtdesc {dtrace_attribute_t dtsd_descattr;/* probedesc attributes */ dtrace_attribute_t dtsd_stmtattr;/* statement attributes */ int dtsd_clauseflags;/* clause flags */ +int dtsd_id;/* index in dtp->dt_stmts */ } dtrace_stmtdesc_t;/* dtsd clause flags */ @@ -189,7 +190,7 @@ typedef enum { typedef struct dtrace_probedata { dtrace_hdl_t *dtpda_handle; /* handle to DTrace library */ - dtrace_epid_t dtpda_epid; /* enabled probe ID */ + dtrace_stid_t dtpda_stid; /* statement ID */ dtrace_datadesc_t *dtpda_ddesc; /* probe data description */ dtrace_probedesc_t *dtpda_pdesc; /* probe description */ unsigned int dtpda_cpu; /* CPU for data */test/demo/builtin/eipd.d deleted +0
-4@@ -1,4 +0,0 @@ -BEGIN { - trace(epid); - exit(0); -}test/demo/dtrace/error.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/demo/dtrace/error.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/demo/spec/specopen.d +2
-3@@ -2,7 +2,7 @@ /* * Oracle Linux DTrace. - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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. */@@ -33,8 +33,7 @@ fbt::: /self->spec/ { /* - * A speculate() with no other actions speculates the default action: - * tracing the EPID. + * A speculate() with no other actions speculates the default action. */ speculate(self->spec); }test/stress/buffering/tst.resize3-manual.d +1
-1@@ -31,7 +31,7 @@ BEGIN BEGIN { speculate(spec); - trace(epid); + trace(12345678); } BEGINtest/stress/buffering/tst.resize3-manual.r +1
-1@@ -1,5 +1,5 @@ FUNCTION:NAME - :BEGIN 3 + :BEGIN 12345678 :BEGIN -- @@stderr --test/stress/buffering/tst.resize3.d +1
-1@@ -27,7 +27,7 @@ BEGIN BEGIN { speculate(spec); - trace(epid); + trace(12345678); } BEGINtest/stress/buffering/tst.resize3.r +1
-1@@ -1,5 +1,5 @@ FUNCTION:NAME - :BEGIN 3 + :BEGIN 12345678 :BEGIN -- @@stderr --test/unittest/actions/setopt/tst.badopt.r +7
-7@@ -1,16 +1,16 @@ -- @@stderr -- -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "Nixon" to "1": Invalid option name +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "Nixon" to "1": Invalid option name -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "Harding" to "1": Invalid option name +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "Harding" to "1": Invalid option name -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "Hoover" to "1": Invalid option name +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "Hoover" to "1": Invalid option name -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "Bush" to "1": Invalid option name +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "Bush" to "1": Invalid option name -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "quiet" to "um, no": Invalid value for specified option +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "quiet" to "um, no": Invalid value for specified option -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "aggrate" to "0.5hz": Invalid value for specified option +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "aggrate" to "0.5hz": Invalid value for specified option -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): couldn't set option "bufsize" to "1m": Operation illegal when tracing is active +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): couldn't set option "bufsize" to "1m": Operation illegal when tracing is activetest/unittest/arrays/tst.declared-bounds.runtime_out.r +1
-1@@ -1,3 +1,3 @@ expected run-time error -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): index out of bounds (8) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): index out of bounds (8) at BPF pc NNNtest/unittest/codegen/err.deref_0.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (0) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address (0) at BPF pc NNNtest/unittest/codegen/err.deref_1.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (1) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNNtest/unittest/codegen/err.deref_i0.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (0) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address (0) at BPF pc NNNtest/unittest/codegen/err.deref_i1.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address (1) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNNtest/unittest/codegen/err.deref_string-assoc.r +1
-1@@ -1,3 +1,3 @@ 66 -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address (1) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNNtest/unittest/codegen/err.deref_string-gvar.r +1
-1@@ -1,3 +1,3 @@ 66 -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address (1) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNNtest/unittest/codegen/err.deref_string-lvar.r +1
-1@@ -1,3 +1,3 @@ 66 -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address (1) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNNtest/unittest/codegen/err.deref_string-tvar.r +1
-1@@ -1,3 +1,3 @@ 66 -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address (1) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address (1) at BPF pc NNNtest/unittest/codegen/err.str_NULL_plus_offset-assoc.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/codegen/err.str_NULL_plus_offset-lvar.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/codegen/err.str_NULL_plus_offset-tvar.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/codegen/err.str_NULL_plus_offset.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/disasm/tst.vartab-bvar.r +1
-1@@ -4,7 +4,7 @@ curthread scl glb r D type (pointer) (size 8) timestamp scl glb r D type (integer) (size 8) vtimestamp scl glb r D type (integer) (size 8) ipl scl glb r D type (integer) (size 4) -epid scl glb r D type (integer) (size 4) +epid scl glb r D type (integer) (size 8) id scl glb r D type (integer) (size 4) arg0 scl glb r D type (integer) (size 8) arg1 scl glb r D type (integer) (size 8)test/unittest/drops/drp.DTRACEDROP_DBLERROR.r +1
-1@@ -4,4 +4,4 @@ -- @@stderr -- dtrace: script 'test/unittest/drops/drp.DTRACEDROP_DBLERROR.d' matched 3 probes dtrace: [DTRACEDROP_DBLERROR] 1 error in ERROR probe enabling -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.d +3
-3@@ -1,6 +1,6 @@ /* * Oracle Linux DTrace. - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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. */@@ -15,13 +15,13 @@ BEGIN { - myepid = epid; + myid = id; trace(((struct task_struct *)NULL)->pid); exit(1); } ERROR { - exit(arg1 != myepid || arg2 != 1 || arg4 != DTRACEFLT_BADADDR || + exit(arg1 != myid || arg2 != 0 || arg4 != DTRACEFLT_BADADDR || arg5 != 0); }test/unittest/error/tst.DTRACEFLT_BADADDR.null_ptr_field.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.DTRACEFLT_BADADDR.r +2
-2@@ -1,6 +1,6 @@ -The arguments are 3 1 1 0 +The arguments are 1 1 1 0 The value of arg4 should be 1 The value of arg5 should be 0 -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.DTRACEFLT_BADADDR2.r +2
-2@@ -1,6 +1,6 @@ -The arguments are 3 1 1 16384 +The arguments are 1 1 1 16384 The value of arg4 should be 1 The value of arg5 should be 16384 -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.DTRACEFLT_DIVZERO.div.d +8
-3@@ -1,6 +1,6 @@ /* * Oracle Linux DTrace. - * Copyright (c) 2006, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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. */@@ -13,9 +13,14 @@ #pragma D option quiet +BEGIN { myid = id } /* clause 0 */ +BEGIN { myid = id } /* clause 1 */ +BEGIN { myid = id } /* clause 2 */ +BEGIN { myid = id } /* clause 3 */ + BEGIN { - myepid = epid; + myid = id; i = 1; j = 2; j = i / (j - 2);@@ -24,6 +29,6 @@ BEGIN ERROR { - exit(arg1 != myepid || arg2 != 1 || arg4 != DTRACEFLT_DIVZERO || + exit(arg1 != myid || arg2 != 4 || arg4 != DTRACEFLT_DIVZERO || arg5 != 0); }test/unittest/error/tst.DTRACEFLT_DIVZERO.div.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): divide-by-zero in action #1 at BPF pc NNN +dtrace: error in dt_clause_4 for probe ID 1 (dtrace:::BEGIN): divide-by-zero at BPF pc NNNtest/unittest/error/tst.DTRACEFLT_DIVZERO.mod.d +8
-3@@ -1,6 +1,6 @@ /* * Oracle Linux DTrace. - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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. */@@ -13,9 +13,14 @@ #pragma D option quiet +BEGIN { myid = id; } /* clause 0 */ +BEGIN { myid = id; } /* clause 1 */ +BEGIN { myid = id; } /* clause 2 */ +BEGIN { myid = id; } /* clause 3 */ + BEGIN { - myepid = epid; + myid = id; i = 1; j = 2; j = i % (j - 2);@@ -24,6 +29,6 @@ BEGIN ERROR { - exit(arg1 != myepid || arg2 != 1 || arg4 != DTRACEFLT_DIVZERO || + exit(arg1 != myid || arg2 != 4 || arg4 != DTRACEFLT_DIVZERO || arg5 != 0); }test/unittest/error/tst.DTRACEFLT_DIVZERO.mod.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): divide-by-zero in action #1 at BPF pc NNN +dtrace: error in dt_clause_4 for probe ID 1 (dtrace:::BEGIN): divide-by-zero at BPF pc NNNtest/unittest/error/tst.DTRACEFLT_UNKNOWN.r +2
-2@@ -1,5 +1,5 @@ -The arguments are 3 1 PC 1 64 +The arguments are 1 1 PC 1 64 The value of arg4 = 0 -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.clause_scope-begin-ended.r +1
-1@@ -2,4 +2,4 @@ Error fired Clause executed -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.clause_scope-begin.r +1
-1@@ -2,4 +2,4 @@ Error fired Clause executed -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.clause_scope-regular.r +1
-1@@ -2,4 +2,4 @@ Error fired Clause executed -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID nnn: profile:::tick-10ms): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID nnn (profile:::tick-10ms): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.clause_scope-regular.r.p +6
-2@@ -1,3 +1,7 @@ -#!/bin/sed -f +#!/usr/bin/awk -f + # This report has a variable probe ID in it. -s/ID [0-9][0-9]*: profile/ID nnn: profile/ +{ + sub("for probe ID [0-9][0-9]* .profile", "for probe ID nnn (profile"); + print; +}test/unittest/error/tst.error.r +1
-1@@ -1,4 +1,4 @@ Error fired -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/error/tst.errorend.r +1
-1@@ -2,4 +2,4 @@ Error fired End fired after exit -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_2 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-bcopy-before-beyond.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-bcopy-before-bottom.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-bcopy-beyond-top.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-bcopy-crossing-bottom.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-bcopy-crossing-top.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-crossing-clauses.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-load-before-bottom.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-load-beyond-top.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-load-crossing-bottom.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-null-deref-lvalue.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-null-deref.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-scratch-exceeding-bcopy.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-store-before-bottom.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-store-beyond-top.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/alloca/err.alloca-store-crossing-bottom.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/bcopy/err.badbcopy1.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/bcopy/err.badbcopy4.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/bcopy/err.badbcopy5.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/bcopy/err.badbcopy6.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNNtest/unittest/funcs/bcopy/err.badbcopy7.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNNtest/unittest/funcs/bcopy/err.badbcopy8.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNNtest/unittest/funcs/copyin/err.badaddr.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyin/err.badaddr.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/copyin/err.null_arg1.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyin/err.null_arg1.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/copyinstr/err.badaddr.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyinstr/err.badaddr.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/copyinstr/err.null_arg1.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyinstr/err.null_arg1.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/copyinto/err.badaddr.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyinto/err.badaddr.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/copyinto/err.badsize.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyinto/err.badsize.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid size ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid size ({ptr}) at BPF pc NNNtest/unittest/funcs/copyinto/err.null_arg1.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/copyinto/err.null_arg1.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/err.badalloca.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID NNN: profile:::tick-1): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID NNN (profile:::tick-1): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/err.badalloca.r.p +6
-2@@ -1,3 +1,7 @@ -#!/bin/sed -f +#!/usr/bin/awk -f -s/(ID [0-9]*/(ID NNN/g +# This report has a variable probe ID in it. +{ + sub("for probe ID [0-9]* .profile", "for probe ID NNN (profile"); + print; +}test/unittest/funcs/err.link_ntopbadaddr.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/err.link_ntopbadarg.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): illegal operation in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): illegal operation at BPF pc NNNtest/unittest/funcs/inet_ntoa6/err.inet_ntoa6.arg1_null.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/inet_ntoa6/err.inet_ntoa6.arg1_null_const.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/strlen/tst.null.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/strtok/tst.strtok_null.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/strtok/tst.strtok_null.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/strtok/tst.strtok_nulldel.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/strtok/tst.strtok_nulldel.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/strtok/tst.strtok_nullstr.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/strtok/tst.strtok_nullstr.d' matched 2 probes -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/strtok/tst.strtok_nullstr2.r +1
-1@@ -4,4 +4,4 @@ -- @@stderr -- dtrace: script 'test/unittest/funcs/strtok/tst.strtok_nullstr2.d' matched 4 probes -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/funcs/substr/err.substr_null_arg1.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/pointers/err.AllocaOverrun.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/pointers/err.BadAlign.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/pointers/err.InvalidAddress2.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/pointers/err.InvalidAddress4.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 3 (ID 1: dtrace:::BEGIN): invalid address ({ptr}) in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): invalid address ({ptr}) at BPF pc NNNtest/unittest/speculation/err.CommitWithInvalid.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): illegal operation in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): illegal operation at BPF pc NNNtest/unittest/speculation/err.DiscardWithInvalid.r +1
-1@@ -1,3 +1,3 @@ -- @@stderr -- -dtrace: error on enabled probe ID 4 (ID 1: dtrace:::BEGIN): illegal operation in action #2 at BPF pc NNN +dtrace: error in dt_clause_1 for probe ID 1 (dtrace:::BEGIN): illegal operation at BPF pc NNNtest/unittest/speculation/tst.SpecSizeVariations.r +0
-22@@ -11,26 +11,6 @@ Speculative buffer ID: 1 123456706 counts: 1 1 -Speculative buffer ID: 1 -123456700 -123456701 -123456702 -123456703 -123456704 -123456705 -123456706 -counts: 1 1 - -Speculative buffer ID: 1 -123456700 -123456701 -123456702 -123456703 -123456704 -123456705 -123456706 -counts: 2 1 - Speculative buffer ID: 1 123456700 123456701@@ -64,5 +44,3 @@ counts: 2 1 dtrace: 2 speculative drops dtrace: 1 speculative drop dtrace: 1 speculative drop -dtrace: 1 speculative drop -dtrace: 1 speculative droptest/unittest/speculation/tst.SpecSizeVariations.sh +1
-1@@ -9,7 +9,7 @@ dtrace=$1 -for x in 63 64 79 80 143 144; do +for x in 71 72 159 160; do $dtrace $dt_flags -xspecsize=$x -qn ' BEGIN {test/unittest/speculation/tst.negcommit.r +1
-1@@ -3,4 +3,4 @@ -- @@stderr -- dtrace: script 'test/unittest/speculation/tst.negcommit.d' matched 2 probes -dtrace: error on enabled probe ID 2 (ID 1: dtrace:::BEGIN): illegal operation in action #1 at BPF pc NNN +dtrace: error in dt_clause_0 for probe ID 1 (dtrace:::BEGIN): illegal operation at BPF pc NNNtest/unittest/variables/bvar/tst.arg3-ERROR-b.sh +1
-1@@ -59,7 +59,7 @@ awk 'BEGIN { next; } - /error on enabled probe/ { + /error in dt_clause_/ { if (!($NF in sites)) { print; print " No call to dt_probe_error found at PC " $NF;test/unittest/variables/bvar/tst.arg3-ERROR.sh +1
-1@@ -120,7 +120,7 @@ done # Do a sanity check on DTrace's error output. -awk '/^dtrace: error on enabled probe ID [0-9]* \(ID 1: dtrace:::BEGIN): invalid address \(0x40) in action #[0-9] at BPF pc [0-9]*$/ { print $NF }' \ +awk '/^dtrace: error in dt_clause_[1-4] for probe ID 1 \(dtrace:::BEGIN): invalid address \(0x40) at BPF pc [0-9]*$/ { print $NF }' \ disasm.out > err_pcs.txt.chk1 if ! diff -q err_pcs.txt err_pcs.txt.chk1; then echo ERROR: problem with DTrace error outputSignature · 1 line
2.43.5
Quoted 11 lines · Kris Van Hees
Quoted 10 lines · Kris Van Hees
Great patch. Found a few smallish things though that we probably want to address before putting this in (potential risks for buffer overruns).
Also, because
dt_stmtsis constructed from the programs being presented for loading by the consumer (which is a 2nd step after the consumer uses libdtrace to compile the statements), it is technically possible that not all elements indt_stmtswill be filled in. There is no guarantee that a consumer will present every compiled program for loading (though in practice that is of course not going to happen).
Quoted 3 lines
Quoted 3 lines
But since libdtrace allows this by design, every indexing of
dt_stmts(there are only a few - marked below) should first make sure that the element is not NULL.
Suggestion patch attached...
libdtrace/dt_handle.c +27 -30
@@ -127,16 +127,13 @@ dt_handle_err(dtrace_hdl_t *dtp, dtrace_probedata_t *data) {dtrace_datadesc_t *dd = data->dtpda_ddesc, *errdd;dtrace_probedesc_t *pd = data->dtpda_pdesc, *errpd; +dtrace_stmtdesc_t *stp;dtrace_errdata_t err;dtrace_id_t prid;dtrace_stid_t stid; -char details[30 ]; -char offinfo[30 ]; -const int slop =80 ; -const char *faultstr; -char *str; -int len; +char *str, *details, *offinfo; +int rc =0 ;assert (dd->dtdd_uarg ==DT_ECB_ERROR );
@@ -164,17 +161,10 @@ dt_handle_err(dtrace_hdl_t *dtp, dtrace_probedata_t *data) err.dteda_fault = (int )DT_REC (uint64_t,3 ); err.dteda_addr =DT_REC (uint64_t,4 ); - faultstr =dtrace_faultstr (dtp, err.dteda_fault); - len =sizeof (offinfo) +strlen (faultstr) + -strlen (errpd->prv) +strlen (errpd->mod) +strlen (errpd->fun) + -strlen (errpd->prb) + slop; - - str = (char *)alloca (len); -if (err.dteda_offset !=-1 ) -sprintf (offinfo," at BPF pc %d" , err.dteda_offset); +asprintf (&offinfo," at BPF pc %d" , err.dteda_offset);else - offinfo[0 ] =0 ; + offinfo ="" ;switch (err.dteda_fault) {case DTRACEFLT_BADADDR :
@@ -183,33 +173,38 @@ dt_handle_err(dtrace_hdl_t *dtp, dtrace_probedata_t *data)case DTRACEFLT_BADALIGN :case DTRACEFLT_BADSTACK :case DTRACEFLT_BADSIZE : -sprintf (details," (0x%llx)" , (unsigned long long )err.dteda_addr); +asprintf (&details," (0x%llx)" , (unsigned long long )err.dteda_addr);break ;case DTRACEFLT_BADINDEX : -sprintf (details," (%ld)" , (int64_t )err.dteda_addr); +asprintf (&details," (%ld)" , (int64_t )err.dteda_addr);break ;default : no_addr: - details[0 ] =0 ; + details ="" ; } -snprintf (str, len,"error in %s for probe ID %u (%s:%s:%s:%s): " -"%s%s%s" , - dtp->dt_stmts[stid]->dtsd_clause->di_name, - errpd->id, errpd->prv, errpd->mod, errpd->fun, - errpd->prb,dtrace_faultstr (dtp, err.dteda_fault), details, - offinfo); + stp = dtp->dt_stmts[stid]; +assert (stp !=NULL ); +asprintf (&str,"error in %s for probe ID %u (%s:%s:%s:%s): %s%s%s" , + stp->dtsd_clause->di_name, errpd->id, errpd->prv, errpd->mod, + errpd->fun, errpd->prb,dtrace_faultstr (dtp, err.dteda_fault), + details, offinfo); err.dteda_msg = str;if (dtp->dt_errhdlr ==NULL ) -return dt_set_errno (dtp,EDT_ERRABORT ); + rc =dt_set_errno (dtp,EDT_ERRABORT ); +else if ((*dtp->dt_errhdlr)(&err, dtp->dt_errarg) ==DTRACE_HANDLE_ABORT ) + rc =dt_set_errno (dtp,EDT_ERRABORT ); -if ((*dtp->dt_errhdlr)(&err, dtp->dt_errarg) ==DTRACE_HANDLE_ABORT ) -return dt_set_errno (dtp,EDT_ERRABORT ); +free (str); +if (offinfo[0 ] !=0 ) +free (offinfo); +if (details[0 ] !=0 ) +free (details); -return 0 ; +return rc; }int
@@ -237,6 +232,7 @@ dt_handle_liberr(dtrace_hdl_t *dtp, const dtrace_probedata_t *data, const char *faultstr) {dtrace_probedesc_t *errpd = data->dtpda_pdesc; +dtrace_stmtdesc_t *stp;dtrace_errdata_t err;const int slop =80 ;char *str;
@@ -255,10 +251,11 @@ dt_handle_liberr(dtrace_hdl_t *dtp, const dtrace_probedata_t *data, str =alloca (len); + stp = dtp->dt_stmts[data->dtpda_stid]; +assert (stp !=NULL );snprintf (str, len,"error in %s for probe ID %u (%s:%s:%s:%s): %s" , - dtp->dt_stmts[data->dtpda_stid]->dtsd_clause->di_name, - errpd->id, errpd->prv, errpd->mod, + stp->dtsd_clause->di_name, errpd->id, errpd->prv, errpd->mod, errpd->fun, errpd->prb, faultstr); err.dteda_msg = str;
libdtrace/dt_map.c +4 -1
@@ -89,11 +89,14 @@ int dt_stid_lookup(dtrace_hdl_t *dtp, dtrace_stid_t stid, dtrace_datadesc_t **ddp) {dtrace_difo_t *rdp; +dtrace_stmtdesc_t *stp;if (stid >= dtp->dt_stmt_nextid)return -1 ; - rdp =dt_dlib_get_func_difo (dtp, dtp->dt_stmts[stid]->dtsd_clause); + stp = dtp->dt_stmts[stid]; +assert (stp !=NULL ); + rdp =dt_dlib_get_func_difo (dtp, stp->dtsd_clause); *ddp = rdp->dtdo_ddesc;return (*ddp ==NULL ) ?-1 :0 ;