[DTrace-devel] [PATCH 38/47] Ensure that the buffer size is big enough for at least one sample
Kris Van Hees
kris.van.hees at oracle.com
Sun May 3 20:18:08 PDT 2020
Orabug: 31220520
Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
libdtrace/dt_work.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/libdtrace/dt_work.c b/libdtrace/dt_work.c
index 3485c770..9b898b0a 100644
--- a/libdtrace/dt_work.c
+++ b/libdtrace/dt_work.c
@@ -13,6 +13,7 @@
#include <time.h>
#include <libproc.h>
#include <port.h>
+#include <linux/perf_event.h>
#include <sys/epoll.h>
static const struct {
@@ -209,7 +210,17 @@ dtrace_go(dtrace_hdl_t *dtp)
if (dtp->dt_poll_fd < 0)
return dt_set_errno(dtp, errno);
+ /*
+ * We need enough space for the pref_event_header, a 32-bit size, a
+ * 4-byte gap, and the largest trace data record we may be writing to
+ * the buffer. In other words, the buffer needs to be large enough to
+ * hold at least one perf-encapsulated trace data record.
+ */
dtrace_getopt(dtp, "bufsize", &size);
+ if (size == 0 ||
+ size < sizeof(struct perf_event_header) + sizeof(uint32_t) +
+ dtp->dt_maxreclen)
+ return dt_set_errno(dtp, EDT_BUFTOOSMALL);
if (dt_pebs_init(dtp, size) == -1)
return dt_set_errno(dtp, EDT_NOMEM);
--
2.26.0
More information about the DTrace-devel
mailing list