On Wednesday 07 of April 2010 09:12:37 Kamil Dudka wrote: > As for the compile-time warning, it's easy to fix. But I spotted that > lib/qssl.c is compiled there. That file stayed completely untached, thus > must be now broken by the changes elsewhere. I wonder how it could build > actually. > > Any chance to build lib/qssl.c on my box, using cross-compile?
Attached is a patch which should fix the flaws, but I didn't have chance to try if it even compiles. > Kamil
From 5d0756621def4c8ad118be9c2bf92d683240acc0 Mon Sep 17 00:00:00 2001 From: Kamil Dudka <[email protected]> Date: Wed, 7 Apr 2010 10:07:29 +0200 Subject: [PATCH] qssl: reflect recent code changes in SSL interface --- lib/qssl.c | 23 +++++++++++++++-------- lib/qssl.h | 8 ++++++-- lib/sendf.c | 2 +- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/lib/qssl.c b/lib/qssl.c index 3d1b5da..5a08a25 100644 --- a/lib/qssl.c +++ b/lib/qssl.c @@ -374,8 +374,9 @@ int Curl_qsossl_shutdown(struct connectdata * conn, int sockindex) } +/* for documentation see Curl_ssl_send() in sslgen.h */ ssize_t Curl_qsossl_send(struct connectdata * conn, int sockindex, - const void * mem, size_t len) + const void * mem, size_t len, int * curlcode) { /* SSL_Write() is said to return 'int' while write() and send() returns @@ -391,22 +392,26 @@ ssize_t Curl_qsossl_send(struct connectdata * conn, int sockindex, /* The operation did not complete; the same SSL I/O function should be called again later. This is basicly an EWOULDBLOCK equivalent. */ - return 0; + *curlcode = -1; /* EWOULDBLOCK */ + return -1; case SSL_ERROR_IO: switch (errno) { case EWOULDBLOCK: case EINTR: - return 0; + *curlcode = -1; /* EWOULDBLOCK */ + return -1; } failf(conn->data, "SSL_Write() I/O error: %s", strerror(errno)); + *curlcode = CURLE_SEND_ERROR; return -1; } /* An SSL error. */ failf(conn->data, "SSL_Write() returned error %s", SSL_Strerror(rc, NULL)); + *curlcode = CURLE_SEND_ERROR; return -1; } @@ -414,8 +419,9 @@ ssize_t Curl_qsossl_send(struct connectdata * conn, int sockindex, } +/* for documentation see Curl_ssl_recv() in sslgen.h */ ssize_t Curl_qsossl_recv(struct connectdata * conn, int num, char * buf, - size_t buffersize, bool * wouldblock) + size_t buffersize, int * curlcode) { char error_buffer[120]; /* OpenSSL documents that this must be at @@ -426,7 +432,6 @@ ssize_t Curl_qsossl_recv(struct connectdata * conn, int num, char * buf, buffsize = (buffersize > (size_t)INT_MAX) ? INT_MAX : (int)buffersize; nread = SSL_Read(conn->ssl[num].handle, buf, buffsize); - *wouldblock = FALSE; if(nread < 0) { /* failed SSL_read */ @@ -435,21 +440,23 @@ ssize_t Curl_qsossl_recv(struct connectdata * conn, int num, char * buf, case SSL_ERROR_BAD_STATE: /* there's data pending, re-invoke SSL_Read(). */ - *wouldblock = TRUE; - return -1; /* basically EWOULDBLOCK */ + *curlcode = -1; /* EWOULDBLOCK */ + return -1; case SSL_ERROR_IO: switch (errno) { case EWOULDBLOCK: - *wouldblock = TRUE; + *curlcode = -1; /* EWOULDBLOCK */ return -1; } failf(conn->data, "SSL_Read() I/O error: %s", strerror(errno)); + *curlcode = CURLE_RECV_ERROR; return -1; default: failf(conn->data, "SSL read error: %s", SSL_Strerror(nread, NULL)); + *curlcode = CURLE_RECV_ERROR; return -1; } } diff --git a/lib/qssl.h b/lib/qssl.h index 9a984bf..a0cf8cc 100644 --- a/lib/qssl.h +++ b/lib/qssl.h @@ -36,15 +36,19 @@ void Curl_qsossl_close(struct connectdata *conn, int sockindex); int Curl_qsossl_close_all(struct SessionHandle * data); int Curl_qsossl_shutdown(struct connectdata * conn, int sockindex); +/* for documentation see Curl_ssl_send() in sslgen.h */ ssize_t Curl_qsossl_send(struct connectdata * conn, int sockindex, const void * mem, - size_t len); + size_t len, + int * curlcode); + +/* for documentation see Curl_ssl_recv() in sslgen.h */ ssize_t Curl_qsossl_recv(struct connectdata * conn, /* connection data */ int num, /* socketindex */ char * buf, /* store read data here */ size_t buffersize, /* max amount to read */ - bool * wouldblock); + int * curlcode); size_t Curl_qsossl_version(char * buffer, size_t size); int Curl_qsossl_check_cxn(struct connectdata * cxn); diff --git a/lib/sendf.c b/lib/sendf.c index 90c5275..ff4aee3 100644 --- a/lib/sendf.c +++ b/lib/sendf.c @@ -553,7 +553,7 @@ int Curl_read(struct connectdata *conn, /* connection data */ } if(conn->ssl[num].state == ssl_connection_complete) { - int curlcode; + int curlcode = CURLE_RECV_ERROR; nread = Curl_ssl_recv(conn, num, buffertofill, bytesfromsocket, &curlcode); if(nread == -1) -- 1.7.0.2
------------------------------------------------------------------- List admin: http://cool.haxx.se/list/listinfo/curl-library Etiquette: http://curl.haxx.se/mail/etiquette.html
