linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/1] s390: fix initrd corruption in decompressor with new zstd version
@ 2023-01-29 22:47 Vasily Gorbik
  2023-01-29 22:47 ` [PATCH 1/1] s390/decompressor: specify __decompress() buf len to avoid overflow Vasily Gorbik
  0 siblings, 1 reply; 4+ messages in thread
From: Vasily Gorbik @ 2023-01-29 22:47 UTC (permalink / raw)
  To: Heiko Carstens, Alexander Egorenkov
  Cc: Thomas Bogendoerfer, Nick Terrell, linux-s390, linux-kernel, linux-mips

The new version of zstd library integrated in the kernel since v6.2-rc1
https://lore.kernel.org/all/20221024202606.404049-1-nickrterrell@gmail.com/
contains commit
https://github.com/facebook/zstd/commit/6a7ede3dfccb
which introduces a side effect for historical usage of __decompress() function,
i.e. not specifying "out_len" parameter and expecting that no writes beyond
uncompressed kernel image are performed. More details are in follow up fix.

From architectures which claim HAVE_KERNEL_ZSTD, s390 and MIPS use
__decompress() without specifying "out_len". On s390 this leads to
initrd corruption.
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2003348

I haven't looked in details for MIPS but I've added Thomas as the
maintainer and MIPS list in Cc.

The follow up fix addresses that for s390.

Vasily Gorbik (1):
  s390/decompressor: specify __decompress() buf len to avoid overflow

 arch/s390/boot/decompressor.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

-- 
2.38.1

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/1] s390/decompressor: specify __decompress() buf len to avoid overflow
  2023-01-29 22:47 [PATCH 0/1] s390: fix initrd corruption in decompressor with new zstd version Vasily Gorbik
@ 2023-01-29 22:47 ` Vasily Gorbik
  2023-01-30 14:41   ` Alexander Egorenkov
  2023-01-30 15:15   ` Heiko Carstens
  0 siblings, 2 replies; 4+ messages in thread
From: Vasily Gorbik @ 2023-01-29 22:47 UTC (permalink / raw)
  To: Heiko Carstens, Alexander Egorenkov
  Cc: Thomas Bogendoerfer, Nick Terrell, linux-s390, linux-kernel, linux-mips

Historically calls to __decompress() didn't specify "out_len" parameter
on many architectures including s390, expecting that no writes beyond
uncompressed kernel image are performed. This has changed since commit
2aa14b1ab2c4 ("zstd: import usptream v1.5.2") which includes zstd library
commit 6a7ede3dfccb ("Reduce size of dctx by reutilizing dst buffer
(#2751)"). Now zstd decompression code might store literal buffer in
the unwritten portion of the destination buffer. Since "out_len" is
not set, it is considered to be unlimited and hence free to use for
optimization needs. On s390 this might corrupt initrd or ipl report
which are often placed right after the decompressor buffer. Luckily the
size of uncompressed kernel image is already known to the decompressor,
so to avoid the problem simply specify it in the "out_len" parameter.

Link: https://github.com/facebook/zstd/commit/6a7ede3dfccb
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
---
 arch/s390/boot/decompressor.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/s390/boot/decompressor.c b/arch/s390/boot/decompressor.c
index 090621b98d95..d762733a0753 100644
--- a/arch/s390/boot/decompressor.c
+++ b/arch/s390/boot/decompressor.c
@@ -81,6 +81,6 @@ void *decompress_kernel(void)
 	void *output = (void *)decompress_offset;
 
 	__decompress(_compressed_start, _compressed_end - _compressed_start,
-		     NULL, NULL, output, 0, NULL, error);
+		     NULL, NULL, output, vmlinux.image_size, NULL, error);
 	return output;
 }
-- 
2.38.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/1] s390/decompressor: specify __decompress() buf len to avoid overflow
  2023-01-29 22:47 ` [PATCH 1/1] s390/decompressor: specify __decompress() buf len to avoid overflow Vasily Gorbik
@ 2023-01-30 14:41   ` Alexander Egorenkov
  2023-01-30 15:15   ` Heiko Carstens
  1 sibling, 0 replies; 4+ messages in thread
From: Alexander Egorenkov @ 2023-01-30 14:41 UTC (permalink / raw)
  To: gor
  Cc: egorenar, hca, linux-kernel, linux-mips, linux-s390, terrelln, tsbogend

Hi Vasily,

thanks for the fix, tested on s390 + KVM + buildroot + linux-next.

Tested-by: Alexander Egorenkov <egorenar@linux.ibm.com>

Regards
Alex

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/1] s390/decompressor: specify __decompress() buf len to avoid overflow
  2023-01-29 22:47 ` [PATCH 1/1] s390/decompressor: specify __decompress() buf len to avoid overflow Vasily Gorbik
  2023-01-30 14:41   ` Alexander Egorenkov
@ 2023-01-30 15:15   ` Heiko Carstens
  1 sibling, 0 replies; 4+ messages in thread
From: Heiko Carstens @ 2023-01-30 15:15 UTC (permalink / raw)
  To: Vasily Gorbik
  Cc: Alexander Egorenkov, Thomas Bogendoerfer, Nick Terrell,
	linux-s390, linux-kernel, linux-mips

On Sun, Jan 29, 2023 at 11:47:23PM +0100, Vasily Gorbik wrote:
> Historically calls to __decompress() didn't specify "out_len" parameter
> on many architectures including s390, expecting that no writes beyond
> uncompressed kernel image are performed. This has changed since commit
> 2aa14b1ab2c4 ("zstd: import usptream v1.5.2") which includes zstd library
> commit 6a7ede3dfccb ("Reduce size of dctx by reutilizing dst buffer
> (#2751)"). Now zstd decompression code might store literal buffer in
> the unwritten portion of the destination buffer. Since "out_len" is
> not set, it is considered to be unlimited and hence free to use for
> optimization needs. On s390 this might corrupt initrd or ipl report
> which are often placed right after the decompressor buffer. Luckily the
> size of uncompressed kernel image is already known to the decompressor,
> so to avoid the problem simply specify it in the "out_len" parameter.
> 
> Link: https://github.com/facebook/zstd/commit/6a7ede3dfccb
> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
> ---
>  arch/s390/boot/decompressor.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

Applied, thanks!

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-01-30 15:16 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-29 22:47 [PATCH 0/1] s390: fix initrd corruption in decompressor with new zstd version Vasily Gorbik
2023-01-29 22:47 ` [PATCH 1/1] s390/decompressor: specify __decompress() buf len to avoid overflow Vasily Gorbik
2023-01-30 14:41   ` Alexander Egorenkov
2023-01-30 15:15   ` Heiko Carstens

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).