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 <[email protected]>
>---
>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


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

Reply via email to