[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