aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrzysztof Kolasa <kkolasa@winsoft.pl>2015-05-03 23:58:59 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-05-24 14:56:29 -0400
commit99b7e93c95c78952724a9783de6c78def8fbfc3f (patch)
treefdd2c8f93ef829138eab5f76391851cd49cbe9cb
parent61a590fa67ac3c897e7c21fd75a5c85a4671b384 (diff)
lz4: fix system halt at boot kernel on x86_64
Sometimes, on x86_64, decompression fails with the following error: Decompressing Linux... Decoding failed -- System halted This condition is not needed for a 64bit kernel(from commit d5e7caf): if( ... || (op + COPYLENGTH) > oend) goto _output_error macro LZ4_SECURE_COPY() tests op and does not copy any data when op exceeds the value. added by analogy to lz4_uncompress_unknownoutputsize(...) Signed-off-by: Krzysztof Kolasa <kkolasa@winsoft.pl> Tested-by: Alexander Kuleshov <kuleshovmail@gmail.com> Tested-by: Caleb Jorden <cjorden@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--lib/lz4/lz4_decompress.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/lib/lz4/lz4_decompress.c b/lib/lz4/lz4_decompress.c
index 26cc6029b280..6d940c72b5fc 100644
--- a/lib/lz4/lz4_decompress.c
+++ b/lib/lz4/lz4_decompress.c
@@ -140,8 +140,12 @@ static int lz4_uncompress(const char *source, char *dest, int osize)
140 /* Error: request to write beyond destination buffer */ 140 /* Error: request to write beyond destination buffer */
141 if (cpy > oend) 141 if (cpy > oend)
142 goto _output_error; 142 goto _output_error;
143#if LZ4_ARCH64
144 if ((ref + COPYLENGTH) > oend)
145#else
143 if ((ref + COPYLENGTH) > oend || 146 if ((ref + COPYLENGTH) > oend ||
144 (op + COPYLENGTH) > oend) 147 (op + COPYLENGTH) > oend)
148#endif
145 goto _output_error; 149 goto _output_error;
146 LZ4_SECURECOPY(ref, op, (oend - COPYLENGTH)); 150 LZ4_SECURECOPY(ref, op, (oend - COPYLENGTH));
147 while (op < cpy) 151 while (op < cpy)
@@ -266,7 +270,13 @@ static int lz4_uncompress_unknownoutputsize(const char *source, char *dest,
266 if (cpy > oend - COPYLENGTH) { 270 if (cpy > oend - COPYLENGTH) {
267 if (cpy > oend) 271 if (cpy > oend)
268 goto _output_error; /* write outside of buf */ 272 goto _output_error; /* write outside of buf */
269 273#if LZ4_ARCH64
274 if ((ref + COPYLENGTH) > oend)
275#else
276 if ((ref + COPYLENGTH) > oend ||
277 (op + COPYLENGTH) > oend)
278#endif
279 goto _output_error;
270 LZ4_SECURECOPY(ref, op, (oend - COPYLENGTH)); 280 LZ4_SECURECOPY(ref, op, (oend - COPYLENGTH));
271 while (op < cpy) 281 while (op < cpy)
272 *op++ = *ref++; 282 *op++ = *ref++;