Revert my earlier CRYPTO_THREADID commit, I will commit a reworked
[openssl.git] / ssl / s3_pkt.c
index 06b441291804dd0d2d42cffe951d5b1c9ad3ddaf..b4a1629853afbe9eb9a6959800ec95893dd968f7 100644 (file)
@@ -129,16 +129,21 @@ int ssl3_read_n(SSL *s, int n, int max, int extend)
         * (If s->read_ahead is set, 'max' bytes may be stored in rbuf
         * [plus s->packet_length bytes if extend == 1].)
         */
-       int i,len,left,align=0;
+       int i,len,left;
+       long align=0;
        unsigned char *pkt;
        SSL3_BUFFER *rb;
 
        if (n <= 0) return n;
 
        rb    = &(s->s3->rbuf);
+       if (rb->buf == NULL)
+               if (!ssl3_setup_read_buffer(s))
+                       return -1;
+
        left  = rb->left;
 #if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0
-       align = (int)rb->buf + SSL3_RT_HEADER_LENGTH;
+       align = (long)rb->buf + SSL3_RT_HEADER_LENGTH;
        align = (-align)&(SSL3_ALIGN_PAYLOAD-1);
 #endif
 
@@ -233,6 +238,11 @@ int ssl3_read_n(SSL *s, int n, int max, int extend)
                if (i <= 0)
                        {
                        rb->left = left;
+#ifndef OPENSSL_NO_RELEASE_BUFFERS
+                       if (len+left == 0 &&
+                           (s->mode & SSL_MODE_RELEASE_BUFFERS))
+                               ssl3_release_read_buffer(s);
+#endif
                        return(i);
                        }
                left+=i;
@@ -602,11 +612,16 @@ static int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
        {
        unsigned char *p,*plen;
        int i,mac_size,clear=0;
-       int prefix_len=0,align=0;
+       int prefix_len=0;
+       long align=0;
        SSL3_RECORD *wr;
        SSL3_BUFFER *wb=&(s->s3->wbuf);
        SSL_SESSION *sess;
 
+       if (wb->buf == NULL)
+               if (!ssl3_setup_write_buffer(s))
+                       return -1;
+
        /* first check if there is a SSL3_BUFFER still being written
         * out.  This will happen with non blocking IO */
        if (wb->left != 0)
@@ -672,7 +687,7 @@ static int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
                 * which would be multiple of SSL3_ALIGN_PAYLOAD, so
                 * if we want to align the real payload, then we can
                 * just pretent we simply have two headers. */
-               align = (int)wb->buf + 2*SSL3_RT_HEADER_LENGTH;
+               align = (long)wb->buf + 2*SSL3_RT_HEADER_LENGTH;
                align = (-align)&(SSL3_ALIGN_PAYLOAD-1);
 #endif
                p = wb->buf + align;
@@ -685,7 +700,7 @@ static int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
        else
                {
 #if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0
-               align = (int)wb->buf + SSL3_RT_HEADER_LENGTH;
+               align = (long)wb->buf + SSL3_RT_HEADER_LENGTH;
                align = (-align)&(SSL3_ALIGN_PAYLOAD-1);
 #endif
                p = wb->buf + align;
@@ -810,6 +825,10 @@ int ssl3_write_pending(SSL *s, int type, const unsigned char *buf,
                        {
                        wb->left=0;
                        wb->offset+=i;
+#ifndef OPENSSL_NO_RELEASE_BUFFERS
+                       if (s->mode & SSL_MODE_RELEASE_BUFFERS)
+                               ssl3_release_write_buffer(s);
+#endif
                        s->rwstate=SSL_NOTHING;
                        return(s->s3->wpend_ret);
                        }
@@ -855,7 +874,7 @@ int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
        void (*cb)(const SSL *ssl,int type2,int val)=NULL;
 
        if (s->s3->rbuf.buf == NULL) /* Not initialized yet */
-               if (!ssl3_setup_buffers(s))
+               if (!ssl3_setup_read_buffer(s))
                        return(-1);
 
        if ((type && (type != SSL3_RT_APPLICATION_DATA) && (type != SSL3_RT_HANDSHAKE) && type) ||
@@ -964,6 +983,10 @@ start:
                                {
                                s->rstate=SSL_ST_READ_HEADER;
                                rr->off=0;
+#ifndef OPENSSL_NO_RELEASE_BUFFERS
+                               if ((s->mode & SSL_MODE_RELEASE_BUFFERS))
+                                       ssl3_release_read_buffer(s);
+#endif
                                }
                        }
                return(n);