summaryrefslogtreecommitdiff
path: root/internal/eventloop.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-08 08:47:21 +0200
committerPaul Buetow <paul@buetow.org>2026-03-08 08:47:21 +0200
commitc67887f9abbfb726d20d1fa67dca0041a97398bc (patch)
tree406696a8d6a86961b993da6612866e816b724925 /internal/eventloop.go
parenteca6d22322f99556c77867c11fd5205167af8d98 (diff)
task(ior): harden malformed raw-event decoding (task ed7a7a3f)
Diffstat (limited to 'internal/eventloop.go')
-rw-r--r--internal/eventloop.go88
1 files changed, 76 insertions, 12 deletions
diff --git a/internal/eventloop.go b/internal/eventloop.go
index 26eaafc..2def4c0 100644
--- a/internal/eventloop.go
+++ b/internal/eventloop.go
@@ -408,46 +408,106 @@ func (e *eventLoop) initRawHandlers() {
}
e.rawHandlers[types.ENTER_OPEN_EVENT] = func(raw []byte, _ chan<- *event.Pair) {
- if ev, ok := e.filter.openEvent(types.NewOpenEventFast(raw)); ok {
+ openEv := types.NewOpenEventFast(raw)
+ if openEv == nil {
+ e.dropMalformedRawEvent(types.ENTER_OPEN_EVENT, raw)
+ return
+ }
+ if ev, ok := e.filter.openEvent(openEv); ok {
e.tracepointEntered(ev)
}
}
e.rawHandlers[types.EXIT_OPEN_EVENT] = func(raw []byte, ch chan<- *event.Pair) {
- e.tracepointExited(types.NewRetEventFast(raw), ch)
+ retEv := types.NewRetEventFast(raw)
+ if retEv == nil {
+ e.dropMalformedRawEvent(types.EXIT_OPEN_EVENT, raw)
+ return
+ }
+ e.tracepointExited(retEv, ch)
}
e.rawHandlers[types.ENTER_FD_EVENT] = func(raw []byte, _ chan<- *event.Pair) {
- e.tracepointEntered(types.NewFdEventFast(raw))
+ fdEv := types.NewFdEventFast(raw)
+ if fdEv == nil {
+ e.dropMalformedRawEvent(types.ENTER_FD_EVENT, raw)
+ return
+ }
+ e.tracepointEntered(fdEv)
}
e.rawHandlers[types.EXIT_FD_EVENT] = func(raw []byte, ch chan<- *event.Pair) {
- e.tracepointExited(types.NewFdEventFast(raw), ch)
+ fdEv := types.NewFdEventFast(raw)
+ if fdEv == nil {
+ e.dropMalformedRawEvent(types.EXIT_FD_EVENT, raw)
+ return
+ }
+ e.tracepointExited(fdEv, ch)
}
e.rawHandlers[types.ENTER_NULL_EVENT] = func(raw []byte, _ chan<- *event.Pair) {
- e.tracepointEntered(types.NewNullEventFast(raw))
+ nullEv := types.NewNullEventFast(raw)
+ if nullEv == nil {
+ e.dropMalformedRawEvent(types.ENTER_NULL_EVENT, raw)
+ return
+ }
+ e.tracepointEntered(nullEv)
}
e.rawHandlers[types.EXIT_NULL_EVENT] = func(raw []byte, ch chan<- *event.Pair) {
- e.tracepointExited(types.NewNullEventFast(raw), ch)
+ nullEv := types.NewNullEventFast(raw)
+ if nullEv == nil {
+ e.dropMalformedRawEvent(types.EXIT_NULL_EVENT, raw)
+ return
+ }
+ e.tracepointExited(nullEv, ch)
}
e.rawHandlers[types.EXIT_RET_EVENT] = func(raw []byte, ch chan<- *event.Pair) {
- e.tracepointExited(types.NewRetEventFast(raw), ch)
+ retEv := types.NewRetEventFast(raw)
+ if retEv == nil {
+ e.dropMalformedRawEvent(types.EXIT_RET_EVENT, raw)
+ return
+ }
+ e.tracepointExited(retEv, ch)
}
e.rawHandlers[types.ENTER_NAME_EVENT] = func(raw []byte, _ chan<- *event.Pair) {
- if ev, ok := e.filter.nameEvent(types.NewNameEventFast(raw)); ok {
+ nameEv := types.NewNameEventFast(raw)
+ if nameEv == nil {
+ e.dropMalformedRawEvent(types.ENTER_NAME_EVENT, raw)
+ return
+ }
+ if ev, ok := e.filter.nameEvent(nameEv); ok {
e.tracepointEntered(ev)
}
}
e.rawHandlers[types.ENTER_PATH_EVENT] = func(raw []byte, _ chan<- *event.Pair) {
- if ev, ok := e.filter.pathEvent(types.NewPathEventFast(raw)); ok {
+ pathEv := types.NewPathEventFast(raw)
+ if pathEv == nil {
+ e.dropMalformedRawEvent(types.ENTER_PATH_EVENT, raw)
+ return
+ }
+ if ev, ok := e.filter.pathEvent(pathEv); ok {
e.tracepointEntered(ev)
}
}
e.rawHandlers[types.ENTER_FCNTL_EVENT] = func(raw []byte, _ chan<- *event.Pair) {
- e.tracepointEntered(types.NewFcntlEventFast(raw))
+ fcntlEv := types.NewFcntlEventFast(raw)
+ if fcntlEv == nil {
+ e.dropMalformedRawEvent(types.ENTER_FCNTL_EVENT, raw)
+ return
+ }
+ e.tracepointEntered(fcntlEv)
}
e.rawHandlers[types.ENTER_OPEN_BY_HANDLE_AT_EVENT] = func(raw []byte, _ chan<- *event.Pair) {
- e.tracepointEntered(types.NewOpenByHandleAtEventFast(raw))
+ openByHandleEv := types.NewOpenByHandleAtEventFast(raw)
+ if openByHandleEv == nil {
+ e.dropMalformedRawEvent(types.ENTER_OPEN_BY_HANDLE_AT_EVENT, raw)
+ return
+ }
+ e.tracepointEntered(openByHandleEv)
}
e.rawHandlers[types.ENTER_DUP3_EVENT] = func(raw []byte, _ chan<- *event.Pair) {
- e.tracepointEntered(types.NewDup3EventFast(raw))
+ dup3Ev := types.NewDup3EventFast(raw)
+ if dup3Ev == nil {
+ e.dropMalformedRawEvent(types.ENTER_DUP3_EVENT, raw)
+ return
+ }
+ e.tracepointEntered(dup3Ev)
}
}
@@ -849,6 +909,10 @@ func (e *eventLoop) notifyWarning(message string) {
e.warningCb(message)
}
+func (e *eventLoop) dropMalformedRawEvent(evType types.EventType, raw []byte) {
+ e.notifyWarning(fmt.Sprintf("Dropped malformed raw event type %d (len=%d)", evType, len(raw)))
+}
+
func (e *eventLoop) resolveFdFile(fd int32, pid uint32) file.File {
if fdFile, ok := e.fdState().get(fd); ok {
return fdFile