Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly
On Mon, Mar 11, 2013 at 09:31:41AM +0900, HATAYAMA Daisuke wrote: > From: Zhang Yanfei > Subject: Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly > Date: Sun, 10 Mar 2013 14:46:31 +0800 > > > 于 2013年03月05日 15:35, Zhang Yanfei 写道: > >> 于 2013年03月02日 16:35, HATAYAMA Daisuke 写道: > > > > > One minor suggestion. > > > > Previously, when the code assumes program headers are following immediately > > the ELF header, it uses > > > > elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr); > > > > to calculate the size of ELF header and ELF program headers > > > > This patch avoids the assumption, and uses ehdr.e_phoff to get the program > > headers' address. But it will read unrelated contents into elfcorebuf if > > program headers are not following immediately the ELF header. So could the > > code be: > > > > elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr); > > addr = elfcorehdr_addr + ehdr.e_phoff; > > memcpy(elfcorebuf, , sizeof(Elf64_Ehdr)); > > read_from_oldmem(elfcorebuf + sizeof(Elf64_Ehdr), elfcorebuf_sz - > > sizeof(Elf64_Ehdr), , 0); > > (Elf64_Ehdr *)elfcorebuf->e_phoff = sizeof(Elf64_Ehdr); > > Thanks. This is not minor suggestion. This is critical. My code is > completely broken. On ELF, segments and headers other than ELF header > can occur in any positions. This means program header table can occur > after segments. So, on terabyte systems, e_phoff can be more than > terabytes. Agreed. It is safer to not copy al the bits till e_phoff. Thanks Vivek -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly
On Mon, Mar 11, 2013 at 09:31:41AM +0900, HATAYAMA Daisuke wrote: From: Zhang Yanfei zhangyan...@cn.fujitsu.com Subject: Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly Date: Sun, 10 Mar 2013 14:46:31 +0800 于 2013年03月05日 15:35, Zhang Yanfei 写道: 于 2013年03月02日 16:35, HATAYAMA Daisuke 写道: cut One minor suggestion. Previously, when the code assumes program headers are following immediately the ELF header, it uses elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr); to calculate the size of ELF header and ELF program headers This patch avoids the assumption, and uses ehdr.e_phoff to get the program headers' address. But it will read unrelated contents into elfcorebuf if program headers are not following immediately the ELF header. So could the code be: elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr); addr = elfcorehdr_addr + ehdr.e_phoff; memcpy(elfcorebuf, ehdr, sizeof(Elf64_Ehdr)); read_from_oldmem(elfcorebuf + sizeof(Elf64_Ehdr), elfcorebuf_sz - sizeof(Elf64_Ehdr), addr, 0); (Elf64_Ehdr *)elfcorebuf-e_phoff = sizeof(Elf64_Ehdr); Thanks. This is not minor suggestion. This is critical. My code is completely broken. On ELF, segments and headers other than ELF header can occur in any positions. This means program header table can occur after segments. So, on terabyte systems, e_phoff can be more than terabytes. Agreed. It is safer to not copy al the bits till e_phoff. Thanks Vivek -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly
From: Zhang Yanfei Subject: Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly Date: Sun, 10 Mar 2013 14:46:31 +0800 > 于 2013年03月05日 15:35, Zhang Yanfei 写道: >> 于 2013年03月02日 16:35, HATAYAMA Daisuke 写道: > > One minor suggestion. > > Previously, when the code assumes program headers are following immediately > the ELF header, it uses > > elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr); > > to calculate the size of ELF header and ELF program headers > > This patch avoids the assumption, and uses ehdr.e_phoff to get the program > headers' address. But it will read unrelated contents into elfcorebuf if > program headers are not following immediately the ELF header. So could the > code be: > > elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr); > addr = elfcorehdr_addr + ehdr.e_phoff; > memcpy(elfcorebuf, , sizeof(Elf64_Ehdr)); > read_from_oldmem(elfcorebuf + sizeof(Elf64_Ehdr), elfcorebuf_sz - > sizeof(Elf64_Ehdr), , 0); > (Elf64_Ehdr *)elfcorebuf->e_phoff = sizeof(Elf64_Ehdr); Thanks. This is not minor suggestion. This is critical. My code is completely broken. On ELF, segments and headers other than ELF header can occur in any positions. This means program header table can occur after segments. So, on terabyte systems, e_phoff can be more than terabytes. Sorry, this was due to my carelessness. Thanks. HATAYAMA, Daisuke -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly
From: Zhang Yanfei zhangyan...@cn.fujitsu.com Subject: Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly Date: Sun, 10 Mar 2013 14:46:31 +0800 于 2013年03月05日 15:35, Zhang Yanfei 写道: 于 2013年03月02日 16:35, HATAYAMA Daisuke 写道: cut One minor suggestion. Previously, when the code assumes program headers are following immediately the ELF header, it uses elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr); to calculate the size of ELF header and ELF program headers This patch avoids the assumption, and uses ehdr.e_phoff to get the program headers' address. But it will read unrelated contents into elfcorebuf if program headers are not following immediately the ELF header. So could the code be: elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr); addr = elfcorehdr_addr + ehdr.e_phoff; memcpy(elfcorebuf, ehdr, sizeof(Elf64_Ehdr)); read_from_oldmem(elfcorebuf + sizeof(Elf64_Ehdr), elfcorebuf_sz - sizeof(Elf64_Ehdr), addr, 0); (Elf64_Ehdr *)elfcorebuf-e_phoff = sizeof(Elf64_Ehdr); Thanks. This is not minor suggestion. This is critical. My code is completely broken. On ELF, segments and headers other than ELF header can occur in any positions. This means program header table can occur after segments. So, on terabyte systems, e_phoff can be more than terabytes. Sorry, this was due to my carelessness. Thanks. HATAYAMA, Daisuke -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly
于 2013年03月05日 15:35, Zhang Yanfei 写道: > 于 2013年03月02日 16:35, HATAYAMA Daisuke 写道: >> Code around /proc/vmcore currently assumes program header table is >> next to ELF header. But future change can break the assumption on >> kexec-tools and the 1st kernel. To avoid worst case, now refer to >> e_phoff member that indicates position of program header table in >> file-offset. > > Reviewed-by: Zhang Yanfei > >> >> Signed-off-by: HATAYAMA Daisuke >> --- >> >> fs/proc/vmcore.c | 40 >> 1 files changed, 20 insertions(+), 20 deletions(-) >> >> diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c >> index b870f74..abf4f01 100644 >> --- a/fs/proc/vmcore.c >> +++ b/fs/proc/vmcore.c >> @@ -221,8 +221,8 @@ static u64 __init get_vmcore_size_elf64(char *elfptr) >> Elf64_Phdr *phdr_ptr; >> >> ehdr_ptr = (Elf64_Ehdr *)elfptr; >> -phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); >> -size = sizeof(Elf64_Ehdr) + ((ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr)); >> +phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr->e_phoff); >> +size = ehdr_ptr->e_phoff + ((ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr)); >> for (i = 0; i < ehdr_ptr->e_phnum; i++) { >> size += phdr_ptr->p_memsz; >> phdr_ptr++; >> @@ -238,8 +238,8 @@ static u64 __init get_vmcore_size_elf32(char *elfptr) >> Elf32_Phdr *phdr_ptr; >> >> ehdr_ptr = (Elf32_Ehdr *)elfptr; >> -phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); >> -size = sizeof(Elf32_Ehdr) + ((ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr)); >> +phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr->e_phoff); >> +size = ehdr_ptr->e_phoff + ((ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr)); >> for (i = 0; i < ehdr_ptr->e_phnum; i++) { >> size += phdr_ptr->p_memsz; >> phdr_ptr++; >> @@ -259,7 +259,7 @@ static int __init merge_note_headers_elf64(char *elfptr, >> size_t *elfsz, >> u64 phdr_sz = 0, note_off; >> >> ehdr_ptr = (Elf64_Ehdr *)elfptr; >> -phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); >> +phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr->e_phoff); >> for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) { >> int j; >> void *notes_section; >> @@ -305,7 +305,7 @@ static int __init merge_note_headers_elf64(char *elfptr, >> size_t *elfsz, >> /* Prepare merged PT_NOTE program header. */ >> phdr.p_type= PT_NOTE; >> phdr.p_flags = 0; >> -note_off = sizeof(Elf64_Ehdr) + >> +note_off = ehdr_ptr->e_phoff + >> (ehdr_ptr->e_phnum - nr_ptnote +1) * sizeof(Elf64_Phdr); >> phdr.p_offset = note_off; >> phdr.p_vaddr = phdr.p_paddr = 0; >> @@ -313,14 +313,14 @@ static int __init merge_note_headers_elf64(char >> *elfptr, size_t *elfsz, >> phdr.p_align = 0; >> >> /* Add merged PT_NOTE program header*/ >> -tmp = elfptr + sizeof(Elf64_Ehdr); >> +tmp = elfptr + ehdr_ptr->e_phoff; >> memcpy(tmp, , sizeof(phdr)); >> tmp += sizeof(phdr); >> >> /* Remove unwanted PT_NOTE program headers. */ >> i = (nr_ptnote - 1) * sizeof(Elf64_Phdr); >> *elfsz = *elfsz - i; >> -memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf64_Ehdr)-sizeof(Elf64_Phdr))); >> +memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr->e_phoff-sizeof(Elf64_Phdr))); >> >> /* Modify e_phnum to reflect merged headers. */ >> ehdr_ptr->e_phnum = ehdr_ptr->e_phnum - nr_ptnote + 1; >> @@ -340,7 +340,7 @@ static int __init merge_note_headers_elf32(char *elfptr, >> size_t *elfsz, >> u64 phdr_sz = 0, note_off; >> >> ehdr_ptr = (Elf32_Ehdr *)elfptr; >> -phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); >> +phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr->e_phoff); >> for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) { >> int j; >> void *notes_section; >> @@ -386,7 +386,7 @@ static int __init merge_note_headers_elf32(char *elfptr, >> size_t *elfsz, >> /* Prepare merged PT_NOTE program header. */ >> phdr.p_type= PT_NOTE; >> phdr.p_flags = 0; >> -note_off = sizeof(Elf32_Ehdr) + >> +note_off = ehdr_ptr->e_phoff + >> (ehdr_ptr->e_phnum - nr_ptnote +1) * sizeof(Elf32_Phdr); >> phdr.p_offset = note_off; >> phdr.p_vaddr = phdr.p_paddr = 0; >> @@ -394,14 +394,14 @@ static int __init merge_note_headers_elf32(char >> *elfptr, size_t *elfsz, >> phdr.p_align = 0; >> >> /* Add merged PT_NOTE program header*/ >> -tmp = elfptr + sizeof(Elf32_Ehdr); >> +tmp = elfptr + ehdr_ptr->e_phoff; >> memcpy(tmp, , sizeof(phdr)); >> tmp += sizeof(phdr); >> >> /* Remove unwanted PT_NOTE program headers. */ >> i = (nr_ptnote - 1) * sizeof(Elf32_Phdr); >> *elfsz = *elfsz - i; >> -memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf32_Ehdr)-sizeof(Elf32_Phdr))); >> +memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr->e_phoff-sizeof(Elf32_Phdr))); >> >> /*
Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly
于 2013年03月05日 15:35, Zhang Yanfei 写道: 于 2013年03月02日 16:35, HATAYAMA Daisuke 写道: Code around /proc/vmcore currently assumes program header table is next to ELF header. But future change can break the assumption on kexec-tools and the 1st kernel. To avoid worst case, now refer to e_phoff member that indicates position of program header table in file-offset. Reviewed-by: Zhang Yanfei zhangyan...@cn.fujitsu.com Signed-off-by: HATAYAMA Daisuke d.hatay...@jp.fujitsu.com --- fs/proc/vmcore.c | 40 1 files changed, 20 insertions(+), 20 deletions(-) diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c index b870f74..abf4f01 100644 --- a/fs/proc/vmcore.c +++ b/fs/proc/vmcore.c @@ -221,8 +221,8 @@ static u64 __init get_vmcore_size_elf64(char *elfptr) Elf64_Phdr *phdr_ptr; ehdr_ptr = (Elf64_Ehdr *)elfptr; -phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); -size = sizeof(Elf64_Ehdr) + ((ehdr_ptr-e_phnum) * sizeof(Elf64_Phdr)); +phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr-e_phoff); +size = ehdr_ptr-e_phoff + ((ehdr_ptr-e_phnum) * sizeof(Elf64_Phdr)); for (i = 0; i ehdr_ptr-e_phnum; i++) { size += phdr_ptr-p_memsz; phdr_ptr++; @@ -238,8 +238,8 @@ static u64 __init get_vmcore_size_elf32(char *elfptr) Elf32_Phdr *phdr_ptr; ehdr_ptr = (Elf32_Ehdr *)elfptr; -phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); -size = sizeof(Elf32_Ehdr) + ((ehdr_ptr-e_phnum) * sizeof(Elf32_Phdr)); +phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr-e_phoff); +size = ehdr_ptr-e_phoff + ((ehdr_ptr-e_phnum) * sizeof(Elf32_Phdr)); for (i = 0; i ehdr_ptr-e_phnum; i++) { size += phdr_ptr-p_memsz; phdr_ptr++; @@ -259,7 +259,7 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, u64 phdr_sz = 0, note_off; ehdr_ptr = (Elf64_Ehdr *)elfptr; -phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); +phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr-e_phoff); for (i = 0; i ehdr_ptr-e_phnum; i++, phdr_ptr++) { int j; void *notes_section; @@ -305,7 +305,7 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, /* Prepare merged PT_NOTE program header. */ phdr.p_type= PT_NOTE; phdr.p_flags = 0; -note_off = sizeof(Elf64_Ehdr) + +note_off = ehdr_ptr-e_phoff + (ehdr_ptr-e_phnum - nr_ptnote +1) * sizeof(Elf64_Phdr); phdr.p_offset = note_off; phdr.p_vaddr = phdr.p_paddr = 0; @@ -313,14 +313,14 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, phdr.p_align = 0; /* Add merged PT_NOTE program header*/ -tmp = elfptr + sizeof(Elf64_Ehdr); +tmp = elfptr + ehdr_ptr-e_phoff; memcpy(tmp, phdr, sizeof(phdr)); tmp += sizeof(phdr); /* Remove unwanted PT_NOTE program headers. */ i = (nr_ptnote - 1) * sizeof(Elf64_Phdr); *elfsz = *elfsz - i; -memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf64_Ehdr)-sizeof(Elf64_Phdr))); +memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr-e_phoff-sizeof(Elf64_Phdr))); /* Modify e_phnum to reflect merged headers. */ ehdr_ptr-e_phnum = ehdr_ptr-e_phnum - nr_ptnote + 1; @@ -340,7 +340,7 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, u64 phdr_sz = 0, note_off; ehdr_ptr = (Elf32_Ehdr *)elfptr; -phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); +phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr-e_phoff); for (i = 0; i ehdr_ptr-e_phnum; i++, phdr_ptr++) { int j; void *notes_section; @@ -386,7 +386,7 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, /* Prepare merged PT_NOTE program header. */ phdr.p_type= PT_NOTE; phdr.p_flags = 0; -note_off = sizeof(Elf32_Ehdr) + +note_off = ehdr_ptr-e_phoff + (ehdr_ptr-e_phnum - nr_ptnote +1) * sizeof(Elf32_Phdr); phdr.p_offset = note_off; phdr.p_vaddr = phdr.p_paddr = 0; @@ -394,14 +394,14 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, phdr.p_align = 0; /* Add merged PT_NOTE program header*/ -tmp = elfptr + sizeof(Elf32_Ehdr); +tmp = elfptr + ehdr_ptr-e_phoff; memcpy(tmp, phdr, sizeof(phdr)); tmp += sizeof(phdr); /* Remove unwanted PT_NOTE program headers. */ i = (nr_ptnote - 1) * sizeof(Elf32_Phdr); *elfsz = *elfsz - i; -memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf32_Ehdr)-sizeof(Elf32_Phdr))); +memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr-e_phoff-sizeof(Elf32_Phdr))); /* Modify e_phnum to reflect merged headers. */ ehdr_ptr-e_phnum = ehdr_ptr-e_phnum - nr_ptnote + 1; @@ -422,10 +422,10 @@ static int __init process_ptload_program_headers_elf64(char *elfptr,
Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly
于 2013年03月02日 16:35, HATAYAMA Daisuke 写道: > Code around /proc/vmcore currently assumes program header table is > next to ELF header. But future change can break the assumption on > kexec-tools and the 1st kernel. To avoid worst case, now refer to > e_phoff member that indicates position of program header table in > file-offset. Reviewed-by: Zhang Yanfei > > Signed-off-by: HATAYAMA Daisuke > --- > > fs/proc/vmcore.c | 40 > 1 files changed, 20 insertions(+), 20 deletions(-) > > diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c > index b870f74..abf4f01 100644 > --- a/fs/proc/vmcore.c > +++ b/fs/proc/vmcore.c > @@ -221,8 +221,8 @@ static u64 __init get_vmcore_size_elf64(char *elfptr) > Elf64_Phdr *phdr_ptr; > > ehdr_ptr = (Elf64_Ehdr *)elfptr; > - phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); > - size = sizeof(Elf64_Ehdr) + ((ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr)); > + phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr->e_phoff); > + size = ehdr_ptr->e_phoff + ((ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr)); > for (i = 0; i < ehdr_ptr->e_phnum; i++) { > size += phdr_ptr->p_memsz; > phdr_ptr++; > @@ -238,8 +238,8 @@ static u64 __init get_vmcore_size_elf32(char *elfptr) > Elf32_Phdr *phdr_ptr; > > ehdr_ptr = (Elf32_Ehdr *)elfptr; > - phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); > - size = sizeof(Elf32_Ehdr) + ((ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr)); > + phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr->e_phoff); > + size = ehdr_ptr->e_phoff + ((ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr)); > for (i = 0; i < ehdr_ptr->e_phnum; i++) { > size += phdr_ptr->p_memsz; > phdr_ptr++; > @@ -259,7 +259,7 @@ static int __init merge_note_headers_elf64(char *elfptr, > size_t *elfsz, > u64 phdr_sz = 0, note_off; > > ehdr_ptr = (Elf64_Ehdr *)elfptr; > - phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); > + phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr->e_phoff); > for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) { > int j; > void *notes_section; > @@ -305,7 +305,7 @@ static int __init merge_note_headers_elf64(char *elfptr, > size_t *elfsz, > /* Prepare merged PT_NOTE program header. */ > phdr.p_type= PT_NOTE; > phdr.p_flags = 0; > - note_off = sizeof(Elf64_Ehdr) + > + note_off = ehdr_ptr->e_phoff + > (ehdr_ptr->e_phnum - nr_ptnote +1) * sizeof(Elf64_Phdr); > phdr.p_offset = note_off; > phdr.p_vaddr = phdr.p_paddr = 0; > @@ -313,14 +313,14 @@ static int __init merge_note_headers_elf64(char > *elfptr, size_t *elfsz, > phdr.p_align = 0; > > /* Add merged PT_NOTE program header*/ > - tmp = elfptr + sizeof(Elf64_Ehdr); > + tmp = elfptr + ehdr_ptr->e_phoff; > memcpy(tmp, , sizeof(phdr)); > tmp += sizeof(phdr); > > /* Remove unwanted PT_NOTE program headers. */ > i = (nr_ptnote - 1) * sizeof(Elf64_Phdr); > *elfsz = *elfsz - i; > - memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf64_Ehdr)-sizeof(Elf64_Phdr))); > + memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr->e_phoff-sizeof(Elf64_Phdr))); > > /* Modify e_phnum to reflect merged headers. */ > ehdr_ptr->e_phnum = ehdr_ptr->e_phnum - nr_ptnote + 1; > @@ -340,7 +340,7 @@ static int __init merge_note_headers_elf32(char *elfptr, > size_t *elfsz, > u64 phdr_sz = 0, note_off; > > ehdr_ptr = (Elf32_Ehdr *)elfptr; > - phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); > + phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr->e_phoff); > for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) { > int j; > void *notes_section; > @@ -386,7 +386,7 @@ static int __init merge_note_headers_elf32(char *elfptr, > size_t *elfsz, > /* Prepare merged PT_NOTE program header. */ > phdr.p_type= PT_NOTE; > phdr.p_flags = 0; > - note_off = sizeof(Elf32_Ehdr) + > + note_off = ehdr_ptr->e_phoff + > (ehdr_ptr->e_phnum - nr_ptnote +1) * sizeof(Elf32_Phdr); > phdr.p_offset = note_off; > phdr.p_vaddr = phdr.p_paddr = 0; > @@ -394,14 +394,14 @@ static int __init merge_note_headers_elf32(char > *elfptr, size_t *elfsz, > phdr.p_align = 0; > > /* Add merged PT_NOTE program header*/ > - tmp = elfptr + sizeof(Elf32_Ehdr); > + tmp = elfptr + ehdr_ptr->e_phoff; > memcpy(tmp, , sizeof(phdr)); > tmp += sizeof(phdr); > > /* Remove unwanted PT_NOTE program headers. */ > i = (nr_ptnote - 1) * sizeof(Elf32_Phdr); > *elfsz = *elfsz - i; > - memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf32_Ehdr)-sizeof(Elf32_Phdr))); > + memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr->e_phoff-sizeof(Elf32_Phdr))); > > /* Modify e_phnum to reflect merged headers. */ > ehdr_ptr->e_phnum =
[PATCH v2 01/20] vmcore: refer to e_phoff member explicitly
Code around /proc/vmcore currently assumes program header table is next to ELF header. But future change can break the assumption on kexec-tools and the 1st kernel. To avoid worst case, now refer to e_phoff member that indicates position of program header table in file-offset. Signed-off-by: HATAYAMA Daisuke --- fs/proc/vmcore.c | 40 1 files changed, 20 insertions(+), 20 deletions(-) diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c index b870f74..abf4f01 100644 --- a/fs/proc/vmcore.c +++ b/fs/proc/vmcore.c @@ -221,8 +221,8 @@ static u64 __init get_vmcore_size_elf64(char *elfptr) Elf64_Phdr *phdr_ptr; ehdr_ptr = (Elf64_Ehdr *)elfptr; - phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); - size = sizeof(Elf64_Ehdr) + ((ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr)); + phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr->e_phoff); + size = ehdr_ptr->e_phoff + ((ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr)); for (i = 0; i < ehdr_ptr->e_phnum; i++) { size += phdr_ptr->p_memsz; phdr_ptr++; @@ -238,8 +238,8 @@ static u64 __init get_vmcore_size_elf32(char *elfptr) Elf32_Phdr *phdr_ptr; ehdr_ptr = (Elf32_Ehdr *)elfptr; - phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); - size = sizeof(Elf32_Ehdr) + ((ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr)); + phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr->e_phoff); + size = ehdr_ptr->e_phoff + ((ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr)); for (i = 0; i < ehdr_ptr->e_phnum; i++) { size += phdr_ptr->p_memsz; phdr_ptr++; @@ -259,7 +259,7 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, u64 phdr_sz = 0, note_off; ehdr_ptr = (Elf64_Ehdr *)elfptr; - phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); + phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr->e_phoff); for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) { int j; void *notes_section; @@ -305,7 +305,7 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, /* Prepare merged PT_NOTE program header. */ phdr.p_type= PT_NOTE; phdr.p_flags = 0; - note_off = sizeof(Elf64_Ehdr) + + note_off = ehdr_ptr->e_phoff + (ehdr_ptr->e_phnum - nr_ptnote +1) * sizeof(Elf64_Phdr); phdr.p_offset = note_off; phdr.p_vaddr = phdr.p_paddr = 0; @@ -313,14 +313,14 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, phdr.p_align = 0; /* Add merged PT_NOTE program header*/ - tmp = elfptr + sizeof(Elf64_Ehdr); + tmp = elfptr + ehdr_ptr->e_phoff; memcpy(tmp, , sizeof(phdr)); tmp += sizeof(phdr); /* Remove unwanted PT_NOTE program headers. */ i = (nr_ptnote - 1) * sizeof(Elf64_Phdr); *elfsz = *elfsz - i; - memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf64_Ehdr)-sizeof(Elf64_Phdr))); + memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr->e_phoff-sizeof(Elf64_Phdr))); /* Modify e_phnum to reflect merged headers. */ ehdr_ptr->e_phnum = ehdr_ptr->e_phnum - nr_ptnote + 1; @@ -340,7 +340,7 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, u64 phdr_sz = 0, note_off; ehdr_ptr = (Elf32_Ehdr *)elfptr; - phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); + phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr->e_phoff); for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) { int j; void *notes_section; @@ -386,7 +386,7 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, /* Prepare merged PT_NOTE program header. */ phdr.p_type= PT_NOTE; phdr.p_flags = 0; - note_off = sizeof(Elf32_Ehdr) + + note_off = ehdr_ptr->e_phoff + (ehdr_ptr->e_phnum - nr_ptnote +1) * sizeof(Elf32_Phdr); phdr.p_offset = note_off; phdr.p_vaddr = phdr.p_paddr = 0; @@ -394,14 +394,14 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, phdr.p_align = 0; /* Add merged PT_NOTE program header*/ - tmp = elfptr + sizeof(Elf32_Ehdr); + tmp = elfptr + ehdr_ptr->e_phoff; memcpy(tmp, , sizeof(phdr)); tmp += sizeof(phdr); /* Remove unwanted PT_NOTE program headers. */ i = (nr_ptnote - 1) * sizeof(Elf32_Phdr); *elfsz = *elfsz - i; - memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf32_Ehdr)-sizeof(Elf32_Phdr))); + memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr->e_phoff-sizeof(Elf32_Phdr))); /* Modify e_phnum to reflect merged headers. */ ehdr_ptr->e_phnum = ehdr_ptr->e_phnum - nr_ptnote + 1; @@ -422,10 +422,10 @@ static int __init process_ptload_program_headers_elf64(char *elfptr, struct vmcore *new;
[PATCH v2 01/20] vmcore: refer to e_phoff member explicitly
Code around /proc/vmcore currently assumes program header table is next to ELF header. But future change can break the assumption on kexec-tools and the 1st kernel. To avoid worst case, now refer to e_phoff member that indicates position of program header table in file-offset. Signed-off-by: HATAYAMA Daisuke d.hatay...@jp.fujitsu.com --- fs/proc/vmcore.c | 40 1 files changed, 20 insertions(+), 20 deletions(-) diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c index b870f74..abf4f01 100644 --- a/fs/proc/vmcore.c +++ b/fs/proc/vmcore.c @@ -221,8 +221,8 @@ static u64 __init get_vmcore_size_elf64(char *elfptr) Elf64_Phdr *phdr_ptr; ehdr_ptr = (Elf64_Ehdr *)elfptr; - phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); - size = sizeof(Elf64_Ehdr) + ((ehdr_ptr-e_phnum) * sizeof(Elf64_Phdr)); + phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr-e_phoff); + size = ehdr_ptr-e_phoff + ((ehdr_ptr-e_phnum) * sizeof(Elf64_Phdr)); for (i = 0; i ehdr_ptr-e_phnum; i++) { size += phdr_ptr-p_memsz; phdr_ptr++; @@ -238,8 +238,8 @@ static u64 __init get_vmcore_size_elf32(char *elfptr) Elf32_Phdr *phdr_ptr; ehdr_ptr = (Elf32_Ehdr *)elfptr; - phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); - size = sizeof(Elf32_Ehdr) + ((ehdr_ptr-e_phnum) * sizeof(Elf32_Phdr)); + phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr-e_phoff); + size = ehdr_ptr-e_phoff + ((ehdr_ptr-e_phnum) * sizeof(Elf32_Phdr)); for (i = 0; i ehdr_ptr-e_phnum; i++) { size += phdr_ptr-p_memsz; phdr_ptr++; @@ -259,7 +259,7 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, u64 phdr_sz = 0, note_off; ehdr_ptr = (Elf64_Ehdr *)elfptr; - phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); + phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr-e_phoff); for (i = 0; i ehdr_ptr-e_phnum; i++, phdr_ptr++) { int j; void *notes_section; @@ -305,7 +305,7 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, /* Prepare merged PT_NOTE program header. */ phdr.p_type= PT_NOTE; phdr.p_flags = 0; - note_off = sizeof(Elf64_Ehdr) + + note_off = ehdr_ptr-e_phoff + (ehdr_ptr-e_phnum - nr_ptnote +1) * sizeof(Elf64_Phdr); phdr.p_offset = note_off; phdr.p_vaddr = phdr.p_paddr = 0; @@ -313,14 +313,14 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, phdr.p_align = 0; /* Add merged PT_NOTE program header*/ - tmp = elfptr + sizeof(Elf64_Ehdr); + tmp = elfptr + ehdr_ptr-e_phoff; memcpy(tmp, phdr, sizeof(phdr)); tmp += sizeof(phdr); /* Remove unwanted PT_NOTE program headers. */ i = (nr_ptnote - 1) * sizeof(Elf64_Phdr); *elfsz = *elfsz - i; - memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf64_Ehdr)-sizeof(Elf64_Phdr))); + memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr-e_phoff-sizeof(Elf64_Phdr))); /* Modify e_phnum to reflect merged headers. */ ehdr_ptr-e_phnum = ehdr_ptr-e_phnum - nr_ptnote + 1; @@ -340,7 +340,7 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, u64 phdr_sz = 0, note_off; ehdr_ptr = (Elf32_Ehdr *)elfptr; - phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); + phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr-e_phoff); for (i = 0; i ehdr_ptr-e_phnum; i++, phdr_ptr++) { int j; void *notes_section; @@ -386,7 +386,7 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, /* Prepare merged PT_NOTE program header. */ phdr.p_type= PT_NOTE; phdr.p_flags = 0; - note_off = sizeof(Elf32_Ehdr) + + note_off = ehdr_ptr-e_phoff + (ehdr_ptr-e_phnum - nr_ptnote +1) * sizeof(Elf32_Phdr); phdr.p_offset = note_off; phdr.p_vaddr = phdr.p_paddr = 0; @@ -394,14 +394,14 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, phdr.p_align = 0; /* Add merged PT_NOTE program header*/ - tmp = elfptr + sizeof(Elf32_Ehdr); + tmp = elfptr + ehdr_ptr-e_phoff; memcpy(tmp, phdr, sizeof(phdr)); tmp += sizeof(phdr); /* Remove unwanted PT_NOTE program headers. */ i = (nr_ptnote - 1) * sizeof(Elf32_Phdr); *elfsz = *elfsz - i; - memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf32_Ehdr)-sizeof(Elf32_Phdr))); + memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr-e_phoff-sizeof(Elf32_Phdr))); /* Modify e_phnum to reflect merged headers. */ ehdr_ptr-e_phnum = ehdr_ptr-e_phnum - nr_ptnote + 1; @@ -422,10 +422,10 @@ static int __init process_ptload_program_headers_elf64(char *elfptr, struct vmcore *new;
Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly
于 2013年03月02日 16:35, HATAYAMA Daisuke 写道: Code around /proc/vmcore currently assumes program header table is next to ELF header. But future change can break the assumption on kexec-tools and the 1st kernel. To avoid worst case, now refer to e_phoff member that indicates position of program header table in file-offset. Reviewed-by: Zhang Yanfei zhangyan...@cn.fujitsu.com Signed-off-by: HATAYAMA Daisuke d.hatay...@jp.fujitsu.com --- fs/proc/vmcore.c | 40 1 files changed, 20 insertions(+), 20 deletions(-) diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c index b870f74..abf4f01 100644 --- a/fs/proc/vmcore.c +++ b/fs/proc/vmcore.c @@ -221,8 +221,8 @@ static u64 __init get_vmcore_size_elf64(char *elfptr) Elf64_Phdr *phdr_ptr; ehdr_ptr = (Elf64_Ehdr *)elfptr; - phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); - size = sizeof(Elf64_Ehdr) + ((ehdr_ptr-e_phnum) * sizeof(Elf64_Phdr)); + phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr-e_phoff); + size = ehdr_ptr-e_phoff + ((ehdr_ptr-e_phnum) * sizeof(Elf64_Phdr)); for (i = 0; i ehdr_ptr-e_phnum; i++) { size += phdr_ptr-p_memsz; phdr_ptr++; @@ -238,8 +238,8 @@ static u64 __init get_vmcore_size_elf32(char *elfptr) Elf32_Phdr *phdr_ptr; ehdr_ptr = (Elf32_Ehdr *)elfptr; - phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); - size = sizeof(Elf32_Ehdr) + ((ehdr_ptr-e_phnum) * sizeof(Elf32_Phdr)); + phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr-e_phoff); + size = ehdr_ptr-e_phoff + ((ehdr_ptr-e_phnum) * sizeof(Elf32_Phdr)); for (i = 0; i ehdr_ptr-e_phnum; i++) { size += phdr_ptr-p_memsz; phdr_ptr++; @@ -259,7 +259,7 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, u64 phdr_sz = 0, note_off; ehdr_ptr = (Elf64_Ehdr *)elfptr; - phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); + phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr-e_phoff); for (i = 0; i ehdr_ptr-e_phnum; i++, phdr_ptr++) { int j; void *notes_section; @@ -305,7 +305,7 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, /* Prepare merged PT_NOTE program header. */ phdr.p_type= PT_NOTE; phdr.p_flags = 0; - note_off = sizeof(Elf64_Ehdr) + + note_off = ehdr_ptr-e_phoff + (ehdr_ptr-e_phnum - nr_ptnote +1) * sizeof(Elf64_Phdr); phdr.p_offset = note_off; phdr.p_vaddr = phdr.p_paddr = 0; @@ -313,14 +313,14 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, phdr.p_align = 0; /* Add merged PT_NOTE program header*/ - tmp = elfptr + sizeof(Elf64_Ehdr); + tmp = elfptr + ehdr_ptr-e_phoff; memcpy(tmp, phdr, sizeof(phdr)); tmp += sizeof(phdr); /* Remove unwanted PT_NOTE program headers. */ i = (nr_ptnote - 1) * sizeof(Elf64_Phdr); *elfsz = *elfsz - i; - memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf64_Ehdr)-sizeof(Elf64_Phdr))); + memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr-e_phoff-sizeof(Elf64_Phdr))); /* Modify e_phnum to reflect merged headers. */ ehdr_ptr-e_phnum = ehdr_ptr-e_phnum - nr_ptnote + 1; @@ -340,7 +340,7 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, u64 phdr_sz = 0, note_off; ehdr_ptr = (Elf32_Ehdr *)elfptr; - phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); + phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr-e_phoff); for (i = 0; i ehdr_ptr-e_phnum; i++, phdr_ptr++) { int j; void *notes_section; @@ -386,7 +386,7 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, /* Prepare merged PT_NOTE program header. */ phdr.p_type= PT_NOTE; phdr.p_flags = 0; - note_off = sizeof(Elf32_Ehdr) + + note_off = ehdr_ptr-e_phoff + (ehdr_ptr-e_phnum - nr_ptnote +1) * sizeof(Elf32_Phdr); phdr.p_offset = note_off; phdr.p_vaddr = phdr.p_paddr = 0; @@ -394,14 +394,14 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz, phdr.p_align = 0; /* Add merged PT_NOTE program header*/ - tmp = elfptr + sizeof(Elf32_Ehdr); + tmp = elfptr + ehdr_ptr-e_phoff; memcpy(tmp, phdr, sizeof(phdr)); tmp += sizeof(phdr); /* Remove unwanted PT_NOTE program headers. */ i = (nr_ptnote - 1) * sizeof(Elf32_Phdr); *elfsz = *elfsz - i; - memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf32_Ehdr)-sizeof(Elf32_Phdr))); + memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr-e_phoff-sizeof(Elf32_Phdr))); /* Modify e_phnum to reflect merged headers. */ ehdr_ptr-e_phnum = ehdr_ptr-e_phnum - nr_ptnote + 1; @@ -422,10 +422,10 @@ static int __init