[PATCH 1/2] sadump: fix segmentation fault on sadump-related formats

HATAYAMA, Daisuke d.hatayama at jp.fujitsu.com
Wed Jun 22 01:40:25 PDT 2016


Kumagai-san,

Could you review these patches?

On 2016/06/20 14:57, HATAYAMA Daisuke wrote:
> 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 <d.hatayama at jp.fujitsu.com>
> ---
>  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
>

-- 
Thanks.
HATAYAMA, Daisuke



More information about the kexec mailing list