]> granicus.if.org Git - openssl/commitdiff
s3_pkt.c: move ssl3_release_write_buffer to ssl3_write_bytes.
authorAndy Polyakov <appro@openssl.org>
Wed, 5 Feb 2014 12:57:10 +0000 (13:57 +0100)
committerAndy Polyakov <appro@openssl.org>
Wed, 5 Feb 2014 12:57:10 +0000 (13:57 +0100)
If application has more data than maximum fragment, hold to buffer
for whole write, as opposite to per-fragment strategy.

ssl/s3_pkt.c

index c3a061dac0e0a8b5a58754e4ee375f2827c97fc2..0b99ba44b25cdf3c1ec5e8a71ebef93de51c1903 100644 (file)
@@ -654,6 +654,7 @@ int ssl3_write_bytes(SSL *s, int type, const void *buf_, int len)
                i=do_ssl3_write(s, type, &(buf[tot]), nw, 0);
                if (i <= 0)
                        {
+                       /* XXX should we ssl3_release_write_buffer if i<0? */
                        s->s3->wnum=tot;
                        return i;
                        }
@@ -665,7 +666,11 @@ int ssl3_write_bytes(SSL *s, int type, const void *buf_, int len)
                        /* next chunk of data should get another prepended empty fragment
                         * in ciphersuites with known-IV weakness: */
                        s->s3->empty_fragment_done = 0;
-                       
+
+                       if ((i==(int)n) && s->mode & SSL_MODE_RELEASE_BUFFERS &&
+                               !SSL_IS_DTLS(s))
+                               ssl3_release_write_buffer(s);
+
                        return tot+i;
                        }
 
@@ -995,9 +1000,6 @@ int ssl3_write_pending(SSL *s, int type, const unsigned char *buf,
                        {
                        wb->left=0;
                        wb->offset+=i;
-                       if (s->mode & SSL_MODE_RELEASE_BUFFERS &&
-                               !SSL_IS_DTLS(s))
-                               ssl3_release_write_buffer(s);
                        s->rwstate=SSL_NOTHING;
                        return(s->s3->wpend_ret);
                        }