greuse icon indicating copy to clipboard operation
greuse copied to clipboard

Panics with Unix socket

Open yoursunny opened this issue 6 months ago • 0 comments

Compiler: go version go1.24.5 linux/amd64 OS: Ubuntu 24.04 Kernel: 6.8.0-63-generic

Snippet:

package main

import (
	"net"

	"github.com/gogf/greuse"
)

func main() {
	dialer := net.Dialer{
		Control: greuse.Control,
	}
	dialer.Dial("unix", "/tmp/1.sock")
}

Error:

$ go run main.go
panic: operation not supported

goroutine 1 [running]:
github.com/gogf/greuse.Control.func1(0x3)
        /home/ubuntu/go/pkg/mod/github.com/gogf/[email protected]/greuse_unix.go:23 +0xce
internal/poll.(*FD).RawControl(0xc00006b600?, 0x4149e5?)
        /usr/local/go/src/internal/poll/fd_posix.go:61 +0xe2
net.(*rawConn).Control(0xc00005a050, 0x46a919?)
        /usr/local/go/src/net/rawconn.go:32 +0x36
github.com/gogf/greuse.Control({0x423c1c?, 0xc00006b668?}, {0x4149e5?, 0x8?}, {0x5240c0, 0xc00005a050})
        /home/ubuntu/go/pkg/mod/github.com/gogf/[email protected]/greuse_unix.go:16 +0x77
net.(*sysDialer).dialUnix.func1({0x41b4d6?, 0x5ebe80?}, {0x4f859e?, 0x414005?}, {0x4f9399?, 0x14?}, {0x5240c0?, 0xc00005a050?})
        /usr/local/go/src/net/unixsock_posix.go:161 +0x43
net.(*netFD).dial(0xc0000a6000, {0x5240f0, 0x5eb060}, {0x0, 0x0}, {0x524508, 0xc000076040}, 0xc00006b8f8)
        /usr/local/go/src/net/sock_posix.go:102 +0x28d
net.socket({0x5240f0, 0x5eb060}, {0x4f859e, 0x4}, 0x1, 0x1, 0x0?, 0x0, {0x0, 0x0}, ...)
        /usr/local/go/src/net/sock_posix.go:70 +0x29b
net.unixSocket({0x5240f0?, 0x5eb060?}, {0x4f859e?, 0x4?}, {0x524508?, 0x0?}, {0x524508?, 0xc000076040?}, {0x4f85be, 0x4}, ...)
        /usr/local/go/src/net/unixsock_posix.go:45 +0x308
net.(*sysDialer).dialUnix(0x0?, {0x5240f0?, 0x5eb060?}, 0x0?, 0x0?)
        /usr/local/go/src/net/unixsock_posix.go:164 +0x91
net.(*sysDialer).dialSingle(0xc0000a4000, {0x5240f0, 0x5eb060}, {0x523ee0, 0xc000076040})
        /usr/local/go/src/net/dial.go:731 +0x214
net.(*sysDialer).dialSerial(0xc0000a4000, {0x5240f0, 0x5eb060}, {0xc000014090?, 0x1, 0x1c?})
        /usr/local/go/src/net/dial.go:686 +0x24e
net.(*sysDialer).dialParallel(0x0?, {0x5240f0?, 0x5eb060?}, {0xc000014090?, 0x5eb060?, 0x4f85be?}, {0x0?, 0x4f859e?, 0xc00006be18?})
        /usr/local/go/src/net/dial.go:587 +0x3a7
net.(*Dialer).DialContext(0xc00006beb0, {0x5240f0, 0x5eb060}, {0x4f859e, 0x4}, {0x4f9399, 0xb})
        /usr/local/go/src/net/dial.go:578 +0x6ac
net.(*Dialer).Dial(...)
        /usr/local/go/src/net/dial.go:504
main.main()
        /home/ubuntu/x/main.go:13 +0x74
exit status 2

This is caused by greuse package improperly calling SO_REUSEPORT on AF_UNIX sockets. It should only call SO_REUSEADDR on AF_UNIX sockets.

SO_REUSEPORT wasn't allowed on AF_UNIX sockets in the first place, but a recent kernel change exposed this bug: https://github.com/amazonlinux/amazon-linux-2023/issues/901#issuecomment-2632047579

yoursunny avatar Jul 14 '25 19:07 yoursunny