Blame SOURCES/openssl-1.0.1e-cve-2016-2177.patch

653b37
diff -up openssl-1.0.1e/ssl/ssl_sess.c.pointer-arithmetic openssl-1.0.1e/ssl/ssl_sess.c
653b37
diff -up openssl-1.0.1e/ssl/s3_srvr.c.pointer-arithmetic openssl-1.0.1e/ssl/s3_srvr.c
653b37
--- openssl-1.0.1e/ssl/s3_srvr.c.pointer-aritmetic	2016-09-20 15:00:06.348015761 +0200
653b37
+++ openssl-1.0.1e/ssl/s3_srvr.c	2016-09-20 15:14:11.630423575 +0200
653b37
@@ -973,6 +973,13 @@ int ssl3_get_client_hello(SSL *s)
653b37
 		unsigned int session_length, cookie_length;
653b37
 		
653b37
 		session_length = *(p + SSL3_RANDOM_SIZE);
653b37
+
653b37
+		if (SSL3_RANDOM_SIZE + session_length + 1 >= (d + n) - p)
653b37
+			{
653b37
+			al = SSL_AD_DECODE_ERROR;
653b37
+			SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
653b37
+			goto f_err;
653b37
+			}
653b37
 		cookie_length = *(p + SSL3_RANDOM_SIZE + session_length + 1);
653b37
 
653b37
 		if (cookie_length == 0)
653b37
@@ -986,6 +993,13 @@ int ssl3_get_client_hello(SSL *s)
653b37
 	/* get the session-id */
653b37
 	j= *(p++);
653b37
 
653b37
+	if ((d + n) - p < j)
653b37
+		{
653b37
+		al = SSL_AD_DECODE_ERROR;
653b37
+		SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
653b37
+		goto f_err;
653b37
+		}
653b37
+
653b37
 	s->hit=0;
653b37
 	/* Versions before 0.9.7 always allow clients to resume sessions in renegotiation.
653b37
 	 * 0.9.7 and later allow this by default, but optionally ignore resumption requests
653b37
@@ -1024,8 +1038,21 @@ int ssl3_get_client_hello(SSL *s)
653b37
 	if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER)
653b37
 		{
653b37
 		/* cookie stuff */
653b37
+		if ((d + n) - p < 1)
653b37
+			{
653b37
+			al = SSL_AD_DECODE_ERROR;
653b37
+			SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
653b37
+			goto f_err;
653b37
+			}
653b37
 		cookie_len = *(p++);
653b37
 
653b37
+		if ((d + n ) - p < cookie_len)
653b37
+			{
653b37
+			al = SSL_AD_DECODE_ERROR;
653b37
+			SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
653b37
+			goto f_err;
653b37
+			}
653b37
+
653b37
 		/* 
653b37
 		 * The ClientHello may contain a cookie even if the
653b37
 		 * HelloVerify message has not been sent--make sure that it
653b37
@@ -1072,6 +1099,12 @@ int ssl3_get_client_hello(SSL *s)
653b37
 		p += cookie_len;
653b37
 		}
653b37
 
653b37
+		if ((d + n ) - p < 2)
653b37
+			{
653b37
+			al = SSL_AD_DECODE_ERROR;
653b37
+			SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_TOO_SHORT);
653b37
+			goto f_err;
653b37
+			}
653b37
 	n2s(p,i);
653b37
 	if ((i == 0) && (j != 0))
653b37
 		{
653b37
@@ -1080,7 +1113,9 @@ int ssl3_get_client_hello(SSL *s)
653b37
 		SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_CIPHERS_SPECIFIED);
653b37
 		goto f_err;
653b37
 		}
653b37
-	if ((p+i) >= (d+n))
653b37
+
653b37
+	/* i bytes of cipher data + 1 byte for compression length later */
653b37
+	if ((d + n) - p < i + 1)
653b37
 		{
653b37
 		/* not enough data */
653b37
 		al=SSL_AD_DECODE_ERROR;
653b37
@@ -1147,7 +1182,7 @@ int ssl3_get_client_hello(SSL *s)
653b37
 
653b37
 	/* compression */
653b37
 	i= *(p++);
653b37
-	if ((p+i) > (d+n))
653b37
+	if ((d + n) - p < i)
653b37
 		{
653b37
 		/* not enough data */
653b37
 		al=SSL_AD_DECODE_ERROR;
653b37
diff -up openssl-1.0.1e/ssl/t1_lib.c.pointer-arithmetic openssl-1.0.1e/ssl/t1_lib.c
653b37
--- openssl-1.0.1e/ssl/t1_lib.c.pointer-aritmetic	2016-09-20 15:00:06.351015830 +0200
653b37
+++ openssl-1.0.1e/ssl/t1_lib.c	2016-09-20 15:37:34.660870014 +0200
653b37
@@ -923,19 +923,19 @@ int ssl_parse_clienthello_tlsext(SSL *s,
653b37
 	                       SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
653b37
 #endif
653b37
 
653b37
-	if (data >= (d+n-2))
653b37
+	if ((d + n) - data < 2)
653b37
 		goto ri_check;
653b37
 	n2s(data,len);
653b37
 
653b37
-	if (data > (d+n-len)) 
653b37
+	if ((d + n) - data < len) 
653b37
 		goto ri_check;
653b37
 
653b37
-	while (data <= (d+n-4))
653b37
+	while ((d + n) - data >= 4)
653b37
 		{
653b37
 		n2s(data,type);
653b37
 		n2s(data,size);
653b37
 
653b37
-		if (data+size > (d+n))
653b37
+		if ((d + n) - data < size)
653b37
 	   		goto ri_check;
653b37
 #if 0
653b37
 		fprintf(stderr,"Received extension type %d size %d\n",type,size);
653b37
@@ -1437,22 +1437,22 @@ int ssl_parse_serverhello_tlsext(SSL *s,
653b37
 	                       SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
653b37
 #endif
653b37
 
653b37
-	if (data >= (d+n-2))
653b37
+	if ((d + n) - data <= 2)
653b37
 		goto ri_check;
653b37
 
653b37
 	n2s(data,length);
653b37
-	if (data+length != d+n)
653b37
+	if ((d + n) - data != length)
653b37
 		{
653b37
 		*al = SSL_AD_DECODE_ERROR;
653b37
 		return 0;
653b37
 		}
653b37
 
653b37
-	while(data <= (d+n-4))
653b37
+	while ((d + n) - data >= 4)
653b37
 		{
653b37
 		n2s(data,type);
653b37
 		n2s(data,size);
653b37
 
653b37
-		if (data+size > (d+n))
653b37
+		if ((d + n) - data < size)
653b37
 	   		goto ri_check;
653b37
 
653b37
 		if (s->tlsext_debug_cb)
653b37
@@ -2139,30 +2139,30 @@ int tls1_process_ticket(SSL *s, unsigned
653b37
 	if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER)
653b37
 		{
653b37
 		i = *(p++);
653b37
-		p+= i;
653b37
-		if (p >= limit)
653b37
+		if (limit - p <= i)
653b37
 			return -1;
653b37
+		p += i;
653b37
 		}
653b37
 	/* Skip past cipher list */
653b37
 	n2s(p, i);
653b37
-	p+= i;
653b37
-	if (p >= limit)
653b37
+	if (limit - p <= i)
653b37
 		return -1;
653b37
+	p += i;
653b37
 	/* Skip past compression algorithm list */
653b37
 	i = *(p++);
653b37
-	p += i;
653b37
-	if (p > limit)
653b37
+	if (limit - p  < i)
653b37
 		return -1;
653b37
+	p += i;
653b37
 	/* Now at start of extensions */
653b37
-	if ((p + 2) >= limit)
653b37
+	if (limit - p <= 2)
653b37
 		return 0;
653b37
 	n2s(p, i);
653b37
-	while ((p + 4) <= limit)
653b37
+	while (limit - p >= 4)
653b37
 		{
653b37
 		unsigned short type, size;
653b37
 		n2s(p, type);
653b37
 		n2s(p, size);
653b37
-		if (p + size > limit)
653b37
+		if (limit - p < size)
653b37
 			return 0;
653b37
 		if (type == TLSEXT_TYPE_session_ticket)
653b37
 			{