mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
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:
parent
04c499a5fc
commit
39dc14c002
22
lib/sendf.c
22
lib/sendf.c
@ -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;
|
|
||||||
int err;
|
|
||||||
do {
|
|
||||||
nread = SSL_read(conn->ssl.handle, buf, buffersize);
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user