diff --git a/src/xpdev/multisock.c b/src/xpdev/multisock.c index 6a138a54bf33b913f0713e11d13de1d0c1afa7ca..d893be4a3d7f3c80a92849be23fddf426421f1a2 100644 --- a/src/xpdev/multisock.c +++ b/src/xpdev/multisock.c @@ -379,8 +379,10 @@ SOCKET DLLCALL xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, switch (poll(fds, scnt, poll_timeout)) { case 0: + free(fds); return INVALID_SOCKET; case -1: + free(fds); return SOCKET_ERROR; default: scnt = 0; @@ -388,18 +390,20 @@ SOCKET DLLCALL xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, if(xpms_set->socks[i].sock == INVALID_SOCKET) continue; if (fds[scnt].revents & (POLLERR | POLLNVAL)) { + scnt++; closesocket(xpms_set->socks[i].sock); xpms_set->lprintf(LOG_ERR, "%04d * Listening socket went bad", xpms_set->socks[i].sock); xpms_set->socks[i].sock = INVALID_SOCKET; continue; } - else { + if (fds[scnt++].revents & POLLIN) { #endif if(cb_data) *cb_data=xpms_set->socks[i].cb_data; - ret = accept(xpms_set->socks[i].sock, &addr->addr, addrlen); - if (ret == INVALID_SOCKET) - return ret; + ret = accept(xpms_set->socks[i].sock, &addr->addr, addrlen); + if (ret == INVALID_SOCKET) { + goto error_return; + } // Set host_ip from haproxy protocol, if its used // http://www.haproxy.org/download/1.8/doc/proxy-protocol.txt @@ -415,7 +419,7 @@ SOCKET DLLCALL xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, btox(haphex,hapstr,strlen(hapstr),sizeof(haphex), xpms_set->lprintf); xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for version - failed [%s]",ret,haphex); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } btox(haphex,hapstr,strlen(hapstr)>16 ? 16 : strlen(hapstr),sizeof(haphex), xpms_set->lprintf); @@ -447,7 +451,7 @@ SOCKET DLLCALL xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, } else { xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Unknown Protocol",ret); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } // Look for the space between the next IP @@ -455,13 +459,13 @@ SOCKET DLLCALL xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, if (p == NULL) { xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Couldnt find IP address",ret); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } *p = 0; if (inet_pton(addr->addr.sa_family, tok, vp) != 1) { xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Unable to parse %s address [%s]",addr->addr.sa_family == AF_INET ? "IPv4" : "IPv6", tok); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } tok = p + 1; // Look for the space before the port number @@ -469,14 +473,14 @@ SOCKET DLLCALL xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, if (p == NULL) { xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Couldnt find port",ret); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } tok = p + 1; l = strtol(tok, NULL, 10); if (l <= 0 || l > UINT16_MAX) { xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Source port out of range",ret); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } switch(addr->addr.sa_family) { case AF_INET: @@ -498,7 +502,7 @@ SOCKET DLLCALL xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, btox(haphex,hapstr,10,sizeof(haphex), xpms_set->lprintf); xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Something went wrong - incomplete v2 setup [%s]",ret,haphex); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } // Command and Version @@ -506,7 +510,7 @@ SOCKET DLLCALL xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, btox(haphex,hapstr,1,sizeof(haphex), xpms_set->lprintf); xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for Verson/Command - failed [%s]",ret,haphex); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Version [%x]",ret,(hapstr[0]>>4)&0x0f); //Should be 2 @@ -517,7 +521,7 @@ SOCKET DLLCALL xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, default: xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY invalid version [%x]",ret,(hapstr[0]>>4)&0x0f); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Command [%x]",ret,hapstr[0]&0x0f); //0=Local/1=Proxy @@ -527,13 +531,13 @@ SOCKET DLLCALL xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, case HAPROXY_LOCAL: xpms_set->lprintf(LOG_INFO,"%04d * HAPROXY health check - we are alive!",ret); closesocket(ret); - return INVALID_SOCKET; + goto error_return; case HAPROXY_PROXY: break; default: xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY invalid command [%x]",ret,hapstr[0]&0x0f); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } // Protocol and Family @@ -541,7 +545,7 @@ SOCKET DLLCALL xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, btox(haphex,hapstr,1,sizeof(haphex), xpms_set->lprintf); xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for Protocol/Family - failed [%s]",ret,haphex); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Protocol [%x]",ret,hapstr[0]&0x0f); //0=Unspec/1=AF_INET/2=AF_INET6/3=AF_UNIX l = (hapstr[0]>>4)&0x0f; @@ -552,7 +556,7 @@ SOCKET DLLCALL xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, btox(haphex,hapstr,2,sizeof(haphex), xpms_set->lprintf); xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for address length - failed [%s]",ret,haphex); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } i = ntohs(*(uint16_t*)hapstr); xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Address Length [%d]",ret,i); @@ -563,13 +567,13 @@ SOCKET DLLCALL xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, if (i != 12) { xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Something went wrong - IPv4 address length is incorrect",ret); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } addr->in.sin_family = AF_INET; if (read_socket(ret, hapstr, i, xpms_set->lprintf)==FALSE) { xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for IPv4 address - failed",ret); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } memcpy(&addr->in.sin_addr.s_addr, hapstr, 4); memcpy(&addr->in.sin_port, &hapstr[8], 2); @@ -583,13 +587,13 @@ SOCKET DLLCALL xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, if (i != 36) { xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Something went wrong - IPv6 address length is incorrect.",ret); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } addr->in6.sin6_family = AF_INET6; if (read_socket(ret,hapstr,i,xpms_set->lprintf)==FALSE) { xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for IPv6 address - failed",ret); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } memcpy(&addr->in6.sin6_addr.s6_addr, hapstr, 16); memcpy(&addr->in6.sin6_port, &hapstr[32], 2); @@ -601,26 +605,36 @@ SOCKET DLLCALL xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, default: xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Unknown Family [%x]",ret,l); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } } else { xpms_set->lprintf(LOG_ERR,"%04d Unknown HAProxy Initialisation - is HAProxy used?",ret); closesocket(ret); - return INVALID_SOCKET; + goto error_return; } hapstr[0] = 0; inet_addrtop(addr, hapstr, sizeof(hapstr)); xpms_set->lprintf(LOG_INFO,"%04d * HAPROXY Source [%s]",ret,hapstr); +#ifndef _WIN32 + free(fds); +#endif return ret; } else { +#ifndef _WIN32 + free(fds); +#endif return ret; } } } } +error_return: +#ifndef _WIN32 + free(fds); +#endif return INVALID_SOCKET; }