Blob Blame History Raw
diff -up openssl-1.0.1e/crypto/evp/encode.c.b64-overflow openssl-1.0.1e/crypto/evp/encode.c
--- openssl-1.0.1e/crypto/evp/encode.c.b64-overflow	2016-04-07 15:45:20.000000000 +0200
+++ openssl-1.0.1e/crypto/evp/encode.c	2016-04-29 12:46:34.232656522 +0200
@@ -132,12 +132,12 @@ void EVP_EncodeUpdate(EVP_ENCODE_CTX *ct
 	     const unsigned char *in, int inl)
 	{
 	int i,j;
-	unsigned int total=0;
+	size_t total=0;
 
 	*outl=0;
 	if (inl == 0) return;
 	OPENSSL_assert(ctx->length <= (int)sizeof(ctx->enc_data));
-	if ((ctx->num+inl) < ctx->length)
+	if (ctx->length - ctx->num > inl)
 		{
 		memcpy(&(ctx->enc_data[ctx->num]),in,inl);
 		ctx->num+=inl;
@@ -156,7 +156,7 @@ void EVP_EncodeUpdate(EVP_ENCODE_CTX *ct
 		*out='\0';
 		total=j+1;
 		}
-	while (inl >= ctx->length)
+	while (inl >= ctx->length && total <= INT_MAX)
 		{
 		j=EVP_EncodeBlock(out,in,ctx->length);
 		in+=ctx->length;
@@ -166,6 +166,12 @@ void EVP_EncodeUpdate(EVP_ENCODE_CTX *ct
 		*out='\0';
 		total+=j+1;
 		}
+	if (total > INT_MAX)
+		{
+		/* Too much output data! */
+		*outl = 0;
+		return;
+		}
 	if (inl != 0)
 		memcpy(&(ctx->enc_data[0]),in,inl);
 	ctx->num=inl;