diff --git a/CHANGELOG b/CHANGELOG index 9aa18a90..20d711c7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -47,6 +47,10 @@ HISTORY ++ Bugfixes: + 2008-09-30 Jonathan Larmour + * sockets.c (lwip_accept): check addr isn't NULL. If it's valid, do an + assertion check that addrlen isn't NULL. + 2008-09-30 Jonathan Larmour * tcp.c: Fix bug #24227, wrong error message in tcp_bind. diff --git a/src/api/sockets.c b/src/api/sockets.c index 323287bd..4a3d55a0 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -273,16 +273,22 @@ lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen) return -1; } - memset(&sin, 0, sizeof(sin)); - sin.sin_len = sizeof(sin); - sin.sin_family = AF_INET; - sin.sin_port = htons(port); - sin.sin_addr.s_addr = naddr.addr; + /* Note that POSIX only requires us to check addr is non-NULL. addrlen must + * not be NULL if addr is valid. + */ + if (NULL != addr) { + LWIP_ASSERT("addr valid but addrlen NULL", addrlen != NULL); + memset(&sin, 0, sizeof(sin)); + sin.sin_len = sizeof(sin); + sin.sin_family = AF_INET; + sin.sin_port = htons(port); + sin.sin_addr.s_addr = naddr.addr; - if (*addrlen > sizeof(sin)) - *addrlen = sizeof(sin); + if (*addrlen > sizeof(sin)) + *addrlen = sizeof(sin); - SMEMCPY(addr, &sin, *addrlen); + SMEMCPY(addr, &sin, *addrlen); + } newsock = alloc_socket(newconn); if (newsock == -1) {