diff --git a/kexec-tools-2.0.23-04-_PATCH_print_error_when_reading_with_unsupported_compression.patch b/kexec-tools-2.0.23-04-_PATCH_print_error_when_reading_with_unsupported_compression.patch new file mode 100644 index 0000000..7e933fa --- /dev/null +++ b/kexec-tools-2.0.23-04-_PATCH_print_error_when_reading_with_unsupported_compression.patch @@ -0,0 +1,150 @@ + commit 5035c0821f07da3badda645cd0064d4b80e1667d + Author: Philipp Rudo + Date: Mon Mar 14 17:04:32 2022 +0100 + + [PATCH] print error when reading with unsupported compression + + Currently makedumpfile only checks if the required compression algorithm + was enabled during build when compressing a dump but not when reading + from one. This can lead to situations where, one version of makedumpfile + creates the dump using a compression algorithm an other version of + makedumpfile doesn't support. When the second version now tries to, e.g. + extract the dmesg from the dump it will fail with an error similar to + + # makedumpfile --dump-dmesg vmcore dmesg.txt + __vtop4_x86_64: Can't get a valid pgd. + readmem: Can't convert a virtual address(ffffffff92e18284) to physical address. + readmem: type_addr: 0, addr:ffffffff92e18284, size:390 + check_release: Can't get the address of system_utsname. + + makedumpfile Failed. + + That's because readpage_kdump_compressed{_parallel} does not return + with an error if the page it is trying to read is compressed with an + unsupported compression algorithm. Thus readmem copies random data from + the (uninitialized) cachebuf to its caller and thus causing the error + above. + + Fix this by checking if the required compression algorithm is supported + in readpage_kdump_compressed{_parallel} and print a proper error message + if it isn't. + + Reported-by: Dave Wysochanski + Signed-off-by: Philipp Rudo + Reviewed-and-tested-by: Dave Wysochanski + Signed-off-by: Kazuhito Hagio + + diff --git a/makedumpfile-1.7.0/makedumpfile.c b/makedumpfile-1.7.0/makedumpfile.c + index 2b94446b8f2ad513da060e15821544ae32e1a2c6..14556db15627617cb394bba85bb7ebec6b35fb34 100644 + --- a/makedumpfile-1.7.0/makedumpfile.c + +++ b/makedumpfile-1.7.0/makedumpfile.c + @@ -865,9 +865,13 @@ readpage_kdump_compressed(unsigned long long paddr, void *bufptr) + ERRMSG("Uncompress failed: %d\n", ret); + return FALSE; + } + + } else if ((pd.flags & DUMP_DH_COMPRESSED_LZO)) { + #ifdef USELZO + - } else if (info->flag_lzo_support + - && (pd.flags & DUMP_DH_COMPRESSED_LZO)) { + + if (!info->flag_lzo_support) { + + ERRMSG("lzo compression unsupported\n"); + + return FALSE; + + } + + + retlen = info->page_size; + ret = lzo1x_decompress_safe((unsigned char *)buf, pd.size, + (unsigned char *)bufptr, &retlen, + @@ -876,9 +880,13 @@ readpage_kdump_compressed(unsigned long long paddr, void *bufptr) + ERRMSG("Uncompress failed: %d\n", ret); + return FALSE; + } + +#else + + ERRMSG("lzo compression unsupported\n"); + + ERRMSG("Try `make USELZO=on` when building.\n"); + + return FALSE; + #endif + -#ifdef USESNAPPY + } else if ((pd.flags & DUMP_DH_COMPRESSED_SNAPPY)) { + +#ifdef USESNAPPY + + ret = snappy_uncompressed_length(buf, pd.size, (size_t *)&retlen); + if (ret != SNAPPY_OK) { + @@ -891,14 +899,22 @@ readpage_kdump_compressed(unsigned long long paddr, void *bufptr) + ERRMSG("Uncompress failed: %d\n", ret); + return FALSE; + } + +#else + + ERRMSG("snappy compression unsupported\n"); + + ERRMSG("Try `make USESNAPPY=on` when building.\n"); + + return FALSE; + #endif + -#ifdef USEZSTD + } else if ((pd.flags & DUMP_DH_COMPRESSED_ZSTD)) { + +#ifdef USEZSTD + ret = ZSTD_decompress(bufptr, info->page_size, buf, pd.size); + if (ZSTD_isError(ret) || (ret != info->page_size)) { + ERRMSG("Uncompress failed: %d\n", ret); + return FALSE; + } + +#else + + ERRMSG("zstd compression unsupported\n"); + + ERRMSG("Try `make USEZSTD=on` when building.\n"); + + return FALSE; + #endif + } + + @@ -964,9 +980,13 @@ readpage_kdump_compressed_parallel(int fd_memory, unsigned long long paddr, + ERRMSG("Uncompress failed: %d\n", ret); + return FALSE; + } + + } else if ((pd.flags & DUMP_DH_COMPRESSED_LZO)) { + #ifdef USELZO + - } else if (info->flag_lzo_support + - && (pd.flags & DUMP_DH_COMPRESSED_LZO)) { + + if (!info->flag_lzo_support) { + + ERRMSG("lzo compression unsupported\n"); + + return FALSE; + + } + + + retlen = info->page_size; + ret = lzo1x_decompress_safe((unsigned char *)buf, pd.size, + (unsigned char *)bufptr, &retlen, + @@ -975,9 +995,13 @@ readpage_kdump_compressed_parallel(int fd_memory, unsigned long long paddr, + ERRMSG("Uncompress failed: %d\n", ret); + return FALSE; + } + +#else + + ERRMSG("lzo compression unsupported\n"); + + ERRMSG("Try `make USELZO=on` when building.\n"); + + return FALSE; + #endif + -#ifdef USESNAPPY + } else if ((pd.flags & DUMP_DH_COMPRESSED_SNAPPY)) { + +#ifdef USESNAPPY + + ret = snappy_uncompressed_length(buf, pd.size, (size_t *)&retlen); + if (ret != SNAPPY_OK) { + @@ -990,14 +1014,22 @@ readpage_kdump_compressed_parallel(int fd_memory, unsigned long long paddr, + ERRMSG("Uncompress failed: %d\n", ret); + return FALSE; + } + +#else + + ERRMSG("snappy compression unsupported\n"); + + ERRMSG("Try `make USESNAPPY=on` when building.\n"); + + return FALSE; + #endif + -#ifdef USEZSTD + } else if ((pd.flags & DUMP_DH_COMPRESSED_ZSTD)) { + +#ifdef USEZSTD + ret = ZSTD_decompress(bufptr, info->page_size, buf, pd.size); + if (ZSTD_isError(ret) || (ret != info->page_size)) { + ERRMSG("Uncompress failed: %d\n", ret); + return FALSE; + } + +#else + + ERRMSG("zstd compression unsupported\n"); + + ERRMSG("Try `make USEZSTD=on` when building.\n"); + + return FALSE; + #endif + } + diff --git a/kexec-tools.spec b/kexec-tools.spec index de18616..bdb908e 100644 --- a/kexec-tools.spec +++ b/kexec-tools.spec @@ -116,6 +116,7 @@ Patch602: ./kexec-tools-2.0.23-makedumpfile-sadump-kaslr-fix-failure-of-calculat Patch603: ./kexec-tools-2.0.23-01-_PATCH_v2_1_3_add_generic_cycle_detection.patch Patch604: ./kexec-tools-2.0.23-02-_PATCH_v2_2_3_use_pointer_arithmetics_for_dump_dmesg.patch Patch605: ./kexec-tools-2.0.23-03-_PATCH_v2_3_3_use_cycle_detection_when_parsing_the_prink_log_buf.patch +Patch606: ./kexec-tools-2.0.23-04-_PATCH_print_error_when_reading_with_unsupported_compression.patch %description kexec-tools provides /sbin/kexec binary that facilitates a new @@ -136,6 +137,7 @@ tar -z -x -v -f %{SOURCE19} %patch603 -p1 %patch604 -p1 %patch605 -p1 +%patch606 -p1 %ifarch ppc %define archdef ARCH=ppc