From 4d41aff0ac4d34429dfb17fc747fcf5aa18227d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 29 Jul 2010 09:33:45 +0000 Subject: [PATCH] * Made sure is_empty_address() also detects AF_UNSPEC addresses as empty. * The is_empty_address() function of AF_UNIX did not deal correctly with empty addresses. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37804 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/network/protocols/ipv4/ipv4_address.cpp | 3 ++- .../kernel/network/protocols/ipv6/ipv6_address.cpp | 3 ++- .../kernel/network/protocols/l2cap/l2cap_address.cpp | 3 ++- src/add-ons/kernel/network/protocols/unix/UnixAddress.cpp | 8 ++++++-- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/add-ons/kernel/network/protocols/ipv4/ipv4_address.cpp b/src/add-ons/kernel/network/protocols/ipv4/ipv4_address.cpp index 6e42089140..09d00d6f95 100644 --- a/src/add-ons/kernel/network/protocols/ipv4/ipv4_address.cpp +++ b/src/add-ons/kernel/network/protocols/ipv4/ipv4_address.cpp @@ -100,7 +100,8 @@ ipv4_mask_address(const sockaddr *address, const sockaddr *mask, static bool ipv4_is_empty_address(const sockaddr *address, bool checkPort) { - if (address == NULL || address->sa_len == 0) + if (address == NULL || address->sa_len == 0 + || address->sa_family == AF_UNSPEC) return true; return ((sockaddr_in *)address)->sin_addr.s_addr == 0 diff --git a/src/add-ons/kernel/network/protocols/ipv6/ipv6_address.cpp b/src/add-ons/kernel/network/protocols/ipv6/ipv6_address.cpp index 3fce6e50b6..32cefd7dc3 100644 --- a/src/add-ons/kernel/network/protocols/ipv6/ipv6_address.cpp +++ b/src/add-ons/kernel/network/protocols/ipv6/ipv6_address.cpp @@ -113,7 +113,8 @@ ipv6_mask_address(const sockaddr *address, const sockaddr *mask, static bool ipv6_is_empty_address(const sockaddr *_address, bool checkPort) { - if (_address == NULL || _address->sa_len == 0) + if (_address == NULL || _address->sa_len == 0 + || _address->sa_family == AF_UNSPEC) return true; const sockaddr_in6 *address = (const sockaddr_in6 *)_address; diff --git a/src/add-ons/kernel/network/protocols/l2cap/l2cap_address.cpp b/src/add-ons/kernel/network/protocols/l2cap/l2cap_address.cpp index 4527fa5c0d..415e7b4aff 100644 --- a/src/add-ons/kernel/network/protocols/l2cap/l2cap_address.cpp +++ b/src/add-ons/kernel/network/protocols/l2cap/l2cap_address.cpp @@ -90,7 +90,8 @@ l2cap_mask_address(const sockaddr *address, const sockaddr *mask, static bool l2cap_is_empty_address(const sockaddr *address, bool checkPort) { - if (address == NULL || address->sa_len == 0) + if (address == NULL || address->sa_len == 0 + || address->sa_family == AF_UNSPEC) return true; return ((bdaddrUtils::Compare( diff --git a/src/add-ons/kernel/network/protocols/unix/UnixAddress.cpp b/src/add-ons/kernel/network/protocols/unix/UnixAddress.cpp index 6ec09e2d25..383902634b 100644 --- a/src/add-ons/kernel/network/protocols/unix/UnixAddress.cpp +++ b/src/add-ons/kernel/network/protocols/unix/UnixAddress.cpp @@ -108,10 +108,13 @@ unix_equal_masked_addresses(const sockaddr *a, const sockaddr *b, static bool unix_is_empty_address(const sockaddr *address, bool checkPort) { - return address->sa_len >= kEmptyAddress.sun_len - && memcmp(address, &kEmptyAddress, kEmptyAddress.sun_len) == 0; + return address == NULL || address->sa_len == 0 + || address->sa_family == AF_UNSPEC) + || (address->sa_len >= kEmptyAddress.sun_len + && memcmp(address, &kEmptyAddress, kEmptyAddress.sun_len) == 0); } + static bool unix_is_same_family(const sockaddr *address) { @@ -121,6 +124,7 @@ unix_is_same_family(const sockaddr *address) return address->sa_family == AF_UNIX; } + static int32 unix_first_mask_bit(const sockaddr *mask) {