[DTrace-devel] [PATCH v2 13/16 was 11/12] Abort if provider population fails for any provider
Kris Van Hees
kris.van.hees at oracle.com
Fri Jan 12 06:04:06 UTC 2024
Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
libdtrace/dt_open.c | 5 ++++-
libdtrace/dt_prov_cpc.c | 8 +++++---
libdtrace/dt_prov_dtrace.c | 4 ++--
libdtrace/dt_prov_fbt.c | 4 ++--
libdtrace/dt_prov_ip.c | 2 +-
libdtrace/dt_prov_lockstat.c | 2 +-
libdtrace/dt_prov_proc.c | 2 +-
libdtrace/dt_prov_profile.c | 4 ++--
libdtrace/dt_prov_rawtp.c | 4 ++--
libdtrace/dt_prov_sched.c | 2 +-
libdtrace/dt_prov_sdt.c | 4 ++--
libdtrace/dt_prov_syscall.c | 4 ++--
libdtrace/dt_prov_uprobe.c | 16 ++++++++++------
libdtrace/dt_provider.c | 18 +++++++++++-------
libdtrace/dt_provider_sdt.c | 6 +++---
15 files changed, 49 insertions(+), 36 deletions(-)
diff --git a/libdtrace/dt_open.c b/libdtrace/dt_open.c
index c5bbab1a..0be0ce9d 100644
--- a/libdtrace/dt_open.c
+++ b/libdtrace/dt_open.c
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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.
*/
@@ -1208,6 +1208,9 @@ dtrace_init(dtrace_hdl_t *dtp)
int n;
n = dt_providers[i]->populate(dtp);
+ if (n < 0)
+ return -1; /* errno is already set */
+
dt_dprintf("loaded %d probes for %s\n", n,
dt_providers[i]->name);
}
diff --git a/libdtrace/dt_prov_cpc.c b/libdtrace/dt_prov_cpc.c
index 4062eaa6..3bb1aaa2 100644
--- a/libdtrace/dt_prov_cpc.c
+++ b/libdtrace/dt_prov_cpc.c
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 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.
*
@@ -82,13 +82,15 @@ static int populate(dtrace_hdl_t *dtp)
dt_provider_t *prv;
if (listp == NULL)
- return 0;
+ return dt_set_errno(dtp, EDT_NOMEM);
prv = dt_provider_create(dtp, prvname, &dt_cpc, &pattr, listp);
+ if (prv == NULL)
+ return -1; /* errno already set */
/* incidentally, pfm_strerror(pfm_initialize()) describes the error */
if (pfm_initialize() != PFM_SUCCESS)
- return 0;
+ return dt_set_errno(dtp, EDT_ERRABORT);
/* loop over PMUs (FWIW, ipmu=PFM_PMU_PERF_EVENT is among them) */
for (pfm_pmu_t ipmu = PFM_PMU_NONE; ipmu < PFM_PMU_MAX; ipmu ++) {
diff --git a/libdtrace/dt_prov_dtrace.c b/libdtrace/dt_prov_dtrace.c
index 47427455..5b40038c 100644
--- a/libdtrace/dt_prov_dtrace.c
+++ b/libdtrace/dt_prov_dtrace.c
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 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.
*
@@ -42,7 +42,7 @@ static int populate(dtrace_hdl_t *dtp)
prv = dt_provider_create(dtp, prvname, &dt_dtrace, &pattr, NULL);
if (prv == NULL)
- return 0;
+ return -1; /* errno already set */
prp = dt_tp_probe_insert(dtp, prv, prvname, modname, funname, "BEGIN");
if (prp) {
diff --git a/libdtrace/dt_prov_fbt.c b/libdtrace/dt_prov_fbt.c
index 92ac4ec4..ff9cfec5 100644
--- a/libdtrace/dt_prov_fbt.c
+++ b/libdtrace/dt_prov_fbt.c
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 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.
*
@@ -71,7 +71,7 @@ static int populate(dtrace_hdl_t *dtp)
prv = dt_provider_create(dtp, prvname, &dt_fbt, &pattr, NULL);
if (prv == NULL)
- return 0;
+ return -1; /* errno already set */
f = fopen(PROBE_LIST, "r");
if (f == NULL)
diff --git a/libdtrace/dt_prov_ip.c b/libdtrace/dt_prov_ip.c
index 03e929b6..7d2a8dee 100644
--- a/libdtrace/dt_prov_ip.c
+++ b/libdtrace/dt_prov_ip.c
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 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.
*
diff --git a/libdtrace/dt_prov_lockstat.c b/libdtrace/dt_prov_lockstat.c
index 5e81094a..1a64a8bd 100644
--- a/libdtrace/dt_prov_lockstat.c
+++ b/libdtrace/dt_prov_lockstat.c
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 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.
*
diff --git a/libdtrace/dt_prov_proc.c b/libdtrace/dt_prov_proc.c
index b59aa6a3..8ff8e105 100644
--- a/libdtrace/dt_prov_proc.c
+++ b/libdtrace/dt_prov_proc.c
@@ -123,7 +123,7 @@ static int populate(dtrace_hdl_t *dtp)
prv = dt_provider_create(dtp, prvname, &dt_proc, &pattr, NULL);
if (prv == NULL)
- return 0;
+ return -1; /* errno already set */
/*
* Create "proc" probes based on the probe_args list. Since each probe
diff --git a/libdtrace/dt_prov_profile.c b/libdtrace/dt_prov_profile.c
index 16345d32..72156f5d 100644
--- a/libdtrace/dt_prov_profile.c
+++ b/libdtrace/dt_prov_profile.c
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 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.
*
@@ -78,7 +78,7 @@ static int populate(dtrace_hdl_t *dtp)
prv = dt_provider_create(dtp, prvname, &dt_profile, &pattr, NULL);
if (prv == NULL)
- return 0;
+ return -1; /* errno already set */
for (i = 0; i < ARRAY_SIZE(profile_n); i++) {
snprintf(buf, sizeof(buf), PREFIX_PROFILE "%d", profile_n[i]);
diff --git a/libdtrace/dt_prov_rawtp.c b/libdtrace/dt_prov_rawtp.c
index 67c94f10..c604fa3c 100644
--- a/libdtrace/dt_prov_rawtp.c
+++ b/libdtrace/dt_prov_rawtp.c
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 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.
*
@@ -73,7 +73,7 @@ static int populate(dtrace_hdl_t *dtp)
prv = dt_provider_create(dtp, prvname, &dt_rawtp, &pattr, NULL);
if (prv == NULL)
- return 0;
+ return -1; /* errno already set */
f = fopen(PROBE_LIST, "r");
if (f == NULL)
diff --git a/libdtrace/dt_prov_sched.c b/libdtrace/dt_prov_sched.c
index 8703c936..6d6f2679 100644
--- a/libdtrace/dt_prov_sched.c
+++ b/libdtrace/dt_prov_sched.c
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 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.
*
diff --git a/libdtrace/dt_prov_sdt.c b/libdtrace/dt_prov_sdt.c
index 8690fc47..7742ffac 100644
--- a/libdtrace/dt_prov_sdt.c
+++ b/libdtrace/dt_prov_sdt.c
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 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.
*
@@ -70,7 +70,7 @@ static int populate(dtrace_hdl_t *dtp)
prv = dt_provider_create(dtp, prvname, &dt_sdt, &pattr, NULL);
if (prv == NULL)
- return 0;
+ return -1; /* errno already set */
f = fopen(PROBE_LIST, "r");
if (f == NULL)
diff --git a/libdtrace/dt_prov_syscall.c b/libdtrace/dt_prov_syscall.c
index d2f2aac1..9e048ae5 100644
--- a/libdtrace/dt_prov_syscall.c
+++ b/libdtrace/dt_prov_syscall.c
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 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.
*
@@ -77,7 +77,7 @@ static int populate(dtrace_hdl_t *dtp)
prv = dt_provider_create(dtp, prvname, &dt_syscall, &pattr, NULL);
if (prv == NULL)
- return 0;
+ return -1; /* errno already set */
f = fopen(PROBE_LIST, "r");
if (f == NULL)
diff --git a/libdtrace/dt_prov_uprobe.c b/libdtrace/dt_prov_uprobe.c
index 5dc5c75c..6c3b004f 100644
--- a/libdtrace/dt_prov_uprobe.c
+++ b/libdtrace/dt_prov_uprobe.c
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2021, 2023, 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.
*
@@ -62,11 +62,15 @@ dt_provimpl_t dt_usdt;
static int populate(dtrace_hdl_t *dtp)
{
- dt_provider_create(dtp, dt_uprobe.name, &dt_uprobe, &pattr, NULL);
- dt_provider_create(dtp, dt_uprobe_is_enabled.name,
- &dt_uprobe_is_enabled, &pattr, NULL);
- dt_provider_create(dtp, dt_pid.name, &dt_pid, &pattr, NULL);
- dt_provider_create(dtp, dt_usdt.name, &dt_usdt, &pattr, NULL);
+ if (dt_provider_create(dtp, dt_uprobe.name, &dt_uprobe, &pattr,
+ NULL) == NULL ||
+ dt_provider_create(dtp, dt_uprobe_is_enabled.name,
+ &dt_uprobe_is_enabled, &pattr, NULL) == NULL ||
+ dt_provider_create(dtp, dt_pid.name, &dt_pid, &pattr,
+ NULL) == NULL ||
+ dt_provider_create(dtp, dt_usdt.name, &dt_usdt, &pattr,
+ NULL) == NULL)
+ return -1; /* errno already set */
return 0;
}
diff --git a/libdtrace/dt_provider.c b/libdtrace/dt_provider.c
index b601c31a..8cfef0ba 100644
--- a/libdtrace/dt_provider.c
+++ b/libdtrace/dt_provider.c
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2006, 2023, 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.
*/
@@ -100,7 +100,7 @@ dt_provider_create(dtrace_hdl_t *dtp, const char *name,
dt_provider_t *pvp;
if ((pvp = dt_zalloc(dtp, sizeof(dt_provider_t))) == NULL)
- return NULL;
+ goto nomem;
strlcpy(pvp->desc.dtvd_name, name, DTRACE_PROVNAMELEN);
pvp->impl = impl;
@@ -110,15 +110,19 @@ dt_provider_create(dtrace_hdl_t *dtp, const char *name,
pvp->prv_data = datap;
dt_dprintf("creating provider %s\n", name);
- if (pvp->pv_probes == NULL) {
- dt_free(dtp, pvp);
- dt_set_errno(dtp, EDT_NOMEM);
- return NULL;
- }
+ if (pvp->pv_probes == NULL)
+ goto nomem;
memcpy(&pvp->desc.dtvd_attr, pattr, sizeof(dtrace_pattr_t));
return dt_provider_insert(dtp, pvp);
+
+nomem:
+ if (pvp)
+ dt_free(dtp, pvp);
+
+ dt_set_errno(dtp, EDT_NOMEM);
+ return NULL;
}
int
diff --git a/libdtrace/dt_provider_sdt.c b/libdtrace/dt_provider_sdt.c
index 823e9b2a..a81668fb 100644
--- a/libdtrace/dt_provider_sdt.c
+++ b/libdtrace/dt_provider_sdt.c
@@ -1,6 +1,6 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2021, 2023, 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.
*
@@ -34,13 +34,13 @@ dt_sdt_populate(dtrace_hdl_t *dtp, const char *prvname, const char *modname,
sdp = dt_alloc(dtp, sizeof(sdt_data_t));
if (sdp == NULL)
- return 0;
+ return dt_set_errno(dtp, EDT_NOMEM);
sdp->probes = probes;
sdp->probe_args = probe_args;
prv = dt_provider_create(dtp, prvname, ops, pattr, sdp);
if (prv == NULL)
- return 0;
+ return -1; /* errno already set */
/*
* Create SDT probes based on the probe_args list. Since each probe
--
2.42.0
More information about the DTrace-devel
mailing list