ssl3_write_bytes should only break up application data packets
This is for Microsoft SSL server implementation compatability.
Bug: 2916185
Change-Id: Idb8935a28395c53b6bad0c7d35c821efeef364cd
diff --git a/patches/small_records.patch b/patches/small_records.patch
index 01bb1e2..62c2924 100644
--- a/patches/small_records.patch
+++ b/patches/small_records.patch
@@ -143,7 +143,7 @@
+ {
+ if ((p=OPENSSL_realloc(s->s3->rbuf.buf, rr->length + SSL3_RT_HEADER_LENGTH))==NULL)
+ {
-+ SSLerr(SSL_F_SSL3_GET_RECORD,ERR_R_INTERNAL_ERROR);
++ SSLerr(SSL_F_SSL3_GET_RECORD,ERR_R_MALLOC_FAILURE);
+ goto err;
+ }
+ s->s3->rbuf.buf=p;
@@ -162,16 +162,16 @@
s->rwstate=SSL_NOTHING;
tot=s->s3->wnum;
-@@ -544,8 +561,13 @@ int ssl3_write_bytes(SSL *s, int type, const void *buf_, int len)
+@@ -544,8 +562,13 @@ int ssl3_write_bytes(SSL *s, int type, c
n=(len-tot);
for (;;)
{
- if (n > SSL3_RT_MAX_PLAIN_LENGTH)
- nw=SSL3_RT_MAX_PLAIN_LENGTH;
-+ if (!(SSL_get_mode(s) & SSL_MODE_SMALL_BUFFERS))
-+ max_plain_length = SSL3_RT_MAX_PLAIN_LENGTH;
-+ else
++ if (type == SSL3_RT_APPLICATION_DATA && (SSL_get_mode(s) & SSL_MODE_SMALL_BUFFERS))
+ max_plain_length = SSL3_RT_DEFAULT_PLAIN_LENGTH;
++ else
++ max_plain_length = SSL3_RT_MAX_PLAIN_LENGTH;
+
+ if (n > max_plain_length)
+ nw = max_plain_length;
@@ -189,6 +189,25 @@
{
/* insufficient space */
SSLerr(SSL_F_DO_SSL3_WRITE, ERR_R_INTERNAL_ERROR);
+@@ -640,6 +665,18 @@ static int do_ssl3_write(SSL *s, int typ
+ s->s3->empty_fragment_done = 1;
+ }
+
++ /* resize if necessary to hold the data. */
++ if (len + SSL3_RT_DEFAULT_WRITE_OVERHEAD > wb->len)
++ {
++ if ((p=OPENSSL_realloc(wb->buf, len + SSL3_RT_DEFAULT_WRITE_OVERHEAD))==NULL)
++ {
++ SSLerr(SSL_F_DO_SSL3_WRITE,ERR_R_MALLOC_FAILURE);
++ goto err;
++ }
++ wb->buf = p;
++ wb->len = len + SSL3_RT_DEFAULT_WRITE_OVERHEAD;
++ }
++
+ p = wb->buf + prefix_len;
+
+ /* write the header */
diff --git openssl-0.9.8m/ssl/ssl.h openssl-0.9.8m/ssl/ssl.h
index 47ce1ea..16a90a8 100644
--- openssl-0.9.8m/ssl/ssl.h
diff --git a/ssl/s3_pkt.c b/ssl/s3_pkt.c
index 4634b29..6511a45 100644
--- a/ssl/s3_pkt.c
+++ b/ssl/s3_pkt.c
@@ -321,7 +321,7 @@
{
if ((p=OPENSSL_realloc(s->s3->rbuf.buf, rr->length + SSL3_RT_HEADER_LENGTH))==NULL)
{
- SSLerr(SSL_F_SSL3_GET_RECORD,ERR_R_INTERNAL_ERROR);
+ SSLerr(SSL_F_SSL3_GET_RECORD,ERR_R_MALLOC_FAILURE);
goto err;
}
s->s3->rbuf.buf=p;
@@ -562,10 +562,10 @@
n=(len-tot);
for (;;)
{
- if (!(SSL_get_mode(s) & SSL_MODE_SMALL_BUFFERS))
- max_plain_length = SSL3_RT_MAX_PLAIN_LENGTH;
- else
+ if (type == SSL3_RT_APPLICATION_DATA && (SSL_get_mode(s) & SSL_MODE_SMALL_BUFFERS))
max_plain_length = SSL3_RT_DEFAULT_PLAIN_LENGTH;
+ else
+ max_plain_length = SSL3_RT_MAX_PLAIN_LENGTH;
if (n > max_plain_length)
nw = max_plain_length;
@@ -665,6 +665,18 @@
s->s3->empty_fragment_done = 1;
}
+ /* resize if necessary to hold the data. */
+ if (len + SSL3_RT_DEFAULT_WRITE_OVERHEAD > wb->len)
+ {
+ if ((p=OPENSSL_realloc(wb->buf, len + SSL3_RT_DEFAULT_WRITE_OVERHEAD))==NULL)
+ {
+ SSLerr(SSL_F_DO_SSL3_WRITE,ERR_R_MALLOC_FAILURE);
+ goto err;
+ }
+ wb->buf = p;
+ wb->len = len + SSL3_RT_DEFAULT_WRITE_OVERHEAD;
+ }
+
p = wb->buf + prefix_len;
/* write the header */