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) | 
