Author: kgiusti
Date: Mon Oct  1 15:56:19 2012
New Revision: 1392408

URL: http://svn.apache.org/viewvc?rev=1392408&view=rev
Log:
PROTON-38: fixed another infinite loop case.

Modified:
    qpid/proton/trunk/proton-c/src/ssl/openssl.c

Modified: qpid/proton/trunk/proton-c/src/ssl/openssl.c
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/ssl/openssl.c?rev=1392408&r1=1392407&r2=1392408&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/ssl/openssl.c (original)
+++ qpid/proton/trunk/proton-c/src/ssl/openssl.c Mon Oct  1 15:56:19 2012
@@ -525,14 +525,16 @@ static ssize_t process_input_ssl( pn_tra
   // Read all available data from the SSL socket
 
   if (!ssl->ssl_closed) {
-    int pending = BIO_pending(ssl->bio_ssl);
-    int available = pn_min( (APP_BUF_SIZE - ssl->in_count), pending );
+    //int pending = BIO_pending(ssl->bio_ssl);
+    //int available = pn_min( (APP_BUF_SIZE - ssl->in_count), pending );
+    int available = APP_BUF_SIZE - ssl->in_count;
     while (available > 0) {
       int written = BIO_read( ssl->bio_ssl, &ssl->inbuf[ssl->in_count], 
available );
       if (written > 0) {
         _log( ssl, "Read %d bytes from SSL socket for app\n", written );
         _log_clear_data( ssl, &ssl->inbuf[ssl->in_count], written );
         ssl->in_count += written;
+        available -= written;
       } else {
         if (!BIO_should_retry(ssl->bio_ssl)) {
           _log(ssl, "Read from SSL socket failed - SSL connection closed!!\n");
@@ -551,8 +553,6 @@ static ssize_t process_input_ssl( pn_tra
         }
         break;
       }
-      pending = BIO_pending(ssl->bio_ssl);
-      available = pn_min( (APP_BUF_SIZE - ssl->in_count), pending );
     }
   }
 
@@ -568,7 +568,7 @@ static ssize_t process_input_ssl( pn_tra
         _log( ssl, "Application consumed %d bytes from peer\n", (int) consumed 
);
       } else {
         if (consumed < 0) {
-          _log(ssl, "Application layer closed its input: %d (discarding %d 
bytes)\n",
+          _log(ssl, "Application layer closed its input, error=%d (discarding 
%d bytes)\n",
                (int) consumed, (int)ssl->in_count);
           ssl->in_count = 0;    // discard any pending input
           ssl->app_input_closed = consumed;
@@ -593,13 +593,15 @@ static ssize_t process_input_ssl( pn_tra
       memmove( ssl->inbuf, data, ssl->in_count );
   }
 
+  //_log(ssl, "ssl_closed=%d in_count=%d app_input_closed=%d 
app_output_closed=%d\n",
+  //     ssl->ssl_closed, ssl->in_count, ssl->app_input_closed, 
ssl->app_output_closed );
+
   // tell transport our input side is closed if the SSL socket cannot be read 
from any
   // longer, AND any pending input has been written up to the application (or 
the
   // application is closed)
   if (ssl->ssl_closed && ssl->in_count == 0) {
     consumed = ssl->app_input_closed ? ssl->app_input_closed : PN_EOS;
   }
-
   _log(ssl, "process_input_ssl() returning %d\n", (int) consumed);
   return consumed;
 }
@@ -622,7 +624,7 @@ static ssize_t process_output_ssl( pn_tr
         _log( ssl, "Gathered %d bytes from app to send to peer\n", app_bytes );
       } else {
         if (app_bytes < 0) {
-          _log(ssl, "Application layer closed its output size: %d (%d bytes 
pending send)\n",
+          _log(ssl, "Application layer closed its output, error=%d (%d bytes 
pending send)\n",
                (int) app_bytes, (int) ssl->out_count);
           ssl->app_output_closed = app_bytes;
           if (app_bytes == PN_EOS) {
@@ -693,6 +695,9 @@ static ssize_t process_output_ssl( pn_tr
     }
   }
 
+  //_log(ssl, "written=%d ssl_closed=%d in_count=%d app_input_closed=%d 
app_output_closed=%d bio_pend=%d\n",
+  //     written, ssl->ssl_closed, ssl->in_count, ssl->app_input_closed, 
ssl->app_output_closed, BIO_pending(ssl->bio_net_io) );
+
   // Once no more data is available "below" the SSL socket, tell the transport 
we are
   // done.
   if (written == 0 && ssl->ssl_closed && BIO_pending(ssl->bio_net_io) == 0) {



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to