diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 1e4b38a..d63b4b6 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -301,7 +301,7 @@ newPySSLSocket(SSL_CTX *ctx, PySocketSockObject *sock, PySSL_BEGIN_ALLOW_THREADS self->ssl = SSL_new(ctx); PySSL_END_ALLOW_THREADS - SSL_set_fd(self->ssl, sock->sock_fd); + SSL_set_fd(self->ssl, SOCKET_T_AS_INT(sock->sock_fd)); #ifdef SSL_MODE_AUTO_RETRY SSL_set_mode(self->ssl, SSL_MODE_AUTO_RETRY); #endif @@ -1035,9 +1035,9 @@ check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing) /* See if the socket is ready */ PySSL_BEGIN_ALLOW_THREADS if (writing) - rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv); + rc = select(SOCKET_T_AS_INT(s->sock_fd)+1, NULL, &fds, NULL, &tv); else - rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv); + rc = select(SOCKET_T_AS_INT(s->sock_fd)+1, &fds, NULL, NULL, &tv); PySSL_END_ALLOW_THREADS #ifdef HAVE_POLL diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h index f064795..f930541 100644 --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -88,9 +88,15 @@ typedef SOCKET SOCKET_T; # else # define SIZEOF_SOCKET_T 4 # endif + /* On Windows, SOCKET_T is an offset in per-process handle table. + The per-process limit on kernel handles is 2^24. Kernel Objects: + http://msdn.microsoft.com/en-us/library/ms724485%28VS.85%29.aspx + */ +# define SOCKET_T_AS_INT(fd) ((int)fd) #else typedef int SOCKET_T; # define SIZEOF_SOCKET_T SIZEOF_INT +# define SOCKET_T_AS_INT(fd) (fd) #endif #if SIZEOF_SOCKET_T <= SIZEOF_LONG