⛏️ index : haiku.git

author Jérôme Duval <jerome.duval@gmail.com> 2025-06-24 17:49:57.0 +02:00:00
committer waddlesplash <waddlesplash@gmail.com> 2025-06-24 17:33:06.0 +00:00:00
commit
3aaa4c9d96cbf92e991198cf4e7ebc51cf52e3fb [patch]
tree
a654d597d6ecabb3c017f344639327e7dc16d81d
parent
090519cfe5dcb8ba63ca086c478866be17abdb91
download
3aaa4c9d96cbf92e991198cf4e7ebc51cf52e3fb.tar.gz

udp: a second bind on broadcast address should error with EADDRNOTAVAIL

Testcase: https://gitlab.com/sortix/os-test/-/blob/master/udp/bind-conflict-loopback-broadcast.c

Change-Id: I37c6d05910c3d9573610207b650f1957bccd1e47
Reviewed-on: https://review.haiku-os.org/c/haiku/+/9390
Reviewed-by: waddlesplash <waddlesplash@gmail.com>

Diff

 src/add-ons/kernel/network/protocols/udp/udp.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/add-ons/kernel/network/protocols/udp/udp.cpp b/src/add-ons/kernel/network/protocols/udp/udp.cpp
index 7ada424..8ed0dc0 100644
--- a/src/add-ons/kernel/network/protocols/udp/udp.cpp
+++ b/src/add-ons/kernel/network/protocols/udp/udp.cpp
@@ -450,6 +450,12 @@
			ntohs(otherEndpoint->LocalAddress().Port()));

		if (otherEndpoint->LocalAddress().EqualPorts(address)) {
			// check for broadcast address (apply to IPv4 only)
			if ((fDomain->address_module->flags & NET_ADDRESS_MODULE_FLAG_BROADCAST_ADDRESS) != 0
				&& ((const sockaddr_in *)address)->sin_addr.s_addr == htonl(INADDR_BROADCAST)) {
					return EADDRNOTAVAIL;
			}

			// port is already bound, SO_REUSEADDR or SO_REUSEPORT is required:
			if ((otherEndpoint->Socket()->options
					& (SO_REUSEADDR | SO_REUSEPORT)) == 0