summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-02-21 12:45:10 +0200
committerPaul Buetow <paul@buetow.org>2026-02-21 12:45:10 +0200
commit6c4f68164df93ed70123db61fb32a9688f5b0623 (patch)
treeb356faff9744edd63a78ff60cc62db924c2ad1c3 /internal
parent480162734c196b4b966a7f5a1c5df3749cd129c6 (diff)
Handle open_by_handle_at without pathname
Amp-Thread-ID: https://ampcode.com/threads/T-019c7faf-baaa-704f-af15-8aeba9df4628 Co-authored-by: Amp <amp@ampcode.com>
Diffstat (limited to 'internal')
-rw-r--r--internal/eventloop.go24
1 files changed, 13 insertions, 11 deletions
diff --git a/internal/eventloop.go b/internal/eventloop.go
index 3dd25ac..cf128d2 100644
--- a/internal/eventloop.go
+++ b/internal/eventloop.go
@@ -306,13 +306,6 @@ func (e *eventLoop) tracepointExited(exitEv event.Event, ch chan<- *event.Pair)
case *OpenByHandleAtEvent:
tid := ep.EnterEv.GetTid()
- pathname, ok := e.pendingHandles[tid]
- if !ok {
- ep.Recycle()
- return
- }
- delete(e.pendingHandles, tid)
-
retEvent, ok := ep.ExitEv.(*RetEvent)
if !ok {
panic("expected *types.RetEvent for open_by_handle_at exit")
@@ -320,10 +313,19 @@ func (e *eventLoop) tracepointExited(exitEv event.Event, ch chan<- *event.Pair)
if fd := int32(retEvent.Ret); fd >= 0 {
openByHandleEv := ep.EnterEv.(*OpenByHandleAtEvent)
-
- file := file.NewFd(fd, pathname, openByHandleEv.Flags)
- e.files[fd] = file
- ep.File = file
+ if pathname, ok := e.pendingHandles[tid]; ok {
+ delete(e.pendingHandles, tid)
+ file := file.NewFd(fd, pathname, openByHandleEv.Flags)
+ e.files[fd] = file
+ ep.File = file
+ } else {
+ fdFile := file.NewFdWithPid(fd, v.Pid)
+ if fdFile.Flags() == file.Flags(-1) {
+ fdFile.SetFlags(openByHandleEv.Flags)
+ }
+ e.files[fd] = fdFile
+ ep.File = fdFile
+ }
ep.Comm = e.comm(tid)
} else {
ep.Recycle()