[Bug 262172] UNIX Domain bind() - distinguish between random garbage and alive listening socket
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 262172] UNIX Domain bind() - distinguish between random garbage and alive listening socket"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 262172] UNIX Domain bind() - distinguish between random garbage and alive listening socket"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 262172] UNIX Domain bind() - distinguish between random garbage and alive listening socket"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 262172] UNIX Domain bind() - distinguish between random garbage and alive listening socket"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 24 Feb 2022 16:46:05 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=262172 Bug ID: 262172 Summary: UNIX Domain bind() - distinguish between random garbage and alive listening socket Product: Base System Version: Unspecified Hardware: Any OS: Any Status: New Severity: Affects Some People Priority: --- Component: kern Assignee: bugs@FreeBSD.org Reporter: firk@cantconnect.ru Created attachment 232076 --> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=232076&action=edit patch for 12.3 The bind()/bindat() syscall for AF_UNIX returns EADDRINUSE when some file already exist at the specified path. EADDRINUSE should mean "this address already bound to someone", and this is not always true here. There may be just some file (not a socket) or a dead socket (pending non-unlinked vnode from already closed, previously bound socket). While the first case usually considered as an application error, the second usually means "we need to remove this stale entry and try again", but to do this we should first check if the socket is really dead. There is a hacky way to do this: try to connect to it, and see what happens, but: 1) it is an extra unneeded system call, 2) is the socket is not dead, the listening application will receive spurious connection request, which is not always desirable, 3) there is a problem to distinguish between ECONNREFUSED from a dead socket and ECONNREFUSED from full-backlog; we can try to connect with a wrong protocol (SOCK_STREAM vs SOCK_DGRAM etc) to get another errno, but anyway it is a hack So I made a patch to return EEXIST instead or EADDRINUSE when there is not really bound socket but just a random file or a dead socket. As this may cause some incompatibilities, I added sysctl to optionally enable this feature. -- You are receiving this mail because: You are the assignee for the bug.