From 20e5bddd163ba99846a81785932ad257dd6496b4 Mon Sep 17 00:00:00 2001 From: ValentaTomas Date: Tue, 19 May 2026 23:54:21 -0700 Subject: [PATCH 1/4] fix(orchestrator): pin UFFD copy source buffers --- packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go b/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go index 05017778a1..48d7ba5c4a 100644 --- a/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go +++ b/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go @@ -32,6 +32,7 @@ import "C" import ( "fmt" + "runtime" "syscall" "unsafe" ) @@ -150,6 +151,10 @@ type Fd uintptr // copy requires UFFDIO_COPY_MODE_WP when both MISSING and WP tracking are active. func (f Fd) copy(addr, pagesize uintptr, data []byte, mode CULong) error { + var pinner runtime.Pinner + pinner.Pin(&data[0]) + defer pinner.Unpin() + cpy := newUffdioCopy(data, CULong(addr)&^CULong(pagesize-1), CULong(pagesize), mode, 0) if _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(f), UFFDIO_COPY, uintptr(unsafe.Pointer(&cpy))); errno != 0 { From ce8c18c158d830f04568c9a7a28b97504a04dfa4 Mon Sep 17 00:00:00 2001 From: ValentaTomas Date: Tue, 19 May 2026 23:57:35 -0700 Subject: [PATCH 2/4] fix(orchestrator): document UFFD copy pinning --- packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go b/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go index 48d7ba5c4a..523728ed4e 100644 --- a/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go +++ b/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go @@ -151,6 +151,7 @@ type Fd uintptr // copy requires UFFDIO_COPY_MODE_WP when both MISSING and WP tracking are active. func (f Fd) copy(addr, pagesize uintptr, data []byte, mode CULong) error { + // UFFDIO_COPY hides src as an integer, so keep data pinned while the kernel reads it. var pinner runtime.Pinner pinner.Pin(&data[0]) defer pinner.Unpin() From 44869acc91ce23747201cc1b58872a9ca19baf0b Mon Sep 17 00:00:00 2001 From: ValentaTomas Date: Wed, 20 May 2026 00:00:42 -0700 Subject: [PATCH 3/4] fix(orchestrator): guard empty UFFD copy buffers --- packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go b/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go index 523728ed4e..27d4c52693 100644 --- a/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go +++ b/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go @@ -151,6 +151,10 @@ type Fd uintptr // copy requires UFFDIO_COPY_MODE_WP when both MISSING and WP tracking are active. func (f Fd) copy(addr, pagesize uintptr, data []byte, mode CULong) error { + if len(data) == 0 { + return fmt.Errorf("cannot copy from an empty buffer") + } + // UFFDIO_COPY hides src as an integer, so keep data pinned while the kernel reads it. var pinner runtime.Pinner pinner.Pin(&data[0]) From d74c6106414fa0462e4eb8accb9458e53f43e553 Mon Sep 17 00:00:00 2001 From: ValentaTomas Date: Wed, 20 May 2026 00:55:37 -0700 Subject: [PATCH 4/4] fix(orchestrator): satisfy uffd lint --- packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go b/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go index 27d4c52693..d7102afe7a 100644 --- a/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go +++ b/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/fd.go @@ -31,6 +31,7 @@ struct uffd_remove { import "C" import ( + "errors" "fmt" "runtime" "syscall" @@ -152,7 +153,7 @@ type Fd uintptr // copy requires UFFDIO_COPY_MODE_WP when both MISSING and WP tracking are active. func (f Fd) copy(addr, pagesize uintptr, data []byte, mode CULong) error { if len(data) == 0 { - return fmt.Errorf("cannot copy from an empty buffer") + return errors.New("cannot copy from an empty buffer") } // UFFDIO_COPY hides src as an integer, so keep data pinned while the kernel reads it.