Skip to content

Panics with Unix socket #2

@yoursunny

Description

@yoursunny

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:
amazonlinux/amazon-linux-2023#901 (comment)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions