Commit 156c9ebdaca20d9ce428dc189f2b24d2a0ec8eaf
Committed by
Benjamin Herrenschmidt
1 parent
7e76f34fa1
Exists in
smarc-imx_3.14.28_1.0.0_ga
and in
1 other branch
powerpc/pseries: Add backward compatibilty to read old kernel oops-log
Older kernels has just length information in their header. Handle it while reading old kernel oops log from pstore. Applies on top of powerpc/pseries: Fix buffer overflow when reading from pstore Signed-off-by: Aruna Balakrishnaiah <aruna@linux.vnet.ibm.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Showing 1 changed file with 14 additions and 4 deletions Side-by-side Diff
arch/powerpc/platforms/pseries/nvram.c
... | ... | @@ -720,15 +720,25 @@ |
720 | 720 | |
721 | 721 | if (nvram_type_ids[read_type] == PSTORE_TYPE_DMESG) { |
722 | 722 | int length, unzipped_len; |
723 | + size_t hdr_size; | |
723 | 724 | |
724 | 725 | oops_hdr = (struct oops_log_info *)buff; |
725 | - length = oops_hdr->report_length; | |
726 | + if (oops_hdr->version < OOPS_HDR_VERSION) { | |
727 | + /* Old format oops header had 2-byte record size */ | |
728 | + hdr_size = sizeof(u16); | |
729 | + length = oops_hdr->version; | |
730 | + time->tv_sec = 0; | |
731 | + time->tv_nsec = 0; | |
732 | + } else { | |
733 | + hdr_size = sizeof(*oops_hdr); | |
734 | + length = oops_hdr->report_length; | |
735 | + time->tv_sec = oops_hdr->timestamp; | |
736 | + time->tv_nsec = 0; | |
737 | + } | |
726 | 738 | *buf = kmalloc(length, GFP_KERNEL); |
727 | 739 | if (*buf == NULL) |
728 | 740 | return -ENOMEM; |
729 | - memcpy(*buf, buff + sizeof(*oops_hdr), length); | |
730 | - time->tv_sec = oops_hdr->timestamp; | |
731 | - time->tv_nsec = 0; | |
741 | + memcpy(*buf, buff + hdr_size, length); | |
732 | 742 | kfree(buff); |
733 | 743 | |
734 | 744 | if (err_type == ERR_TYPE_KERNEL_PANIC_GZ) { |