Fix Bleichenbacher PKCS #1 1.5 countermeasure.
[oweals/openssl.git] / ssl / ssl_lib.c
index ee840f09c593e9a01cdf154bf60a8e49d35afb26..1fe85b6cb7560ac209381f11641bb55b9ac73ecf 100644 (file)
@@ -58,6 +58,8 @@
  * [including the GNU Public Licence.]
  */
 
+
+#include <assert.h>
 #include <stdio.h>
 #include <openssl/objects.h>
 #include <openssl/lhash.h>
@@ -117,7 +119,9 @@ int SSL_clear(SSL *s)
        s->client_version=s->version;
        s->rwstate=SSL_NOTHING;
        s->rstate=SSL_ST_READ_HEADER;
+#if 0
        s->read_ahead=s->ctx->read_ahead;
+#endif
 
        if (s->init_buf != NULL)
                {
@@ -227,6 +231,7 @@ SSL *SSL_new(SSL_CTX *ctx)
        s->server=(ctx->method->ssl_accept == ssl_undefined_function)?0:1;
        s->options=ctx->options;
        s->mode=ctx->mode;
+       s->read_ahead=ctx->read_ahead; /* used to happen in SSL_clear */
        SSL_clear(s);
 
        CRYPTO_new_ex_data(ssl_meth,s,&s->ex_data);
@@ -703,7 +708,7 @@ long SSL_get_default_timeout(SSL *s)
        return(s->method->get_timeout());
        }
 
-int SSL_read(SSL *s,char *buf,int num)
+int SSL_read(SSL *s,void *buf,int num)
        {
        if (s->handshake_func == 0)
                {
@@ -719,8 +724,14 @@ int SSL_read(SSL *s,char *buf,int num)
        return(s->method->ssl_read(s,buf,num));
        }
 
-int SSL_peek(SSL *s,char *buf,int num)
+int SSL_peek(SSL *s,void *buf,int num)
        {
+       if (s->handshake_func == 0)
+               {
+               SSLerr(SSL_F_SSL_READ, SSL_R_UNINITIALIZED);
+               return -1;
+               }
+
        if (s->shutdown & SSL_RECEIVED_SHUTDOWN)
                {
                return(0);
@@ -728,7 +739,7 @@ int SSL_peek(SSL *s,char *buf,int num)
        return(s->method->ssl_peek(s,buf,num));
        }
 
-int SSL_write(SSL *s,const char *buf,int num)
+int SSL_write(SSL *s,const void *buf,int num)
        {
        if (s->handshake_func == 0)
                {
@@ -1034,7 +1045,7 @@ STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num,
                return(NULL);
                }
        if ((skp == NULL) || (*skp == NULL))
-               sk=sk_SSL_CIPHER_new(NULL); /* change perhaps later */
+               sk=sk_SSL_CIPHER_new_null(); /* change perhaps later */
        else
                {
                sk= *skp;
@@ -1674,6 +1685,10 @@ SSL *SSL_dup(SSL *s)
 
                if (s->cert != NULL)
                        {
+                       if (ret->cert != NULL)
+                               {
+                               ssl_cert_free(ret->cert);
+                               }
                        ret->cert = ssl_cert_dup(s->cert);
                        if (ret->cert == NULL)
                                goto err;
@@ -1844,19 +1859,16 @@ int ssl_init_wbio_buffer(SSL *s,int push)
 
 void ssl_free_wbio_buffer(SSL *s)
        {
-       BIO *under;
-
        if (s->bbio == NULL) return;
 
        if (s->bbio == s->wbio)
                {
                /* remove buffering */
-               under=BIO_pop(s->wbio);
-               if (under != NULL)
-                       s->wbio=under;
-               else
-                       abort(); /* ok */
-               }
+               s->wbio=BIO_pop(s->wbio);
+#ifdef REF_CHECK /* not the usual REF_CHECK, but this avoids adding one more preprocessor symbol */
+               assert(s->wbio != NULL);
+#endif 
+       }
        BIO_free(s->bbio);
        s->bbio=NULL;
        }