From c60635855dbadfa6c3c00024338cf85496649333 Mon Sep 17 00:00:00 2001 From: Simon Goldschmidt Date: Thu, 27 Feb 2014 21:28:15 +0100 Subject: [PATCH] fixed bug #38404 getpeeraddr returns success on unconnected/listening TCP sockets --- CHANGELOG | 4 ++++ src/api/api_msg.c | 8 +++++++- src/api/sockets.c | 7 ++++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index cd7a5bc2..61973351 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -96,6 +96,10 @@ HISTORY ++ Bugfixes: + 2014-02-27: Simon Goldschmidt + * api_msg.c, sockets.c: fixed bug #38404 getpeeraddr returns success on + unconnected/listening TCP sockets + 2014-02-27: Simon Goldschmidt * sockets.c: fixed bug #41729 Some socket functions return Exyz instead of -1 diff --git a/src/api/api_msg.c b/src/api/api_msg.c index 7f7138ed..f39d7359 100644 --- a/src/api/api_msg.c +++ b/src/api/api_msg.c @@ -1455,7 +1455,13 @@ lwip_netconn_do_getaddr(struct api_msg_msg *msg) #endif /* LWIP_UDP */ #if LWIP_TCP case NETCONN_TCP: - API_EXPR_DEREF(msg->msg.ad.port) = (msg->msg.ad.local?msg->conn->pcb.tcp->local_port:msg->conn->pcb.tcp->remote_port); + if ((msg->msg.ad.local == 0) && + ((msg->conn->pcb.tcp->state == CLOSED) || (msg->conn->pcb.tcp->state == LISTEN))) { + /* pcb is not connected and remote name is requested */ + msg->err = ERR_CONN; + } else { + API_EXPR_DEREF(msg->msg.ad.port) = (msg->msg.ad.local ? msg->conn->pcb.tcp->local_port : msg->conn->pcb.tcp->remote_port); + } break; #endif /* LWIP_TCP */ default: diff --git a/src/api/sockets.c b/src/api/sockets.c index 9f65d736..afa30f05 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -1478,6 +1478,7 @@ lwip_getaddrname(int s, struct sockaddr *name, socklen_t *namelen, u8_t local) union sockaddr_aligned saddr; ipX_addr_t naddr; u16_t port; + err_t err; sock = get_socket(s); if (!sock) { @@ -1486,7 +1487,11 @@ lwip_getaddrname(int s, struct sockaddr *name, socklen_t *namelen, u8_t local) /* get the IP address and port */ /* @todo: this does not work for IPv6, yet */ - netconn_getaddr(sock->conn, ipX_2_ip(&naddr), &port, local); + err = netconn_getaddr(sock->conn, ipX_2_ip(&naddr), &port, local); + if (err != ERR_OK) { + sock_set_errno(sock, err_to_errno(err)); + return -1; + } IPXADDR_PORT_TO_SOCKADDR(NETCONNTYPE_ISIPV6(netconn_type(sock->conn)), &saddr, &naddr, port);