From dfd969acd3377d972cfdf66bb60347be2a65d24c Mon Sep 17 00:00:00 2001 From: Jae Stutzman Date: Thu, 26 Jan 2017 08:28:14 -0600 Subject: [PATCH] Use Windows ioctlsocket to avoid buffer overrun --- src/network.c | 53 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/src/network.c b/src/network.c index 3a48557f9..9b1464a13 100644 --- a/src/network.c +++ b/src/network.c @@ -44,7 +44,6 @@ #include #include #include -#include #ifdef HAVE_NETINET_IN_H @@ -56,8 +55,9 @@ #ifdef HAVE_ARPA_INET_H #include #endif -#ifdef HAVE_SYS_SOCKET_H +#if defined (HAVE_SYS_SOCKET_H) && defined (HAVE_SYS_IOCTL_H) #include +#include #elif HAVE_WS2TCPIP_H #include # if defined(HAVE_WSPIAPI_H) @@ -106,26 +106,6 @@ static void handle_error (enum rig_debug_level_e lvl, const char *msg) #endif } -/** - * \brief Clears any data in the read buffer of the socket - * - * \param rp Port data structure - */ -void network_flush(hamlib_port_t* rp) -{ - int len = 0; - char buffer[NET_BUFFER_SIZE] = { 0 }; - for (;;) { - ioctl(rp->fd, FIONREAD, &len); - if (len > 0) { - len = read(rp->fd, &buffer, len < NET_BUFFER_SIZE ? len : NET_BUFFER_SIZE); - rig_debug(RIG_DEBUG_WARN, "Network data cleared: %s\n", buffer); - } else { - break; - } - } -} - /** * \brief Open network port using rig.state data * @@ -249,6 +229,35 @@ int network_open(hamlib_port_t *rp, int default_port) return RIG_OK; } +/** + * \brief Clears any data in the read buffer of the socket + * + * \param rp Port data structure + */ +void network_flush(hamlib_port_t* rp) +{ +#ifdef __MINGW32__ + ULONG len = 0; +#else + uint len = 0; +#endif + + char buffer[NET_BUFFER_SIZE] = { 0 }; + for (;;) { +#ifdef __MINGW32__ + ioctlsocket (rp->fd, FIONREAD, &len); +#else + ioctl(rp->fd, FIONREAD, &len); +#endif + if (len > 0) { + len = read(rp->fd, &buffer, len < NET_BUFFER_SIZE ? len : NET_BUFFER_SIZE); + rig_debug(RIG_DEBUG_WARN, "Network data cleared: %s\n", buffer); + } else { + break; + } + } +} + int network_close(hamlib_port_t *rp) { int ret;