From 04fac889f75b32790b39753276f33b6b756fc779 Mon Sep 17 00:00:00 2001 From: Leorize Date: Wed, 25 Mar 2020 14:15:25 -0500 Subject: [PATCH] net_socket: getpeername now only works on connected socket MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per POSIX.1-2008, getpeername() shall fails if the socket is not connected. With this change, it's no longer possible to retrieve the peer from connectionless protocols such as UDP, even if a peer is assigned to them via connect(). The same behavior can be replicated among POSIX-compatible operating systems such as Linux. Fixes #15081 Change-Id: Ia5631971200959a3d3815332ff1969c4b4dd289b Reviewed-on: https://review.haiku-os.org/c/haiku/+/2421 Reviewed-by: Jérôme Duval Reviewed-by: Adrien Destugues --- src/add-ons/kernel/network/stack/net_socket.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/network/stack/net_socket.cpp b/src/add-ons/kernel/network/stack/net_socket.cpp index 414acc5e2c..d38cf648ba 100644 --- a/src/add-ons/kernel/network/stack/net_socket.cpp +++ b/src/add-ons/kernel/network/stack/net_socket.cpp @@ -1054,10 +1054,11 @@ socket_connect(net_socket* socket, const struct sockaddr* address, int -socket_getpeername(net_socket* socket, struct sockaddr* address, +socket_getpeername(net_socket* _socket, struct sockaddr* address, socklen_t* _addressLength) { - if (socket->peer.ss_len == 0) + net_socket_private* socket = (net_socket_private*)_socket; + if (!socket->is_connected || socket->peer.ss_len == 0) return ENOTCONN; memcpy(address, &socket->peer, min_c(*_addressLength, socket->peer.ss_len));