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;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
memset(address, 0, sizeof(sockaddr_in));
|
memset(address, 0, sizeof(sockaddr_in));
|
||||||
address->sa_len = 0;
|
address->sa_len = sizeof(sockaddr_in);
|
||||||
address->sa_family = AF_INET;
|
address->sa_family = AF_INET;
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -362,6 +362,7 @@ UdpDomainSupport::ConnectEndpoint(UdpEndpoint *endpoint,
|
|||||||
// [Stevens-UNP1, p226]: specifying AF_UNSPEC requests a "disconnect",
|
// [Stevens-UNP1, p226]: specifying AF_UNSPEC requests a "disconnect",
|
||||||
// so we reset the peer address:
|
// so we reset the peer address:
|
||||||
endpoint->PeerAddress().SetToEmpty();
|
endpoint->PeerAddress().SetToEmpty();
|
||||||
|
(*endpoint->PeerAddress())->sa_family = AF_UNSPEC;
|
||||||
} else {
|
} else {
|
||||||
if (!AddressModule()->is_same_family(address))
|
if (!AddressModule()->is_same_family(address))
|
||||||
return EAFNOSUPPORT;
|
return EAFNOSUPPORT;
|
||||||
|
|||||||
@@ -965,8 +965,10 @@ socket_getpeername(net_socket* _socket, struct sockaddr* address,
|
|||||||
net_socket_private* socket = (net_socket_private*)_socket;
|
net_socket_private* socket = (net_socket_private*)_socket;
|
||||||
BReference<net_socket_private> parent = socket->parent.GetReference();
|
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;
|
return ENOTCONN;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(address, &socket->peer, min_c(*_addressLength, socket->peer.ss_len));
|
memcpy(address, &socket->peer, min_c(*_addressLength, socket->peer.ss_len));
|
||||||
*_addressLength = socket->peer.ss_len;
|
*_addressLength = socket->peer.ss_len;
|
||||||
|
|||||||
Reference in New Issue
Block a user