151 lines
5.4 KiB
Diff
151 lines
5.4 KiB
Diff
commit 5035c0821f07da3badda645cd0064d4b80e1667d
|
|
Author: Philipp Rudo <prudo@redhat.com>
|
|
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 <dwysocha@redhat.com>
|
|
Signed-off-by: Philipp Rudo <prudo@redhat.com>
|
|
Reviewed-and-tested-by: Dave Wysochanski <dwysocha@redhat.com>
|
|
Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
|
|
|
|
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
|
|
}
|
|
|