From c9d81ef037125e2b97a0ad3999193d3933c11f8b Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Sun, 18 Jan 2015 10:33:27 -0600 Subject: Fix a few more dangling IPv6 issues found by code inspection --- nuttx/include/net/route.h | 2 +- nuttx/include/nuttx/net/ioctl.h | 2 +- nuttx/net/netdev/netdev_ioctl.c | 60 +++++++++++++++++++---------------------- nuttx/net/route/net_router.c | 2 +- nuttx/net/socket/bind.c | 44 ++++++++++++++++++------------ nuttx/net/socket/sendto.c | 29 +++++++++++++++----- 6 files changed, 81 insertions(+), 58 deletions(-) (limited to 'nuttx') diff --git a/nuttx/include/net/route.h b/nuttx/include/net/route.h index 063b5e8aa..c77d36567 100644 --- a/nuttx/include/net/route.h +++ b/nuttx/include/net/route.h @@ -64,7 +64,7 @@ struct rtentry { FAR struct sockaddr_storage *rt_target; /* Address of the network */ FAR struct sockaddr_storage *rt_netmask; /* Network mask defining the sub-net */ - FAR struct sockaddr_storage *rt_router; /* Gateway address associated with the hop */ + FAR struct sockaddr_storage *rt_router; /* Gateway address associated with the hop */ }; /**************************************************************************** diff --git a/nuttx/include/nuttx/net/ioctl.h b/nuttx/include/nuttx/net/ioctl.h index 1f2c61ab2..afaa1df13 100644 --- a/nuttx/include/nuttx/net/ioctl.h +++ b/nuttx/include/nuttx/net/ioctl.h @@ -82,7 +82,7 @@ #define SIOCGIFHWADDR _SIOC(0x0013) /* Get hardware address */ #define SIOCSIFHWADDR _SIOC(0x0014) /* Set hardware address */ -#define SIOCDIFADDR _SIOC(0x0015) /* Delete IP address */ +#define SIOCDIFADDR _SIOC(0x0015) /* Delete IP address (IPv4 and IPv6) */ #define SIOCGIFCOUNT _SIOC(0x0016) /* Get number of devices */ /* Interface flags */ diff --git a/nuttx/net/netdev/netdev_ioctl.c b/nuttx/net/netdev/netdev_ioctl.c index 50300abad..2c2c24e0f 100644 --- a/nuttx/net/netdev/netdev_ioctl.c +++ b/nuttx/net/netdev/netdev_ioctl.c @@ -72,10 +72,15 @@ * Pre-processor Definitions ****************************************************************************/ +/* This is really kind of bogus.. When asked for an IP address, this is + * family that is returned in the ifr structure. Probably could just skip + * this since the address family has nothing to do with the Ethernet address. + */ + #ifdef CONFIG_NET_IPv6 -# define AF_INETX AF_INET6 +# define AF_INETX AF_INET6 #else -# define AF_INETX AF_INET +# define AF_INETX AF_INET #endif /**************************************************************************** @@ -682,7 +687,6 @@ static int netdev_ifrioctl(FAR struct socket *psock, int cmd, dev = netdev_ifrdev(req); if (dev) { - req->ifr_hwaddr.sa_family = AF_INETX; memcpy(dev->d_mac.ether_addr_octet, req->ifr_hwaddr.sa_data, IFHWADDRLEN); ret = OK; @@ -871,7 +875,7 @@ static int netdev_imsfioctl(FAR struct socket *psock, int cmd, static int netdev_rtioctl(FAR struct socket *psock, int cmd, FAR struct rtentry *rtentry) { - int ret = -EINVAL; + int ret = -EAFNOSUPPORT; /* Execute the command */ @@ -879,9 +883,6 @@ static int netdev_rtioctl(FAR struct socket *psock, int cmd, { case SIOCADDRT: /* Add an entry to the routing table */ { -#if defined(CONFIG_NET_IPv4) && defined(CONFIG_NET_IPv6) - FAR struct sockaddr_in *addr; -#endif /* The target address and the netmask are required values */ if (!retentry || !rtentry->rt_target || !rtentry->rt_netmask) @@ -889,32 +890,28 @@ static int netdev_rtioctl(FAR struct socket *psock, int cmd, return -EINVAL; } -#if defined(CONFIG_NET_IPv4) && defined(CONFIG_NET_IPv6) - addr = (FAR struct sockaddr_in *)rtentry->rt_target; - if (addr->sin_family == AF_INET) +#ifdef CONFIG_NET_IPv4 + if (rtentry->rt_target.ss_family == AF_INET) +#ifdef CONFIG_NET_IPv6 +#endif { ret = ioctl_addipv4route(rtentry); } +#endif /* CONFIG_NET_IPv4 */ + +#ifdef CONFIG_NET_IPv4 +#ifdef CONFIG_NET_IPv6 else +#endif { ret = ioctl_addipv6route(rtentry); } - -#elif defined(CONFIG_NET_IPv4) - ret = ioctl_addipv4route(rtentry); -#elif defined(CONFIG_NET_IPv6) - ret = ioctl_addipv6route(rtentry); -#else - ret = -EAFNOSUPPORT; -#endif +#endif /* CONFIG_NET_IPv4 */ } break; case SIOCDELRT: /* Delete an entry from the routing table */ { -#if defined(CONFIG_NET_IPv4) && defined(CONFIG_NET_IPv6) - FAR struct sockaddr_in *addr; -#endif /* The target address and the netmask are required values */ if (!retentry || !rtentry->rt_target || !rtentry->rt_netmask) @@ -922,24 +919,23 @@ static int netdev_rtioctl(FAR struct socket *psock, int cmd, return -EINVAL; } -#if defined(CONFIG_NET_IPv4) && defined(CONFIG_NET_IPv6) - addr = (FAR struct sockaddr_in *)rtentry->rt_target; - if (addr->sin_family == AF_INET) +#ifdef CONFIG_NET_IPv4 + if (rtentry->rt_target.ss_family == AF_INET) +#ifdef CONFIG_NET_IPv6 +#endif { ret = ioctl_delipv4route(rtentry); } +#endif /* CONFIG_NET_IPv4 */ + +#ifdef CONFIG_NET_IPv4 +#ifdef CONFIG_NET_IPv6 else +#endif { ret = ioctl_delipv6route(rtentry); } - -#elif defined(CONFIG_NET_IPv4) - ret = ioctl_delipv4route(rtentry); -#elif defined(CONFIG_NET_IPv6) - ret = ioctl_delipv6route(rtentry); -#else - ret = -EAFNOSUPPORT; -#endif +#endif /* CONFIG_NET_IPv4 */ } break; diff --git a/nuttx/net/route/net_router.c b/nuttx/net/route/net_router.c index 0c585647d..c08476f03 100644 --- a/nuttx/net/route/net_router.c +++ b/nuttx/net/route/net_router.c @@ -65,7 +65,7 @@ struct route_ipv4_match_s #ifdef CONFIG_NET_IPv6 struct route_ipv6_match_s { - net_ipv6addr_t target; /* arget IPv6 address on an external network to match */ + net_ipv6addr_t target; /* Target IPv6 address on an external network to match */ net_ipv6addr_t router; /* IPv6 address of the router on one of our networks*/ }; #endif 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 #include #include +#include #ifdef CONFIG_NET_PKT # include @@ -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; } diff --git a/nuttx/net/socket/sendto.c b/nuttx/net/socket/sendto.c index f917ef940..0134bde3c 100644 --- a/nuttx/net/socket/sendto.c +++ b/nuttx/net/socket/sendto.c @@ -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 */ + switch (to->sa_family) + { +#ifdef CONFIG_NET_IPv4 + case AF_INET: + minlen = sizeof(struct sockaddr_in); + break; +#endif + #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)) + case AF_INET6: + minlen = sizeof(struct sockaddr_in6); + break; #endif - { - ndbg("ERROR: Invalid address\n"); + + 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 */ -- cgit v1.2.3