Files
go-fuse/fuse/poll_darwin.go
Han-Wen Nienhuys cfa748f586 fuse: pretend EPERM is success for the poll hack on macos
On macos, "Full Disk Access" privilege determines access to the
mountpoint, and apparently it's possible to deny the FUSE server
access to its own mount point. Pretend pollhack was successful,
because we can't deadlock ourselves in that case anyway.

Addresses https://github.com/hanwen/go-fuse/issues/572

Change-Id: Id00000003675a5f91e4243607ba93fbc4a09dc53
2025-06-11 09:15:48 +02:00

57 lines
1.2 KiB
Go

package fuse
import (
"path/filepath"
"syscall"
"unsafe"
)
type pollFd struct {
Fd int32
Events int16
Revents int16
}
func sysPoll(fds []pollFd, timeout int) (n int, err error) {
r0, _, e1 := syscall.Syscall(syscall.SYS_POLL, uintptr(unsafe.Pointer(&fds[0])),
uintptr(len(fds)), uintptr(timeout))
n = int(r0)
if e1 != 0 {
err = syscall.Errno(e1)
}
return n, err
}
func pollHack(mountPoint string) error {
const (
POLLIN = 0x1
POLLPRI = 0x2
POLLOUT = 0x4
POLLRDHUP = 0x2000
POLLERR = 0x8
POLLHUP = 0x10
)
fd, err := syscall.Open(filepath.Join(mountPoint, pollHackName), syscall.O_RDONLY, 0)
if err == syscall.EPERM {
// This can happen due to macos sandboxing, see
// https://github.com/hanwen/go-fuse/issues/572#issuecomment-2904052441
// If we don't have access to access our own mount
// point, we also can't deadlock ourselves with poll, so this is fine.
return nil
}
if err != nil {
return err
}
pollData := []pollFd{{
Fd: int32(fd),
Events: POLLIN | POLLPRI | POLLOUT,
}}
// Trigger _OP_POLL, so we can say ENOSYS. We don't care about
// the return value.
sysPoll(pollData, 0)
syscall.Close(fd)
return nil
}