diff options
author | Linus Nordberg <linus@nordberg.se> | 2013-08-26 16:42:44 +0200 |
---|---|---|
committer | Linus Nordberg <linus@nordberg.se> | 2013-08-26 16:42:44 +0200 |
commit | 92a0c39afd4472d9ff33e3518fb548a7473fc7ce (patch) | |
tree | e2a3c3b2e1bbca11c95b5e8e22c8a2b81077fbfc | |
parent | 1335ec42794cf5007bdab487423aef15358637a2 (diff) |
Don't wait for _writable_ when _reading_ an SSL socket.
Also, don't select() at all if SSL_pending() says there's data to
read.
Patch by Fabian Mauchle.
-rw-r--r-- | tls.c | 21 |
1 files changed, 11 insertions, 10 deletions
@@ -165,7 +165,7 @@ int tlsconnect(struct server *server, struct timeval *when, int timeout, char *t /* returns 0 on timeout, -1 on error and num if ok */ int sslreadtimeout(SSL *ssl, unsigned char *buf, int num, int timeout) { int s, ndesc, cnt, len; - fd_set readfds, writefds; + fd_set readfds; struct timeval timer; s = SSL_get_fd(ssl); @@ -173,16 +173,17 @@ int sslreadtimeout(SSL *ssl, unsigned char *buf, int num, int timeout) { return -1; /* make socket non-blocking? */ for (len = 0; len < num; len += cnt) { - FD_ZERO(&readfds); - FD_SET(s, &readfds); - writefds = readfds; - if (timeout) { - timer.tv_sec = timeout; - timer.tv_usec = 0; + if (SSL_pending(ssl) == 0) { + FD_ZERO(&readfds); + FD_SET(s, &readfds); + if (timeout) { + timer.tv_sec = timeout; + timer.tv_usec = 0; + } + ndesc = select(s + 1, &readfds, NULL, NULL, timeout ? &timer : NULL); + if (ndesc < 1) + return ndesc; } - ndesc = select(s + 1, &readfds, &writefds, NULL, timeout ? &timer : NULL); - if (ndesc < 1) - return ndesc; cnt = SSL_read(ssl, buf + len, num - len); if (cnt <= 0) |