diff --git a/include/net/route.h b/include/net/route.h index 0564dde8f2a64..2df0c39b10bb1 100644 --- a/include/net/route.h +++ b/include/net/route.h @@ -101,15 +101,15 @@ extern "C" * netmask - Network mask defining the external network (required) * router - Router address that on our network that can forward to the * external network. + * len - The address struct length. * * Returned Value: * OK on success; -1 on failure with the errno variable set appropriately. * ****************************************************************************/ -int addroute(int sockfd, FAR struct sockaddr_storage *target, - FAR struct sockaddr_storage *netmask, - FAR struct sockaddr_storage *router); +int addroute(int sockfd, FAR void *target, FAR void *netmask, + FAR void *router, socklen_t len); /**************************************************************************** * Name: net_delroute @@ -122,14 +122,14 @@ int addroute(int sockfd, FAR struct sockaddr_storage *target, * sockfd - Any socket descriptor * target - Target address on the remote network (required) * netmask - Network mask defining the external network (required) + * len - The address struct length. * * Returned Value: * OK on success; -1 on failure with the errno variable set appropriately. * ****************************************************************************/ -int delroute(int sockfd, FAR struct sockaddr_storage *target, - FAR struct sockaddr_storage *netmask); +int delroute(int sockfd, FAR void *target, FAR void *netmask, socklen_t len); #undef EXTERN #ifdef __cplusplus diff --git a/libs/libc/net/lib_addroute.c b/libs/libc/net/lib_addroute.c index 56023198bb650..7f6bac68f14e9 100644 --- a/libs/libc/net/lib_addroute.c +++ b/libs/libc/net/lib_addroute.c @@ -24,6 +24,7 @@ #include +#include #include #include #include @@ -47,24 +48,29 @@ * netmask - Network mask defining the external network (required) * router - Router address that on our network that can forward to the * external network. + * len - The address struct length. * * Returned Value: * OK on success; -1 on failure with the errno variable set appropriately. * ****************************************************************************/ -int addroute(int sockfd, FAR struct sockaddr_storage *target, - FAR struct sockaddr_storage *netmask, - FAR struct sockaddr_storage *router) +int addroute(int sockfd, FAR void *target, FAR void *netmask, + FAR void *router, socklen_t len) { struct rtentry entry; + if (len < sizeof(struct in_addr) || len > sizeof(struct sockaddr_storage)) + { + return -EINVAL; + } + /* Set up the rtentry structure */ memset(&entry, 0, sizeof(struct rtentry)); - memcpy(&entry.rt_dst, target, sizeof(struct sockaddr_storage)); - memcpy(&entry.rt_genmask, netmask, sizeof(struct sockaddr_storage)); - memcpy(&entry.rt_gateway, router, sizeof(struct sockaddr_storage)); + memcpy(&entry.rt_dst, target, len); + memcpy(&entry.rt_genmask, netmask, len); + memcpy(&entry.rt_gateway, router, len); /* Then perform the ioctl */ diff --git a/libs/libc/net/lib_delroute.c b/libs/libc/net/lib_delroute.c index ac8343c567c9a..f4c36817b03ab 100644 --- a/libs/libc/net/lib_delroute.c +++ b/libs/libc/net/lib_delroute.c @@ -24,6 +24,7 @@ #include +#include #include #include #include @@ -45,22 +46,27 @@ * sockfd - Any socket descriptor * target - Target address on the remote network (required) * netmask - Network mask defining the external network (required) + * len - The address struct length. * * Returned Value: * OK on success; -1 on failure with the errno variable set appropriately. * ****************************************************************************/ -int delroute(int sockfd, FAR struct sockaddr_storage *target, - FAR struct sockaddr_storage *netmask) +int delroute(int sockfd, FAR void *target, FAR void *netmask, socklen_t len) { struct rtentry entry; + if (len < sizeof(struct in_addr) || len > sizeof(struct sockaddr_storage)) + { + return -EINVAL; + } + /* Set up the rtentry structure */ memset(&entry, 0, sizeof(struct rtentry)); - memcpy(&entry.rt_dst, target, sizeof(struct sockaddr_storage)); - memcpy(&entry.rt_genmask, netmask, sizeof(struct sockaddr_storage)); + memcpy(&entry.rt_dst, target, len); + memcpy(&entry.rt_genmask, netmask, len); /* Then perform the ioctl */