]> xenbits.xensource.com Git - xen.git/commitdiff
lz4: fix system halt at boot kernel on x86_64
authorKrzysztof Kolasa <kkolasa@winsoft.pl>
Wed, 11 Dec 2019 14:35:39 +0000 (15:35 +0100)
committerIan Jackson <ian.jackson@eu.citrix.com>
Mon, 15 Jun 2020 13:41:57 +0000 (14:41 +0100)
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>
[Linux commit 99b7e93c95c78952724a9783de6c78def8fbfc3f]

The offending commit in our case is fcc17f96c277 ("LZ4 : fix the data
abort issue").

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
master commit: 5d90ff79542ab9c6eebe5c315c68c196bcf353b9
master date: 2019-12-09 14:02:35 +0100

(cherry picked from commit 14b62ab3e5a79816edfc6dd3afce1bb68c106ac5)

xen/common/lz4/decompress.c

index e8636e193acd0f418c846fe075d446bc24fc13ab..bef3a9a99cb96ddecbcc5f685559480085b54a87 100644 (file)
@@ -132,8 +132,12 @@ static int INIT lz4_uncompress(const unsigned char *source, unsigned char *dest,
                        /* Error: request to write beyond destination buffer */
                        if (cpy > oend)
                                goto _output_error;
+#if LZ4_ARCH64
+                       if ((ref + COPYLENGTH) > oend)
+#else
                        if ((ref + COPYLENGTH) > oend ||
                                        (op + COPYLENGTH) > oend)
+#endif
                                goto _output_error;
                        LZ4_SECURECOPY(ref, op, (oend - COPYLENGTH));
                        while (op < cpy)
@@ -266,7 +270,13 @@ static int lz4_uncompress_unknownoutputsize(const unsigned char *source,
                if (cpy > oend - COPYLENGTH) {
                        if (cpy > oend)
                                goto _output_error; /* write outside of buf */
-
+#if LZ4_ARCH64
+                       if ((ref + COPYLENGTH) > oend)
+#else
+                       if ((ref + COPYLENGTH) > oend ||
+                                       (op + COPYLENGTH) > oend)
+#endif
+                               goto _output_error;
                        LZ4_SECURECOPY(ref, op, (oend - COPYLENGTH));
                        while (op < cpy)
                                *op++ = *ref++;