aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/sendf.c46
1 files changed, 32 insertions, 14 deletions
diff --git a/lib/sendf.c b/lib/sendf.c
index 1538061e8..efb89f205 100644
--- a/lib/sendf.c
+++ b/lib/sendf.c
@@ -94,7 +94,6 @@ struct curl_slist *curl_slist_append(struct curl_slist *list,
new_item->data = strdup(data);
}
if (new_item == NULL || new_item->data == NULL) {
- fprintf(stderr, "Cannot allocate memory for QUOTE list.\n");
return NULL;
}
@@ -229,6 +228,7 @@ CURLcode Curl_write(struct connectdata *conn, int sockfd,
ssize_t *written)
{
ssize_t bytes_written;
+ CURLcode retcode;
(void)conn;
#ifdef USE_SSLEAY
@@ -244,13 +244,28 @@ CURLcode Curl_write(struct connectdata *conn, int sockfd,
switch(err) {
case SSL_ERROR_WANT_READ:
case SSL_ERROR_WANT_WRITE:
- /* this is basicly the EWOULDBLOCK equivalent */
+ /* The operation did not complete; the same TLS/SSL I/O function
+ should be called again later. This is basicly an EWOULDBLOCK
+ equivalent. */
*written = 0;
return CURLE_OK;
case SSL_ERROR_SYSCALL:
failf(conn->data, "SSL_write() returned SYSCALL, errno = %d\n",
Curl_ourerrno());
return CURLE_SEND_ERROR;
+ case SSL_ERROR_SSL:
+ {
+ /* A failure in the SSL library occurred, usually a
+ protocol error. The OpenSSL error queue contains more
+ information on the error. */
+ char error_buffer[120]; /* OpenSSL documents that this must be at least
+ 120 bytes long. */
+ int sslerror = ERR_get_error();
+ failf(conn->data, "SSL_write() error: %s\n",
+ ERR_error_string(sslerror, error_buffer));
+ return CURLE_SEND_ERROR;
+ }
+ break;
}
/* a true error */
failf(conn->data, "SSL_write() return error %d\n", err);
@@ -271,27 +286,30 @@ CURLcode Curl_write(struct connectdata *conn, int sockfd,
}
if(-1 == bytes_written) {
int err = Curl_ourerrno();
-#ifdef WIN32
- if(WSAEWOULDBLOCK == err)
+
+ if(
+#ifdef WSAEWOULDBLOCK
+ /* This is how Windows does it */
+ (WSAEWOULDBLOCK == err)
#else
- /* As pointed out by Christophe Demory on March 11 2003, errno
- may be EWOULDBLOCK or on some systems EAGAIN when it returned
- due to its inability to send off data without blocking. We
- therefor treat both error codes the same here */
- if((EWOULDBLOCK == err) || (EAGAIN == err) || (EINTR == err))
+ /* As pointed out by Christophe Demory on March 11 2003, errno
+ may be EWOULDBLOCK or on some systems EAGAIN when it returned
+ due to its inability to send off data without blocking. We
+ therefor treat both error codes the same here */
+ (EWOULDBLOCK == err) || (EAGAIN == err) || (EINTR == err)
#endif
- {
+ )
/* this is just a case of EWOULDBLOCK */
- *written=0;
- return CURLE_OK;
- }
+ bytes_written=0;
}
#ifdef USE_SSLEAY
}
#endif
*written = bytes_written;
- return (-1 != bytes_written)?CURLE_OK:CURLE_SEND_ERROR;
+ retcode = (-1 != bytes_written)?CURLE_OK:CURLE_SEND_ERROR;
+
+ return retcode;
}
/* client_write() sends data to the write callback(s)