Fix a few more dangling IPv6 issues found by code inspection

This commit is contained in:
Gregory Nutt
2015-01-18 10:33:27 -06:00
parent eb3c6e8390
commit 59c0757183
6 changed files with 85 additions and 62 deletions
+30 -20
View File
@@ -44,6 +44,7 @@
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <debug.h>
#ifdef CONFIG_NET_PKT
# include <netpacket/packet.h>
@@ -146,6 +147,7 @@ int psock_bind(FAR struct socket *psock, const struct sockaddr *addr,
#ifdef CONFIG_NET_PKT
FAR const struct sockaddr_ll *lladdr = (const struct sockaddr_ll *)addr;
#endif
socklen_t minlen;
int err;
int ret = OK;
@@ -159,27 +161,35 @@ int psock_bind(FAR struct socket *psock, const struct sockaddr *addr,
/* Verify that a valid address has been provided */
if (
(
#if defined(CONFIG_NET_PKT)
addr->sa_family != AF_PACKET &&
#endif
#if defined(CONFIG_NET_IPv6)
addr->sa_family != AF_INET6
#else
addr->sa_family != AF_INET
#endif
) ||
#if defined(CONFIG_NET_PKT)
(addr->sa_family == AF_PACKET && addrlen < sizeof(struct sockaddr_ll)) ||
#endif
#if defined(CONFIG_NET_IPv6)
(addr->sa_family == AF_INET6 && addrlen < sizeof(struct sockaddr_in6))
#else
(addr->sa_family == AF_INET && addrlen < sizeof(struct sockaddr_in))
#endif
)
switch (addr->sa_family)
{
#ifdef CONFIG_NET_IPv4
case AF_INET:
minlen = sizeof(struct sockaddr_in);
break;
#endif
#ifdef CONFIG_NET_IPv6
case AF_INET6:
minlen = sizeof(struct sockaddr_in6);
break;
#endif
#ifdef CONFIG_NET_PKT
case AF_PACKET:
minlen = sizeof(struct sockaddr_ll);
break;
#endif
default:
ndbg("ERROR: Unrecognized address family: %d\n", addr->sa_family);
err = EAFNOSUPPORT;
goto errout;
}
if (addrlen < minlen)
{
ndbg("ERROR: Invalid address length: %d < %d\n", addrlen, minlen);
err = EBADF;
goto errout;
}
+24 -7
View File
@@ -433,6 +433,7 @@ ssize_t psock_sendto(FAR struct socket *psock, FAR const void *buf,
net_lock_t save;
int ret;
#endif
socklen_t minlen;
int err;
/* If to is NULL or tolen is zero, then this function is same as send (for
@@ -452,16 +453,32 @@ ssize_t psock_sendto(FAR struct socket *psock, FAR const void *buf,
/* Verify that a valid address has been provided */
#ifdef CONFIG_NET_IPv6
if (to->sa_family != AF_INET6 || tolen < sizeof(struct sockaddr_in6))
#else
if (to->sa_family != AF_INET || tolen < sizeof(struct sockaddr_in))
switch (to->sa_family)
{
#ifdef CONFIG_NET_IPv4
case AF_INET:
minlen = sizeof(struct sockaddr_in);
break;
#endif
{
ndbg("ERROR: Invalid address\n");
#ifdef CONFIG_NET_IPv6
case AF_INET6:
minlen = sizeof(struct sockaddr_in6);
break;
#endif
default:
ndbg("ERROR: Unrecognized address family: %d\n", to->sa_family);
err = EAFNOSUPPORT;
goto errout;
}
if (tolen < minlen)
{
ndbg("ERROR: Invalid address length: %d < %d\n", tolen, minlen);
err = EBADF;
goto errout;
}
}
/* Verify that the psock corresponds to valid, allocated socket */