[DTrace-devel] [PATCH v6 03/19] Deprecate enabled probe ID (epid)
Kris Van Hees
kris.van.hees at oracle.com
Thu Sep 19 10:47:02 UTC 2024
On Thu, Sep 19, 2024 at 06:25:40AM -0400, Kris Van Hees wrote:
> On Thu, Sep 19, 2024 at 05:57:19AM -0400, Kris Van Hees wrote:
> > 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.
Suggestion patch attached...
-------------- next part --------------
diff --git a/libdtrace/dt_handle.c b/libdtrace/dt_handle.c
index 3c118545..da70318d 100644
--- a/libdtrace/dt_handle.c
+++ b/libdtrace/dt_handle.c
@@ -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;
diff --git a/libdtrace/dt_map.c b/libdtrace/dt_map.c
index 50d0aaa7..9baf94d9 100644
--- a/libdtrace/dt_map.c
+++ b/libdtrace/dt_map.c
@@ -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;
More information about the DTrace-devel
mailing list