Currently, makedumpfile results in segmentation fault on
sadump-related formats:

    # ~/makedumpfile --message-level 31 -l -d 31 -x ./vmlinux vmcore
    sadump: read dump device as single partition
    sadump: single partition configuration
    page_size    : 4096
    Segmentation fault

This is because although commit
5fc24bf754fa6d2c0bd0f1c6f5655de371efb9d5 started dynamically
allocating the buffer of struct dump_bitmap, the sadump source code
doesn't follow the change.

This commit fixes this by following the change.

Signed-off-by: HATAYAMA Daisuke <[email protected]>
---
 makedumpfile.c |  5 ++++-
 sadump_info.c  | 28 ++++++++++++++++++++++++++--
 2 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/makedumpfile.c b/makedumpfile.c
index 853b999..90cfc3e 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -11229,8 +11229,11 @@ out:
                        free(info->kh_memory);
                if (info->valid_pages)
                        free(info->valid_pages);
-               if (info->bitmap_memory)
+               if (info->bitmap_memory) {
+                       if (info->bitmap_memory->buf)
+                               free(info->bitmap_memory->buf);
                        free(info->bitmap_memory);
+               }
                if (info->fd_memory)
                        close(info->fd_memory);
                if (info->fd_dumpfile)
diff --git a/sadump_info.c b/sadump_info.c
index 20376f0..8716167 100644
--- a/sadump_info.c
+++ b/sadump_info.c
@@ -832,18 +832,28 @@ sadump_initialize_bitmap_memory(void)
                       strerror(errno));
                return FALSE;
        }
+
        bmp->fd = info->fd_memory;
        bmp->file_name = info->name_memory;
        bmp->no_block = -1;
-       memset(bmp->buf, 0, BUFSIZE_BITMAP);
        bmp->offset = dumpable_bitmap_offset;
 
+       bmp->buf = malloc(BUFSIZE_BITMAP);
+       if (!bmp->buf) {
+               ERRMSG("Can't allocate memory for the memory-bitmap's buffer. 
%s\n",
+                      strerror(errno));
+               free(bmp);
+               return FALSE;
+       }
+       memset(bmp->buf, 0, BUFSIZE_BITMAP);
+
        max_section = divideup(si->max_mapnr, SADUMP_PF_SECTION_NUM);
 
        block_table = calloc(sizeof(unsigned long long), max_section);
        if (block_table == NULL) {
                ERRMSG("Can't allocate memory for the block_table. %s\n",
                       strerror(errno));
+               free(bmp->buf);
                free(bmp);
                return FALSE;
        }
@@ -870,8 +880,17 @@ sadump_initialize_bitmap_memory(void)
        bmp->fd = info->fd_memory;
        bmp->file_name = info->name_memory;
        bmp->no_block = -1;
-       memset(bmp->buf, 0, BUFSIZE_BITMAP);
        bmp->offset = si->sub_hdr_offset + sh->block_size * sh->sub_hdr_size;
+
+       bmp->buf = malloc(BUFSIZE_BITMAP);
+       if (!bmp->buf) {
+               ERRMSG("Can't allocate memory for the memory-bitmap's buffer. 
%s\n",
+                      strerror(errno));
+               free(bmp);
+               return FALSE;
+       }
+       memset(bmp->buf, 0, BUFSIZE_BITMAP);
+
        si->ram_bitmap = bmp;
 
        /*
@@ -1904,6 +1923,11 @@ free_sadump_info(void)
                fclose(si->file_elf_note);
        if (si->cpu_online_mask_buf)
                free(si->cpu_online_mask_buf);
+       if (si->ram_bitmap) {
+               if (si->ram_bitmap->buf)
+                       free(si->ram_bitmap->buf);
+               free(si->ram_bitmap);
+       }
 }
 
 void
-- 
1.9.3

_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to