[EMAIL PROTECTED] (Bodo Moeller):
Mikko Hirvonen <[EMAIL PROTECTED]>:

>> I have problems with pipes. I try to use s_client as fetchmail
>> plugin, but something goes wrong. Transmission over ssl-tunnel will
>> stop.

> I think s_client.c is buggy in that in does a select() loop where in
> fact it the first thing it should do in each iteration is check
> SSL_pending(con).  The result is that under certain circumstances when
> no new data arrives over the network, s_client sleeps on select()
> while SSL_read has quite a bit of internally buffered data that would
> be ready for processing.  Fixing s_client is left as an exercise :-)

It seems that no-one took the challenge, so here's my patch (relative
to the current code, but the patch should work for 0.9.2b as well):

Index: apps/s_client.c
===================================================================
RCS file: /e/openssl/cvs/openssl/apps/s_client.c,v
retrieving revision 1.5
diff -u -r1.5 s_client.c
--- apps/s_client.c     1999/03/31 12:06:04     1.5
+++ apps/s_client.c     1999/04/08 20:20:02
@@ -154,7 +154,7 @@
        char *cert_file=NULL,*key_file=NULL;
        char *CApath=NULL,*CAfile=NULL,*cipher=NULL;
        int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0;
-       int write_tty,read_tty,write_ssl,read_ssl,tty_on;
+       int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
        SSL_CTX *ctx=NULL;
        int ret=1,in_init=1,i,nbio_test=0;
        SSL_METHOD *meth=NULL;
@@ -439,31 +439,36 @@
                                }
                        }
 
+               ssl_pending = read_ssl && SSL_pending(con);
+
+               if (!ssl_pending)
 #ifndef WINDOWS
-               if (tty_on)
                        {
-                       if (read_tty)  FD_SET(fileno(stdin),&readfds);
-                       if (write_tty) FD_SET(fileno(stdout),&writefds);
-                       }
+                       if (tty_on)
+                               {
+                               if (read_tty)  FD_SET(fileno(stdin),&readfds);
+                               if (write_tty) FD_SET(fileno(stdout),&writefds);
+                               }
 #endif
-               if (read_ssl)
-                       FD_SET(SSL_get_fd(con),&readfds);
-               if (write_ssl)
-                       FD_SET(SSL_get_fd(con),&writefds);
+                       if (read_ssl)
+                               FD_SET(SSL_get_fd(con),&readfds);
+                       if (write_ssl)
+                               FD_SET(SSL_get_fd(con),&writefds);
 
-/*             printf("mode tty(%d %d%d) ssl(%d%d)\n",
-                       tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
+/*                     printf("mode tty(%d %d%d) ssl(%d%d)\n",
+                               tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
 
-               i=select(width,&readfds,&writefds,NULL,NULL);
-               if ( i < 0)
-                       {
-                       BIO_printf(bio_err,"bad select %d\n",
+                       i=select(width,&readfds,&writefds,NULL,NULL);
+                       if ( i < 0)
+                               {
+                               BIO_printf(bio_err,"bad select %d\n",
                                get_last_socket_error());
-                       goto shut;
-                       /* goto end; */
+                               goto shut;
+                               /* goto end; */
+                               }
                        }
 
-               if (FD_ISSET(SSL_get_fd(con),&writefds))
+               if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
                        {
                        k=SSL_write(con,&(cbuf[cbuf_off]),
                                (unsigned int)cbuf_len);
@@ -531,7 +536,7 @@
                                }
                        }
 #ifndef WINDOWS
-               else if (FD_ISSET(fileno(stdout),&writefds))
+               else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds))
                        {
                        i=write(fileno(stdout),&(sbuf[sbuf_off]),sbuf_len);
 
@@ -551,7 +556,7 @@
                                }
                        }
 #endif
-               else if (FD_ISSET(SSL_get_fd(con),&readfds))
+               else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
                        {
 #ifdef RENEG
 { static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to