[makedumpfile PATCH v2] Wipe excluded pages that are written into ELF dump file
Atsushi Kumagai
ats-kumagai at wm.jp.nec.com
Mon Aug 7 19:25:08 PDT 2017
Hello Eric,
>When a page is excluded by any of the existing dump levels,
>that page may still be written to the ELF dump file, depending
>upon the PFN_EXCLUDED mechanism.
>
>The PFN_EXCLUDED mechanism looks for N consecutive "not
>dumpable" pages, and if found, the current ELF segment is
>closed out and a new ELF segment started, at the next dumpable
>page. Otherwise, if the PFN_EXCLUDED criteria is not meet (that
>is, there is a mix of dumpable and not dumpable pages, but not
>N consecutive not dumpable pages) all pages are written to the
>dump file.
>
>This patch implements a mechanism for those "not dumpable" pages
>that are written to the ELF dump file to fill those pages with
>constant data, rather than the original data. In other words,
>the dump file still contains the page, but its data is wiped.
>The data is wiped with the value 0xDEAD9A6EDEAD9A6EUL (an
>attempt at DEADPAGE in hex, which works for 32-bit targets as
>well).
>
>The motivation for doing this is to protect real user (customer)
>data from "leaking" through to a dump file when that data was
>intended to be omitted.
>
>Signed-off-by: Eric DeVolder <eric.devolder at oracle.com>
>---
>v2: posted 04aug2017 to mailing list
> - Incorporate feedback from Daniel Kiper (wipe value)
> - Incorporate feedback from Atsushi Kumagai (eliminate the
> option and make as default/builtin behavior)
Thanks for your work, this version looks good to me.
I'll merge this into v1.6.3.
Regards,
Atsushi Kumagai
>v1: posted 31jul2017 to mailing list
>---
> makedumpfile.c | 27 ++++++++++++++++++++-------
> makedumpfile.h | 1 +
> 2 files changed, 21 insertions(+), 7 deletions(-)
>
>diff --git a/makedumpfile.c b/makedumpfile.c
>index f85003a..66c3105 100644
>--- a/makedumpfile.c
>+++ b/makedumpfile.c
>@@ -7139,7 +7139,7 @@ out:
>
> int
> write_elf_load_segment(struct cache_data *cd_page, unsigned long long paddr,
>- off_t off_memory, long long size)
>+ off_t off_memory, long long size, struct cycle *cycle)
> {
> long page_size = info->page_size;
> long long bufsz_write;
>@@ -7163,10 +7163,23 @@ write_elf_load_segment(struct cache_data *cd_page, unsigned long long paddr,
> else
> bufsz_write = size;
>
>- if (read(info->fd_memory, buf, bufsz_write) != bufsz_write) {
>- ERRMSG("Can't read the dump memory(%s). %s\n",
>- info->name_memory, strerror(errno));
>- return FALSE;
>+ if (!is_dumpable(info->bitmap2, paddr_to_pfn(paddr), cycle)) {
>+ unsigned k;
>+ unsigned long *p = (unsigned long *)buf;
>+ for (k = 0; k < info->page_size; k += sizeof(unsigned long)) {
>+ *p++ = FILL_EXCLUDED_PAGES_VALUE;
>+ }
>+ if (lseek(info->fd_memory, bufsz_write, SEEK_CUR) < 0) {
>+ ERRMSG("Can't seek the dump memory(%s). %s\n",
>+ info->name_memory, strerror(errno));
>+ return FALSE;
>+ }
>+ } else {
>+ if (read(info->fd_memory, buf, bufsz_write) != bufsz_write) {
>+ ERRMSG("Can't read the dump memory(%s). %s\n",
>+ info->name_memory, strerror(errno));
>+ return FALSE;
>+ }
> }
> filter_data_buffer((unsigned char *)buf, paddr, bufsz_write);
> paddr += bufsz_write;
>@@ -7431,7 +7444,7 @@ write_elf_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_page)
> */
> if (load.p_filesz)
> if (!write_elf_load_segment(cd_page, paddr,
>- off_memory, load.p_filesz))
>+ off_memory, load.p_filesz, &cycle))
> return FALSE;
>
> load.p_paddr += load.p_memsz;
>@@ -7473,7 +7486,7 @@ write_elf_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_page)
> */
> if (load.p_filesz)
> if (!write_elf_load_segment(cd_page, paddr,
>- off_memory, load.p_filesz))
>+ off_memory, load.p_filesz, &cycle))
> return FALSE;
>
> off_seg_load += load.p_filesz;
>diff --git a/makedumpfile.h b/makedumpfile.h
>index 8a05794..e043cf2 100644
>--- a/makedumpfile.h
>+++ b/makedumpfile.h
>@@ -223,6 +223,7 @@ isAnon(unsigned long mapping)
> #define FILENAME_BITMAP "kdump_bitmapXXXXXX"
> #define FILENAME_STDOUT "STDOUT"
> #define MAP_REGION (4096*1024)
>+#define FILL_EXCLUDED_PAGES_VALUE (0xDEAD9A6EDEAD9A6EUL)
>
> /*
> * Minimam vmcore has 2 ProgramHeaderTables(PT_NOTE and PT_LOAD).
>--
>2.7.4
More information about the kexec
mailing list