Kernel may pass an unsigned number into vmcore. For example ARM64 passes: vmcoreinfo_append_str("NUMBER(PHYS_OFFSET)=0x%llx\n", PHYS_OFFSET); Therefore, introducing read_vmcoreinfo_ulong() to read such values correctly. Signed-off-by: Pratyush Anand <panand at redhat.com> --- makedumpfile.c | 34 ++++++++++++++++++++++++++++++++++ makedumpfile.h | 16 ++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/makedumpfile.c b/makedumpfile.c index b2ea3ebdd4cb..e248db876858 100644 --- a/makedumpfile.c +++ b/makedumpfile.c @@ -2412,6 +2412,40 @@ read_vmcoreinfo_symbol(char *str_symbol) return symbol; } +unsigned long +read_vmcoreinfo_ulong(char *str_structure) +{ + long data = NOT_FOUND_LONG_VALUE; + char buf[BUFSIZE_FGETS], *endp; + unsigned int i; + + if (fseek(info->file_vmcoreinfo, 0, SEEK_SET) < 0) { + ERRMSG("Can't seek the vmcoreinfo file(%s). %s\n", + info->name_vmcoreinfo, strerror(errno)); + return INVALID_STRUCTURE_DATA; + } + + while (fgets(buf, BUFSIZE_FGETS, info->file_vmcoreinfo)) { + i = strlen(buf); + if (!i) + break; + if (buf[i - 1] == '\n') + buf[i - 1] = '\0'; + if (strncmp(buf, str_structure, strlen(str_structure)) == 0) { + data = strtoul(buf + strlen(str_structure), &endp, 10); + if (strlen(endp) != 0) + data = strtoul(buf + strlen(str_structure), &endp, 16); + if ((data == LONG_MAX) || strlen(endp) != 0) { + ERRMSG("Invalid data in %s: %s", + info->name_vmcoreinfo, buf); + return INVALID_STRUCTURE_DATA; + } + break; + } + } + return data; +} + long read_vmcoreinfo_long(char *str_structure) { diff --git a/makedumpfile.h b/makedumpfile.h index a5955ff750e5..c5e38a5b6e4b 100644 --- a/makedumpfile.h +++ b/makedumpfile.h @@ -393,6 +393,22 @@ do { \ return FALSE; \ } \ } while (0) +#define WRITE_NUMBER_UNSIGNED(str_number, number) \ +do { \ + if (NUMBER(number) != NOT_FOUND_NUMBER) { \ + fprintf(info->file_vmcoreinfo, "%s%lu\n", \ + STR_NUMBER(str_number), NUMBER(number)); \ + } \ +} while (0) +#define READ_NUMBER_UNSIGNED(str_number, number) \ +do { \ + if (NUMBER(number) == NOT_FOUND_NUMBER) { \ + NUMBER(number) = read_vmcoreinfo_ulong(STR_NUMBER(str_number)); \ + if (NUMBER(number) == INVALID_STRUCTURE_DATA) \ + return FALSE; \ + } \ +} while (0) + /* * for source file name -- 2.7.4