[PATCH v3] makedumpfile: Fix a segment fault in dumping not aligned ELF segment

Atsushi Kumagai kumagai-atsushi at mxc.nes.nec.co.jp
Tue Apr 1 05:12:59 EDT 2014


Hello Jingbai,

>This patch fixes a bug that will cause segment fault if the starting or ending
>address of the ELF segment is not aligned to 8 pages boundary.
>
>Changelog:
>v3:
>- Fix patch description error.

Thanks, applied for v1.5.6.


Atsushi Kumagai

>v2:
>- Change subject to describe patch correctly.
>- Some minor code format changes.
>
>In function create_1st_bitmap_cyclic() and initialize_2nd_bitmap_cyclic(),
>there are the same code:
>
>                pfn_start_roundup = roundup(pfn_start, BITPERBYTE);
>                pfn_end_round = round(pfn_end, BITPERBYTE);
>
>                for (pfn = pfn_start; pfn < pfn_start_roundup; pfn++) {
>                        if (set_bit_on_1st_bitmap(pfn))
>                                pfn_bitmap1++;
>                }
>
>In case:
>pfn_start=0xe762c, pfn_start_roundup=0xe7630
>pfn_end=0xe762d, pfn_end_round=0xe7628
>This code will set incorrect bits in the bitmap.
>In function readpage_elf():
>
>        if (!offset1) {
>                phys_start = page_head_to_phys_start(paddr);
>                offset1 = paddr_to_offset(phys_start);
>                frac_head = phys_start - paddr;
>                memset(bufptr, 0, frac_head);
>        }
>
>The invalid paddr couldn't be found, so phys_start will be zero, and frac_head
>will be negative, then memset will cause a segment fault.
>
>Signed-off-by: Jingbai Ma <jingbai.ma at hp.com>
>---
> makedumpfile.c |   27 +++++++++++++++++----------
> 1 files changed, 17 insertions(+), 10 deletions(-)
>
>diff --git a/makedumpfile.c b/makedumpfile.c
>index ef08d91..900d553 100644
>--- a/makedumpfile.c
>+++ b/makedumpfile.c
>@@ -4424,8 +4424,9 @@ create_1st_bitmap_cyclic()
> 		if (pfn_start >= pfn_end)
> 			continue;
>
>-		pfn_start_roundup = roundup(pfn_start, BITPERBYTE);
>-		pfn_end_round = round(pfn_end, BITPERBYTE);
>+		pfn_start_roundup = MIN(roundup(pfn_start, BITPERBYTE),
>+					pfn_end);
>+		pfn_end_round = MAX(round(pfn_end, BITPERBYTE), pfn_start);
>
> 		for (pfn = pfn_start; pfn < pfn_start_roundup; pfn++) {
> 			if (set_bit_on_1st_bitmap(pfn))
>@@ -4443,9 +4444,11 @@ create_1st_bitmap_cyclic()
> 			pfn_bitmap1 += (pfn_end_byte - pfn_start_byte) * BITPERBYTE;
> 		}
>
>-		for (pfn = pfn_end_round; pfn < pfn_end; pfn++) {
>-			if (set_bit_on_1st_bitmap(pfn))
>-				pfn_bitmap1++;
>+		if (pfn_end_round > pfn_start) {
>+			for (pfn = pfn_end_round; pfn < pfn_end; pfn++) {
>+				if (set_bit_on_1st_bitmap(pfn))
>+					pfn_bitmap1++;
>+			}
> 		}
> 	}
> 	pfn_memhole -= pfn_bitmap1;
>@@ -4532,8 +4535,9 @@ initialize_2nd_bitmap_cyclic(void)
> 		if (pfn_start >= pfn_end)
> 			continue;
>
>-		pfn_start_roundup = roundup(pfn_start, BITPERBYTE);
>-		pfn_end_round = round(pfn_end, BITPERBYTE);
>+		pfn_start_roundup = MIN(roundup(pfn_start, BITPERBYTE),
>+					pfn_end);
>+		pfn_end_round = MAX(round(pfn_end, BITPERBYTE), pfn_start);
>
> 		for (pfn = pfn_start; pfn < pfn_start_roundup; ++pfn)
> 			if (!set_bit_on_2nd_bitmap_for_kernel(pfn))
>@@ -4548,9 +4552,12 @@ initialize_2nd_bitmap_cyclic(void)
> 			       pfn_end_byte - pfn_start_byte);
> 		}
>
>-		for (pfn = pfn_end_round; pfn < pfn_end; ++pfn)
>-			if (!set_bit_on_2nd_bitmap_for_kernel(pfn))
>-				return FALSE;
>+		if (pfn_end_round > pfn_start) {
>+			for (pfn = pfn_end_round; pfn < pfn_end; ++pfn) {
>+				if (!set_bit_on_2nd_bitmap_for_kernel(pfn))
>+					return FALSE;
>+			}
>+		}
> 	}
>
> 	return TRUE;


More information about the kexec mailing list