Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ccdb4004 authored by Albin Tonnerre's avatar Albin Tonnerre Committed by Linus Torvalds
Browse files

lib: fix the use of LZO to decompress initramfs images



This patch fixes 2 issues with the LZO decompressor:

- It doesn't handle the case where a block isn't compressed at all.  In
  this case, calling lzo1x_decompress_safe will fail, so we need to just
  use memcpy() instead (the upstream LZO code does something similar)

- Since commit 54291362 ("initramfs: add
  missing decompressor error check") , the decompressor return code is
  checked in the init/initramfs.c The LZO decompressor didn't return the
  expected value, causing the initramfs code to falsely believe a
  decompression error occured

Signed-off-by: default avatarAlbin Tonnerre <albin.tonnerre@free-electrons.com>
Tested-by: default avatarbert schulze <spambemyguest@googlemail.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 23be7468
Loading
Loading
Loading
Loading
+15 −7
Original line number Diff line number Diff line
@@ -97,7 +97,7 @@ STATIC inline int INIT unlzo(u8 *input, int in_len,
	u32 src_len, dst_len;
	size_t tmp;
	u8 *in_buf, *in_buf_save, *out_buf;
	int obytes_processed = 0;
	int ret = -1;

	set_error_fn(error_fn);

@@ -174,6 +174,13 @@ STATIC inline int INIT unlzo(u8 *input, int in_len,

		/* decompress */
		tmp = dst_len;

		/* When the input data is not compressed at all,
		 * lzo1x_decompress_safe will fail, so call memcpy()
		 * instead */
		if (unlikely(dst_len == src_len))
			memcpy(out_buf, in_buf, src_len);
		else {
			r = lzo1x_decompress_safe((u8 *) in_buf, src_len,
						out_buf, &tmp);

@@ -181,8 +188,8 @@ STATIC inline int INIT unlzo(u8 *input, int in_len,
				error("Compressed data violation");
				goto exit_2;
			}
		}

		obytes_processed += dst_len;
		if (flush)
			flush(out_buf, dst_len);
		if (output)
@@ -196,6 +203,7 @@ STATIC inline int INIT unlzo(u8 *input, int in_len,
			in_buf += src_len;
	}

	ret = 0;
exit_2:
	if (!input)
		free(in_buf);
@@ -203,7 +211,7 @@ STATIC inline int INIT unlzo(u8 *input, int in_len,
	if (!output)
		free(out_buf);
exit:
	return obytes_processed;
	return ret;
}

#define decompress unlzo