Handle WANT_READ more correctly (thanks to Bodo).
authorBen Laurie <ben@openssl.org>
Tue, 5 Sep 2000 18:47:57 +0000 (18:47 +0000)
committerBen Laurie <ben@openssl.org>
Tue, 5 Sep 2000 18:47:57 +0000 (18:47 +0000)
demos/state_machine/state_machine.c

index 0eb8e92c0cea55f6bcf1b88e570e8fefb2bdb78f..0140fbca704602d2d38a58dc40ee980f18a4d841 100644 (file)
@@ -132,8 +132,6 @@ SSLStateMachine *SSLStateMachine_new(const char *szCertificateFile,
     die_unless(pMachine->pSSL);
 
     pMachine->pbioRead=BIO_new(BIO_s_mem());
     die_unless(pMachine->pSSL);
 
     pMachine->pbioRead=BIO_new(BIO_s_mem());
-    /* Set EOF to return 0 (-1 is the default) */
-    BIO_ctrl(pMachine->pbioRead,BIO_C_SET_BUF_MEM_EOF_RETURN,0,NULL);
 
     pMachine->pbioWrite=BIO_new(BIO_s_mem());
 
 
     pMachine->pbioWrite=BIO_new(BIO_s_mem());
 
@@ -165,15 +163,36 @@ int SSLStateMachine_read_extract(SSLStateMachine *pMachine,
        {
        fprintf(stderr,"Doing SSL_accept\n");
        n=SSL_accept(pMachine->pSSL);
        {
        fprintf(stderr,"Doing SSL_accept\n");
        n=SSL_accept(pMachine->pSSL);
-       if(n < 0)
-           SSLStateMachine_print_error(pMachine,"SSL_accept failed");
        if(n == 0)
            fprintf(stderr,"SSL_accept returned zero\n");
        if(n == 0)
            fprintf(stderr,"SSL_accept returned zero\n");
-       assert(n >= 0);
+       if(n < 0)
+           {
+           int err;
+
+           if((err=SSL_get_error(pMachine->pSSL,n)) == SSL_ERROR_WANT_READ)
+               {
+               fprintf(stderr,"SSL_accept wants more data\n");
+               return 0;
+               }
+
+           SSLStateMachine_print_error(pMachine,"SSL_accept error");
+           exit(7);
+           }
        return 0;
        }
 
     n=SSL_read(pMachine->pSSL,aucBuf,nBuf);
        return 0;
        }
 
     n=SSL_read(pMachine->pSSL,aucBuf,nBuf);
+    if(n < 0)
+       {
+       int err=SSL_get_error(pMachine->pSSL,n);
+
+       if(err == SSL_ERROR_WANT_READ)
+           {
+           fprintf(stderr,"SSL_read wants more data\n");
+           return 0;
+           }
+       }
+
     fprintf(stderr,"%d bytes of decrypted data read from state machine\n",n);
     return n;
     }
     fprintf(stderr,"%d bytes of decrypted data read from state machine\n",n);
     return n;
     }