udp: empty address is different from uninitialized address
* instead teach getpeername that family is to be checked. * fix #19652 Change-Id: I0e2150820687ca08e339adaf111918adc83b9e6b Reviewed-on: https://review.haiku-os.org/c/haiku/+/9397 Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
committed by
waddlesplash
parent
3738985e2c
commit
334de37d58
@@ -402,7 +402,7 @@ ipv4_set_to_empty_address(sockaddr *address)
|
||||
return B_BAD_VALUE;
|
||||
|
||||
memset(address, 0, sizeof(sockaddr_in));
|
||||
address->sa_len = 0;
|
||||
address->sa_len = sizeof(sockaddr_in);
|
||||
address->sa_family = AF_INET;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
@@ -362,6 +362,7 @@ UdpDomainSupport::ConnectEndpoint(UdpEndpoint *endpoint,
|
||||
// [Stevens-UNP1, p226]: specifying AF_UNSPEC requests a "disconnect",
|
||||
// so we reset the peer address:
|
||||
endpoint->PeerAddress().SetToEmpty();
|
||||
(*endpoint->PeerAddress())->sa_family = AF_UNSPEC;
|
||||
} else {
|
||||
if (!AddressModule()->is_same_family(address))
|
||||
return EAFNOSUPPORT;
|
||||
|
||||
@@ -965,8 +965,10 @@ socket_getpeername(net_socket* _socket, struct sockaddr* address,
|
||||
net_socket_private* socket = (net_socket_private*)_socket;
|
||||
BReference<net_socket_private> parent = socket->parent.GetReference();
|
||||
|
||||
if ((!parent.IsSet() && !socket->is_connected) || socket->peer.ss_len == 0)
|
||||
if ((!parent.IsSet() && !socket->is_connected) || socket->peer.ss_len == 0
|
||||
|| socket->peer.ss_family == AF_UNSPEC) {
|
||||
return ENOTCONN;
|
||||
}
|
||||
|
||||
memcpy(address, &socket->peer, min_c(*_addressLength, socket->peer.ss_len));
|
||||
*_addressLength = socket->peer.ss_len;
|
||||
|
||||
Reference in New Issue
Block a user