Fixed the usage of SSL_read() to properly return -1 if the EWOULDBLOCK

situation occurs, which it previously didn't!

This was reptoed by Evan Jordan in bug report #653022.

Also, if ERROR_SYSCALL is returned from SSL_write(), include the errno number
in the error string for easier error detection.
This commit is contained in:
Daniel Stenberg 2002-12-19 15:45:15 +00:00
parent 04c499a5fc
commit 39dc14c002
1 changed files with 11 additions and 13 deletions

View File

@ -235,6 +235,9 @@ CURLcode Curl_write(struct connectdata *conn, int sockfd,
/* this is basicly the EWOULDBLOCK equivalent */ /* this is basicly the EWOULDBLOCK equivalent */
*written = 0; *written = 0;
return CURLE_OK; return CURLE_OK;
case SSL_ERROR_SYSCALL:
failf(conn->data, "SSL_write() returned SYSCALL, errno = %d\n", errno);
return CURLE_SEND_ERROR;
} }
/* a true error */ /* a true error */
failf(conn->data, "SSL_write() return error %d\n", err); failf(conn->data, "SSL_write() return error %d\n", err);
@ -328,36 +331,31 @@ int Curl_read(struct connectdata *conn,
ssize_t *n) ssize_t *n)
{ {
ssize_t nread; ssize_t nread;
*n=0; /* reset amount to zero */
#ifdef USE_SSLEAY #ifdef USE_SSLEAY
if (conn->ssl.use) { if (conn->ssl.use) {
bool loop=TRUE; nread = SSL_read(conn->ssl.handle, buf, buffersize);
int err;
do {
nread = SSL_read(conn->ssl.handle, buf, buffersize);
if(nread >= 0) if(nread < 0) {
/* successful read */ /* failed SSL_read */
break; int err = SSL_get_error(conn->ssl.handle, nread);
err = SSL_get_error(conn->ssl.handle, nread);
switch(err) { switch(err) {
case SSL_ERROR_NONE: /* this is not an error */ case SSL_ERROR_NONE: /* this is not an error */
case SSL_ERROR_ZERO_RETURN: /* no more data */ case SSL_ERROR_ZERO_RETURN: /* no more data */
loop=0; /* get out of loop */
break; break;
case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_READ:
case SSL_ERROR_WANT_WRITE: case SSL_ERROR_WANT_WRITE:
/* if there's data pending, then we re-invoke SSL_read() */ /* if there's data pending, then we re-invoke SSL_read() */
if(SSL_pending(conn->ssl.handle))
return -1; /* basicly EWOULDBLOCK */
break; break;
default: default:
failf(conn->data, "SSL read error: %d", err); failf(conn->data, "SSL read error: %d", err);
return CURLE_RECV_ERROR; return CURLE_RECV_ERROR;
} }
} while(loop); }
if(loop && SSL_pending(conn->ssl.handle))
return -1; /* basicly EWOULDBLOCK */
} }
else { else {
#endif #endif