When the crash command line includes two filenames where one is a
compressed kernel and the other is a debuginfo file and they appear in
that order then if the uncompressed temporary version of the kernel is
actually larger than the debuginfo then crash will end with an error but
will also unlink the debuginfo file and will not clean up the (intended
temporary) uncompressed copy of the kernel.
This patch at least fixes the unintended unlink and leaving the
temporary present. It doesn't fix the failure to start but that's
because the wrong files are assumed the debuginfo and kernel. The size
case that led to this discovery is probably rare.
The cause is that evidence of a temporary file to unlink is that there
is a value in pc->namelist and pc->namelist_orig (or pc->namelist_debug
and pc->namelist_orig_debug) but when the file size test in
select_namelist() results in the pc->namelist copy to pc->namelist_debug
the _orig is not copied as well so the implied file to unlink is the one
set in pc->namelist (the debuginfo filename now).
The patch causes a populated namelist_orig value to be swapped with
namelist_debug_orig if the namelist value is copied to namelist_debug.
Signed-off-by: David Mair <dmair(a)suse.com>
---
symbols.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/symbols.c b/symbols.c
index 4c6fbf4..e1ed719 100644
--- a/symbols.c
+++ b/symbols.c
@@ -3520,6 +3520,7 @@ int
select_namelist(char *new)
{
struct stat stat1, stat2;
+ char *namecp;
if (pc->server_namelist) {
pc->namelist_debug = new;
@@ -3533,6 +3534,12 @@ select_namelist(char *new)
if (stat1.st_size > stat2.st_size) {
pc->namelist_debug = pc->namelist;
+ if (pc->namelist_orig)
+ {
+ namecp = pc->namelist_debug_orig;
+ pc->namelist_debug_orig = pc->namelist_orig;
+ pc->namelist_orig = namecp;
+ }
pc->namelist = new;
} else if (stat2.st_size > stat1.st_size)
pc->namelist_debug = new;