mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2025-01-29 00:32:51 +00:00
sockets.c: Fix bug #22435 "lwip_recvfrom with TCP break;". Using (lwip_)recvfrom with valid "from" and "fromlen" parameters, on a TCP connection caused a crash. Note that using (lwip_)recvfrom like this is a bit slow and that using (lwip)getpeername is the good lwip way to do it (so, using recv is faster on tcp sockets).
This commit is contained in:
parent
afcf49ad3a
commit
e07d71f5e8
@ -600,6 +600,13 @@ HISTORY
|
|||||||
|
|
||||||
++ Bug fixes:
|
++ Bug fixes:
|
||||||
|
|
||||||
|
2008-03-13 Frédéric Bernon
|
||||||
|
* sockets.c: Fix bug #22435 "lwip_recvfrom with TCP break;". Using
|
||||||
|
(lwip_)recvfrom with valid "from" and "fromlen" parameters, on a
|
||||||
|
TCP connection caused a crash. Note that using (lwip_)recvfrom
|
||||||
|
like this is a bit slow and that using (lwip)getpeername is the
|
||||||
|
good lwip way to do it (so, using recv is faster on tcp sockets).
|
||||||
|
|
||||||
2008-03-12 Frédéric Bernon, Jonathan Larmour
|
2008-03-12 Frédéric Bernon, Jonathan Larmour
|
||||||
* api_msg.c, contrib/apps/ping.c: Fix bug #22530 "api_msg.c's
|
* api_msg.c, contrib/apps/ping.c: Fix bug #22530 "api_msg.c's
|
||||||
recv_raw() does not consume data", and the ping sample (with
|
recv_raw() does not consume data", and the ping sample (with
|
||||||
|
@ -549,8 +549,13 @@ lwip_recvfrom(int s, void *mem, int len, unsigned int flags,
|
|||||||
if (from && fromlen) {
|
if (from && fromlen) {
|
||||||
struct sockaddr_in sin;
|
struct sockaddr_in sin;
|
||||||
|
|
||||||
|
if (netconn_type(sock->conn) == NETCONN_TCP) {
|
||||||
|
addr = (struct ip_addr*)&(sin.sin_addr.s_addr);
|
||||||
|
netconn_getaddr(sock->conn, addr, &port, 0);
|
||||||
|
} else {
|
||||||
addr = netbuf_fromaddr(buf);
|
addr = netbuf_fromaddr(buf);
|
||||||
port = netbuf_fromport(buf);
|
port = netbuf_fromport(buf);
|
||||||
|
}
|
||||||
|
|
||||||
memset(&sin, 0, sizeof(sin));
|
memset(&sin, 0, sizeof(sin));
|
||||||
sin.sin_len = sizeof(sin);
|
sin.sin_len = sizeof(sin);
|
||||||
@ -568,13 +573,20 @@ lwip_recvfrom(int s, void *mem, int len, unsigned int flags,
|
|||||||
LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%u len=%u\n", port, off));
|
LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%u len=%u\n", port, off));
|
||||||
} else {
|
} else {
|
||||||
#if SOCKETS_DEBUG
|
#if SOCKETS_DEBUG
|
||||||
|
struct sockaddr_in sin;
|
||||||
|
|
||||||
|
if (netconn_type(sock->conn) == NETCONN_TCP) {
|
||||||
|
addr = (struct ip_addr*)&(sin.sin_addr.s_addr);
|
||||||
|
netconn_getaddr(sock->conn, addr, &port, 0);
|
||||||
|
} else {
|
||||||
addr = netbuf_fromaddr(buf);
|
addr = netbuf_fromaddr(buf);
|
||||||
port = netbuf_fromport(buf);
|
port = netbuf_fromport(buf);
|
||||||
|
}
|
||||||
|
|
||||||
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): addr=", s));
|
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): addr=", s));
|
||||||
ip_addr_debug_print(SOCKETS_DEBUG, addr);
|
ip_addr_debug_print(SOCKETS_DEBUG, addr);
|
||||||
LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%u len=%u\n", port, off));
|
LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%u len=%u\n", port, off));
|
||||||
#endif
|
#endif /* SOCKETS_DEBUG */
|
||||||
}
|
}
|
||||||
|
|
||||||
sock_set_errno(sock, 0);
|
sock_set_errno(sock, 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user