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

Reply via email to