fix bugs for optlen output on size not big enough for timeout events

This commit is contained in:
Minun Dragonation 2019-05-05 21:46:34 +08:00
parent 82252440de
commit 4a94ce6326

View File

@ -191,11 +191,16 @@ int win32_connect(SOCKET sockfd, const struct sockaddr *addr, socklen_t addrlen)
int win32_getsockopt(SOCKET sockfd, int level, int optname, void *optval, socklen_t *optlen) { int win32_getsockopt(SOCKET sockfd, int level, int optname, void *optval, socklen_t *optlen) {
int ret = 0; int ret = 0;
if ((level == SOL_SOCKET) && ((optname == SO_RCVTIMEO) || (optname == SO_SNDTIMEO))) { if ((level == SOL_SOCKET) && ((optname == SO_RCVTIMEO) || (optname == SO_SNDTIMEO))) {
struct timeval *tv = (struct timeval *)optval; if (*optlen >= sizeof (struct timeval)) {
DWORD timeout = 0; socklen_t dwlen = 0; struct timeval *tv = (struct timeval *)optval;
ret = getsockopt(sockfd, level, optname, (char *)&timeout, &dwlen); DWORD timeout = 0;
tv->tv_sec = timeout / 1000; socklen_t dwlen = 0;
tv->tv_usec = timeout * 1000; ret = getsockopt(sockfd, level, optname, (char *)&timeout, &dwlen);
tv->tv_sec = timeout / 1000;
tv->tv_usec = timeout * 1000;
} else {
ret = WSAEFAULT;
}
*optlen = sizeof (struct timeval); *optlen = sizeof (struct timeval);
} else { } else {
ret = getsockopt(sockfd, level, optname, (char*)optval, optlen); ret = getsockopt(sockfd, level, optname, (char*)optval, optlen);