Skip to content

Commit d89b81f

Browse files
committed
Add userfaultfd write protection methods
1 parent 8906575 commit d89b81f

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

packages/orchestrator/internal/sandbox/uffd/userfaultfd/userfaultfd.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,25 @@ func (u *userfaultfd) Register(addr uintptr, size uint64, mode CULong) error {
6565
return nil
6666
}
6767

68+
func (u *userfaultfd) writeProtect(addr uintptr, size uint64, mode CULong) error {
69+
register := NewUffdioWriteProtect(CULong(addr), CULong(size), mode)
70+
71+
ret, _, errno := syscall.Syscall(syscall.SYS_IOCTL, u.fd, UFFDIO_WRITEPROTECT, uintptr(unsafe.Pointer(&register)))
72+
if errno != 0 {
73+
return fmt.Errorf("UFFDIO_WRITEPROTECT ioctl failed: %w (ret=%d)", errno, ret)
74+
}
75+
76+
return nil
77+
}
78+
79+
func (u *userfaultfd) RemoveWriteProtection(addr uintptr, size uint64) error {
80+
return u.writeProtect(addr, size, 0)
81+
}
82+
83+
func (u *userfaultfd) AddWriteProtection(addr uintptr, size uint64) error {
84+
return u.writeProtect(addr, size, UFFDIO_WRITEPROTECT_MODE_WP)
85+
}
86+
6887
// mode: UFFDIO_COPY_MODE_WP
6988
// When we use both missing and wp, we need to use UFFDIO_COPY_MODE_WP, otherwise copying would unprotect the page
7089
func (u *userfaultfd) copy(addr uintptr, data []byte, pagesize uint64, mode CULong) error {

0 commit comments

Comments
 (0)