From: Jingbai Ma <jingbai.ma@hp.com>
To: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
Cc: kexec@lists.infradead.org, kumagai-atsushi@mxc.nes.nec.co.jp,
lisa.mitchell@hp.com, jingbai.ma@hp.com
Subject: Re: [PATCH] makedumpfile: Fix a segment fault in dumping small ELF segment
Date: Mon, 31 Mar 2014 12:21:52 +0800 [thread overview]
Message-ID: <5338ED60.7080101@hp.com> (raw)
In-Reply-To: <20140331.101633.456534574.d.hatayama@jp.fujitsu.com>
On 03/31/2014 09:16 AM, HATAYAMA Daisuke wrote:
> From: Jingbai Ma <jingbai.ma@hp.com>
> Subject: [PATCH] makedumpfile: Fix a segment fault in dumping small ELF segment
>
> ``small ELF segment'' is wrong. This issue occurs if the starting or
> ending address of the ELF segment is not aligned to multiple of 8
> pages. Could you correct the subject?
>
Will change.
> Date: Fri, 28 Mar 2014 20:26:34 +0800
>
>> This patch fixs a bug if the size of an ELF segment less than 8 pages.
>>
>
> Could you show me /proc/iomem and an output of readelf -l of the ELF
> vmcore? I'm interested in the segment.
Please see the output below.
>
>> 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@hp.com>
>> ---
>> makedumpfile.c | 26 +++++++++++++++-----------
>> 1 files changed, 15 insertions(+), 11 deletions(-)
>>
>> diff --git a/makedumpfile.c b/makedumpfile.c
>> index ef08d91..21330b7 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);
>
> Please add two more tabs in the line of the second argument of MIN()
> like this for readability:
>
> + pfn_start_roundup = MIN(roundup(pfn_start, BITPERBYTE),
> + pfn_end);
>
Will fix.
>> + 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,10 +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++;
>> + }
>
> Please add { ... } for the outer if to encolose the for statement like this:
>
> + if (pfn_end_round > pfn_start) {
> + for (pfn = pfn_end_round; pfn < pfn_end; pfn++) {
> + if (set_bit_on_1st_bitmap(pfn))
> + pfn_bitmap1++;
> + }
> + }
>
Will fix.
>> }
>> pfn_memhole -= pfn_bitmap1;
>>
>> @@ -4532,8 +4534,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);
>
> Similr.
>
Will fix.
>> + 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 +4551,10 @@ 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;
>
> Similar.
>
Will fix.
>> }
>>
>> return TRUE;
>>
>
> ==
> Thanks.
> HATAYAMA, Daisuke
>
It's a HP BL280c G6 Blade server with 32GB RAM:
cat /proc/iomem
00000000-0000ffff : reserved
00010000-00097bff : System RAM
00097c00-0009ffff : reserved
000a0000-000bffff : PCI Bus 0000:00
000c0000-000cafff : Video ROM
000cb000-000cbfff : Adapter ROM
000f0000-000fffff : reserved
000f0000-000fffff : System ROM
00100000-e761efff : System RAM
01000000-014684b3 : Kernel code
014684b4-01bd9f7f : Kernel data
01d34000-01fe5fff : Kernel bss
26000000-35ffffff : Crash kernel
e761f000-e762bfff : ACPI Tables
e762c000-e762cfff : System RAM
e762d000-ebffffff : reserved
e8000000-ebffffff : PCI MMCONFIG 0000 [bus 00-3f]
e8000000-ebffffff : pnp 00:01
ef000000-fbffffff : PCI Bus 0000:00
ef000000-ef0fffff : PCI Bus 0000:02
ef000000-ef01ffff : 0000:02:00.0
ef020000-ef03ffff : 0000:02:00.1
efffe000-efffffff : pnp 00:01
f0000000-f7ffffff : PCI Bus 0000:01
f0000000-f7ffffff : 0000:01:03.0
fbcf0000-fbcf03ff : 0000:00:1d.7
fbcf0000-fbcf03ff : ehci_hcd
fbd00000-fbefffff : PCI Bus 0000:01
fbd00000-fbd1ffff : 0000:01:03.0
fbd20000-fbd2ffff : 0000:01:04.2
fbdf0000-fbdf00ff : 0000:01:04.6
fbdf0000-fbdf0001 : ipmi_si
fbe00000-fbe7ffff : 0000:01:04.2
fbe00000-fbe7ffff : hpilo
fbec0000-fbec3fff : 0000:01:04.2
fbec0000-fbec3fff : hpilo
fbed0000-fbed07ff : 0000:01:04.2
fbed0000-fbed07ff : hpilo
fbee0000-fbee01ff : 0000:01:04.0
fbef0000-fbefffff : 0000:01:03.0
fbf00000-fbffffff : PCI Bus 0000:02
fbf00000-fbf1ffff : 0000:02:00.0
fbf20000-fbf3ffff : 0000:02:00.0
fbf50000-fbf53fff : 0000:02:00.1
fbf50000-fbf53fff : igb
fbf60000-fbf7ffff : 0000:02:00.1
fbf60000-fbf7ffff : igb
fbf80000-fbf9ffff : 0000:02:00.1
fbf80000-fbf9ffff : igb
fbfb0000-fbfb3fff : 0000:02:00.0
fbfb0000-fbfb3fff : igb
fbfc0000-fbfdffff : 0000:02:00.0
fbfc0000-fbfdffff : igb
fbfe0000-fbffffff : 0000:02:00.0
fbfe0000-fbffffff : igb
fe000000-febfffff : pnp 00:01
fec00000-fee0ffff : reserved
fec00000-fec003ff : IOAPIC 0
fec80000-fec803ff : IOAPIC 1
fed00000-fed44fff : PCI Bus 0000:00
fed00000-fed003ff : HPET 0
fee00000-fee00fff : Local APIC
ff800000-ffffffff : reserved
100000000-817ffefff : System RAM
817fff000-817ffffff : RAM buffer
readelf -l vmcore
Elf file type is CORE (Core file)
Entry point 0x0
There are 7 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
NOTE 0x0000000000001000 0x0000000000000000 0x0000000000000000
0x0000000000001110 0x0000000000001110 0
LOAD 0x0000000000003000 0xffffffff81000000 0x0000000001000000
0x0000000001006000 0x0000000001006000 RWE 0
LOAD 0x0000000001009000 0xffff880000010000 0x0000000000010000
0x0000000000087c00 0x0000000000087c00 RWE 0
LOAD 0x0000000001091000 0xffff880000100000 0x0000000000100000
0x0000000025f00000 0x0000000025f00000 RWE 0
LOAD 0x0000000026f91000 0xffff880036000000 0x0000000036000000
0x00000000b161f000 0x00000000b161f000 RWE 0
LOAD 0x00000000d85b0000 0xffff8800e762c000 0x00000000e762c000
0x0000000000001000 0x0000000000001000 RWE 0
LOAD 0x00000000d85b1000 0xffff880100000000 0x0000000100000000
0x0000000717fff000 0x0000000717fff000 RWE 0
--
Thanks,
Jingbai Ma
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
prev parent reply other threads:[~2014-03-31 4:22 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-28 12:26 [PATCH] makedumpfile: Fix a segment fault in dumping small ELF segment Jingbai Ma
2014-03-31 1:16 ` HATAYAMA Daisuke
2014-03-31 4:21 ` Jingbai Ma [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5338ED60.7080101@hp.com \
--to=jingbai.ma@hp.com \
--cc=d.hatayama@jp.fujitsu.com \
--cc=kexec@lists.infradead.org \
--cc=kumagai-atsushi@mxc.nes.nec.co.jp \
--cc=lisa.mitchell@hp.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.