diff options
Diffstat (limited to 'nuttx/net/socket/bind.c')
-rw-r--r-- | nuttx/net/socket/bind.c | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/nuttx/net/socket/bind.c b/nuttx/net/socket/bind.c index 2cde978f9..d905e5aaf 100644 --- a/nuttx/net/socket/bind.c +++ b/nuttx/net/socket/bind.c @@ -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 + switch (addr->sa_family) + { +#ifdef CONFIG_NET_IPv4 + case AF_INET: + minlen = sizeof(struct sockaddr_in); + break; #endif - ) || -#if defined(CONFIG_NET_PKT) - (addr->sa_family == AF_PACKET && addrlen < sizeof(struct sockaddr_ll)) || + +#ifdef CONFIG_NET_IPv6 + case AF_INET6: + minlen = sizeof(struct sockaddr_in6); + break; #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)) + +#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; } |