diff options
Diffstat (limited to 'lib/lz4/lz4_decompress.c')
| -rw-r--r-- | lib/lz4/lz4_decompress.c | 12 | 
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/lz4/lz4_decompress.c b/lib/lz4/lz4_decompress.c index df6839e3ce08..7a85967060a5 100644 --- a/lib/lz4/lz4_decompress.c +++ b/lib/lz4/lz4_decompress.c @@ -72,6 +72,8 @@ static int lz4_uncompress(const char *source, char *dest, int osize)  			len = *ip++;  			for (; len == 255; length += 255)  				len = *ip++; +			if (unlikely(length > (size_t)(length + len))) +				goto _output_error;  			length += len;  		} @@ -106,6 +108,8 @@ static int lz4_uncompress(const char *source, char *dest, int osize)  		if (length == ML_MASK) {  			for (; *ip == 255; length += 255)  				ip++; +			if (unlikely(length > (size_t)(length + *ip))) +				goto _output_error;  			length += *ip++;  		} @@ -155,7 +159,7 @@ static int lz4_uncompress(const char *source, char *dest, int osize)  	/* write overflow error detected */  _output_error: -	return (int) (-(((char *)ip) - source)); +	return -1;  }  static int lz4_uncompress_unknownoutputsize(const char *source, char *dest, @@ -188,6 +192,8 @@ static int lz4_uncompress_unknownoutputsize(const char *source, char *dest,  			int s = 255;  			while ((ip < iend) && (s == 255)) {  				s = *ip++; +				if (unlikely(length > (size_t)(length + s))) +					goto _output_error;  				length += s;  			}  		} @@ -228,6 +234,8 @@ static int lz4_uncompress_unknownoutputsize(const char *source, char *dest,  		if (length == ML_MASK) {  			while (ip < iend) {  				int s = *ip++; +				if (unlikely(length > (size_t)(length + s))) +					goto _output_error;  				length += s;  				if (s == 255)  					continue; @@ -280,7 +288,7 @@ static int lz4_uncompress_unknownoutputsize(const char *source, char *dest,  	/* write overflow error detected */  _output_error: -	return (int) (-(((char *) ip) - source)); +	return -1;  }  int lz4_decompress(const unsigned char *src, size_t *src_len,  |