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 */