From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752239Ab3CEHhm (ORCPT ); Tue, 5 Mar 2013 02:37:42 -0500 Received: from cn.fujitsu.com ([222.73.24.84]:63745 "EHLO song.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1750781Ab3CEHhl convert rfc822-to-8bit (ORCPT ); Tue, 5 Mar 2013 02:37:41 -0500 X-IronPort-AV: E=Sophos;i="4.84,785,1355068800"; d="scan'208";a="6815568" Message-ID: <5135A054.7010401@cn.fujitsu.com> Date: Tue, 05 Mar 2013 15:35:48 +0800 From: Zhang Yanfei User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.8) Gecko/20121012 Thunderbird/10.0.8 MIME-Version: 1.0 To: HATAYAMA Daisuke CC: vgoyal@redhat.com, ebiederm@xmission.com, cpw@sgi.com, kumagai-atsushi@mxc.nes.nec.co.jp, lisa.mitchell@hp.com, heiko.carstens@de.ibm.com, akpm@linux-foundation.org, kexec@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly References: <20130302083447.31252.93914.stgit@localhost6.localdomain6> <20130302083554.31252.30615.stgit@localhost6.localdomain6> In-Reply-To: <20130302083554.31252.30615.stgit@localhost6.localdomain6> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/03/05 15:36:37, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/03/05 15:36:38 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 于 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, &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; > > ehdr_ptr = (Elf64_Ehdr *)elfptr; > - phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); /* PT_NOTE hdr */ > + phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr->e_phoff); /* PT_NOTE hdr */ > > /* First program header is PT_NOTE header. */ > - vmcore_off = sizeof(Elf64_Ehdr) + > + vmcore_off = ehdr_ptr->e_phoff + > (ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr) + > phdr_ptr->p_memsz; /* Note sections */ > > @@ -459,10 +459,10 @@ static int __init process_ptload_program_headers_elf32(char *elfptr, > struct vmcore *new; > > ehdr_ptr = (Elf32_Ehdr *)elfptr; > - phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); /* PT_NOTE hdr */ > + phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr->e_phoff); /* PT_NOTE hdr */ > > /* First program header is PT_NOTE header. */ > - vmcore_off = sizeof(Elf32_Ehdr) + > + vmcore_off = ehdr_ptr->e_phoff + > (ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr) + > phdr_ptr->p_memsz; /* Note sections */ > > @@ -496,7 +496,7 @@ static void __init set_vmcore_list_offsets_elf64(char *elfptr, > ehdr_ptr = (Elf64_Ehdr *)elfptr; > > /* Skip Elf header and program headers. */ > - vmcore_off = sizeof(Elf64_Ehdr) + > + vmcore_off = ehdr_ptr->e_phoff + > (ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr); > > list_for_each_entry(m, vc_list, list) { > @@ -516,7 +516,7 @@ static void __init set_vmcore_list_offsets_elf32(char *elfptr, > ehdr_ptr = (Elf32_Ehdr *)elfptr; > > /* Skip Elf header and program headers. */ > - vmcore_off = sizeof(Elf32_Ehdr) + > + vmcore_off = ehdr_ptr->e_phoff + > (ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr); > > list_for_each_entry(m, vc_list, list) { > @@ -553,7 +553,7 @@ static int __init parse_crash_elf64_headers(void) > } > > /* Read in all elf headers. */ > - elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr); > + elfcorebuf_sz = ehdr.e_phoff + ehdr.e_phnum * sizeof(Elf64_Phdr); > elfcorebuf = kmalloc(elfcorebuf_sz, GFP_KERNEL); > if (!elfcorebuf) > return -ENOMEM; > @@ -608,7 +608,7 @@ static int __init parse_crash_elf32_headers(void) > } > > /* Read in all elf headers. */ > - elfcorebuf_sz = sizeof(Elf32_Ehdr) + ehdr.e_phnum * sizeof(Elf32_Phdr); > + elfcorebuf_sz = ehdr.e_phoff + ehdr.e_phnum * sizeof(Elf32_Phdr); > elfcorebuf = kmalloc(elfcorebuf_sz, GFP_KERNEL); > if (!elfcorebuf) > return -ENOMEM; > > > _______________________________________________ > kexec mailing list > kexec@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/kexec > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from [222.73.24.84] (helo=song.cn.fujitsu.com) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1UCmRY-0001Un-0X for kexec@lists.infradead.org; Tue, 05 Mar 2013 07:37:49 +0000 Message-ID: <5135A054.7010401@cn.fujitsu.com> Date: Tue, 05 Mar 2013 15:35:48 +0800 From: Zhang Yanfei MIME-Version: 1.0 Subject: Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly References: <20130302083447.31252.93914.stgit@localhost6.localdomain6> <20130302083554.31252.30615.stgit@localhost6.localdomain6> In-Reply-To: <20130302083554.31252.30615.stgit@localhost6.localdomain6> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "kexec" Errors-To: kexec-bounces+dwmw2=infradead.org@lists.infradead.org To: HATAYAMA Daisuke Cc: kexec@lists.infradead.org, heiko.carstens@de.ibm.com, linux-kernel@vger.kernel.org, lisa.mitchell@hp.com, kumagai-atsushi@mxc.nes.nec.co.jp, ebiederm@xmission.com, akpm@linux-foundation.org, cpw@sgi.com, vgoyal@redhat.com 5LqOIDIwMTPlubQwM+aciDAy5pelIDE2OjM1LCBIQVRBWUFNQSBEYWlzdWtlIOWGmemBkzoKPiBD b2RlIGFyb3VuZCAvcHJvYy92bWNvcmUgY3VycmVudGx5IGFzc3VtZXMgcHJvZ3JhbSBoZWFkZXIg dGFibGUgaXMKPiBuZXh0IHRvIEVMRiBoZWFkZXIuIEJ1dCBmdXR1cmUgY2hhbmdlIGNhbiBicmVh ayB0aGUgYXNzdW1wdGlvbiBvbgo+IGtleGVjLXRvb2xzIGFuZCB0aGUgMXN0IGtlcm5lbC4gVG8g YXZvaWQgd29yc3QgY2FzZSwgbm93IHJlZmVyIHRvCj4gZV9waG9mZiBtZW1iZXIgdGhhdCBpbmRp Y2F0ZXMgcG9zaXRpb24gb2YgcHJvZ3JhbSBoZWFkZXIgdGFibGUgaW4KPiBmaWxlLW9mZnNldC4K ClJldmlld2VkLWJ5OiBaaGFuZyBZYW5mZWkgPHpoYW5neWFuZmVpQGNuLmZ1aml0c3UuY29tPgoK PiAKPiBTaWduZWQtb2ZmLWJ5OiBIQVRBWUFNQSBEYWlzdWtlIDxkLmhhdGF5YW1hQGpwLmZ1aml0 c3UuY29tPgo+IC0tLQo+IAo+ICBmcy9wcm9jL3ZtY29yZS5jIHwgICA0MCArKysrKysrKysrKysr KysrKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gIDEgZmlsZXMgY2hhbmdlZCwgMjAgaW5zZXJ0 aW9ucygrKSwgMjAgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2ZzL3Byb2Mvdm1jb3Jl LmMgYi9mcy9wcm9jL3ZtY29yZS5jCj4gaW5kZXggYjg3MGY3NC4uYWJmNGYwMSAxMDA2NDQKPiAt LS0gYS9mcy9wcm9jL3ZtY29yZS5jCj4gKysrIGIvZnMvcHJvYy92bWNvcmUuYwo+IEBAIC0yMjEs OCArMjIxLDggQEAgc3RhdGljIHU2NCBfX2luaXQgZ2V0X3ZtY29yZV9zaXplX2VsZjY0KGNoYXIg KmVsZnB0cikKPiAgCUVsZjY0X1BoZHIgKnBoZHJfcHRyOwo+ICAKPiAgCWVoZHJfcHRyID0gKEVs ZjY0X0VoZHIgKillbGZwdHI7Cj4gLQlwaGRyX3B0ciA9IChFbGY2NF9QaGRyKikoZWxmcHRyICsg c2l6ZW9mKEVsZjY0X0VoZHIpKTsKPiAtCXNpemUgPSBzaXplb2YoRWxmNjRfRWhkcikgKyAoKGVo ZHJfcHRyLT5lX3BobnVtKSAqIHNpemVvZihFbGY2NF9QaGRyKSk7Cj4gKwlwaGRyX3B0ciA9IChF bGY2NF9QaGRyKikoZWxmcHRyICsgZWhkcl9wdHItPmVfcGhvZmYpOwo+ICsJc2l6ZSA9IGVoZHJf cHRyLT5lX3Bob2ZmICsgKChlaGRyX3B0ci0+ZV9waG51bSkgKiBzaXplb2YoRWxmNjRfUGhkcikp Owo+ICAJZm9yIChpID0gMDsgaSA8IGVoZHJfcHRyLT5lX3BobnVtOyBpKyspIHsKPiAgCQlzaXpl ICs9IHBoZHJfcHRyLT5wX21lbXN6Owo+ICAJCXBoZHJfcHRyKys7Cj4gQEAgLTIzOCw4ICsyMzgs OCBAQCBzdGF0aWMgdTY0IF9faW5pdCBnZXRfdm1jb3JlX3NpemVfZWxmMzIoY2hhciAqZWxmcHRy KQo+ICAJRWxmMzJfUGhkciAqcGhkcl9wdHI7Cj4gIAo+ICAJZWhkcl9wdHIgPSAoRWxmMzJfRWhk ciAqKWVsZnB0cjsKPiAtCXBoZHJfcHRyID0gKEVsZjMyX1BoZHIqKShlbGZwdHIgKyBzaXplb2Yo RWxmMzJfRWhkcikpOwo+IC0Jc2l6ZSA9IHNpemVvZihFbGYzMl9FaGRyKSArICgoZWhkcl9wdHIt PmVfcGhudW0pICogc2l6ZW9mKEVsZjMyX1BoZHIpKTsKPiArCXBoZHJfcHRyID0gKEVsZjMyX1Bo ZHIqKShlbGZwdHIgKyBlaGRyX3B0ci0+ZV9waG9mZik7Cj4gKwlzaXplID0gZWhkcl9wdHItPmVf cGhvZmYgKyAoKGVoZHJfcHRyLT5lX3BobnVtKSAqIHNpemVvZihFbGYzMl9QaGRyKSk7Cj4gIAlm b3IgKGkgPSAwOyBpIDwgZWhkcl9wdHItPmVfcGhudW07IGkrKykgewo+ICAJCXNpemUgKz0gcGhk cl9wdHItPnBfbWVtc3o7Cj4gIAkJcGhkcl9wdHIrKzsKPiBAQCAtMjU5LDcgKzI1OSw3IEBAIHN0 YXRpYyBpbnQgX19pbml0IG1lcmdlX25vdGVfaGVhZGVyc19lbGY2NChjaGFyICplbGZwdHIsIHNp emVfdCAqZWxmc3osCj4gIAl1NjQgcGhkcl9zeiA9IDAsIG5vdGVfb2ZmOwo+ICAKPiAgCWVoZHJf cHRyID0gKEVsZjY0X0VoZHIgKillbGZwdHI7Cj4gLQlwaGRyX3B0ciA9IChFbGY2NF9QaGRyKiko ZWxmcHRyICsgc2l6ZW9mKEVsZjY0X0VoZHIpKTsKPiArCXBoZHJfcHRyID0gKEVsZjY0X1BoZHIq KShlbGZwdHIgKyBlaGRyX3B0ci0+ZV9waG9mZik7Cj4gIAlmb3IgKGkgPSAwOyBpIDwgZWhkcl9w dHItPmVfcGhudW07IGkrKywgcGhkcl9wdHIrKykgewo+ICAJCWludCBqOwo+ICAJCXZvaWQgKm5v dGVzX3NlY3Rpb247Cj4gQEAgLTMwNSw3ICszMDUsNyBAQCBzdGF0aWMgaW50IF9faW5pdCBtZXJn ZV9ub3RlX2hlYWRlcnNfZWxmNjQoY2hhciAqZWxmcHRyLCBzaXplX3QgKmVsZnN6LAo+ICAJLyog UHJlcGFyZSBtZXJnZWQgUFRfTk9URSBwcm9ncmFtIGhlYWRlci4gKi8KPiAgCXBoZHIucF90eXBl ICAgID0gUFRfTk9URTsKPiAgCXBoZHIucF9mbGFncyAgID0gMDsKPiAtCW5vdGVfb2ZmID0gc2l6 ZW9mKEVsZjY0X0VoZHIpICsKPiArCW5vdGVfb2ZmID0gZWhkcl9wdHItPmVfcGhvZmYgKwo+ICAJ CQkoZWhkcl9wdHItPmVfcGhudW0gLSBucl9wdG5vdGUgKzEpICogc2l6ZW9mKEVsZjY0X1BoZHIp Owo+ICAJcGhkci5wX29mZnNldCAgPSBub3RlX29mZjsKPiAgCXBoZHIucF92YWRkciAgID0gcGhk ci5wX3BhZGRyID0gMDsKPiBAQCAtMzEzLDE0ICszMTMsMTQgQEAgc3RhdGljIGludCBfX2luaXQg bWVyZ2Vfbm90ZV9oZWFkZXJzX2VsZjY0KGNoYXIgKmVsZnB0ciwgc2l6ZV90ICplbGZzeiwKPiAg CXBoZHIucF9hbGlnbiAgID0gMDsKPiAgCj4gIAkvKiBBZGQgbWVyZ2VkIFBUX05PVEUgcHJvZ3Jh bSBoZWFkZXIqLwo+IC0JdG1wID0gZWxmcHRyICsgc2l6ZW9mKEVsZjY0X0VoZHIpOwo+ICsJdG1w ID0gZWxmcHRyICsgZWhkcl9wdHItPmVfcGhvZmY7Cj4gIAltZW1jcHkodG1wLCAmcGhkciwgc2l6 ZW9mKHBoZHIpKTsKPiAgCXRtcCArPSBzaXplb2YocGhkcik7Cj4gIAo+ICAJLyogUmVtb3ZlIHVu d2FudGVkIFBUX05PVEUgcHJvZ3JhbSBoZWFkZXJzLiAqLwo+ICAJaSA9IChucl9wdG5vdGUgLSAx KSAqIHNpemVvZihFbGY2NF9QaGRyKTsKPiAgCSplbGZzeiA9ICplbGZzeiAtIGk7Cj4gLQltZW1t b3ZlKHRtcCwgdG1wK2ksICgoKmVsZnN6KS1zaXplb2YoRWxmNjRfRWhkciktc2l6ZW9mKEVsZjY0 X1BoZHIpKSk7Cj4gKwltZW1tb3ZlKHRtcCwgdG1wK2ksICgoKmVsZnN6KS1laGRyX3B0ci0+ZV9w aG9mZi1zaXplb2YoRWxmNjRfUGhkcikpKTsKPiAgCj4gIAkvKiBNb2RpZnkgZV9waG51bSB0byBy ZWZsZWN0IG1lcmdlZCBoZWFkZXJzLiAqLwo+ICAJZWhkcl9wdHItPmVfcGhudW0gPSBlaGRyX3B0 ci0+ZV9waG51bSAtIG5yX3B0bm90ZSArIDE7Cj4gQEAgLTM0MCw3ICszNDAsNyBAQCBzdGF0aWMg aW50IF9faW5pdCBtZXJnZV9ub3RlX2hlYWRlcnNfZWxmMzIoY2hhciAqZWxmcHRyLCBzaXplX3Qg KmVsZnN6LAo+ICAJdTY0IHBoZHJfc3ogPSAwLCBub3RlX29mZjsKPiAgCj4gIAllaGRyX3B0ciA9 IChFbGYzMl9FaGRyICopZWxmcHRyOwo+IC0JcGhkcl9wdHIgPSAoRWxmMzJfUGhkciopKGVsZnB0 ciArIHNpemVvZihFbGYzMl9FaGRyKSk7Cj4gKwlwaGRyX3B0ciA9IChFbGYzMl9QaGRyKikoZWxm cHRyICsgZWhkcl9wdHItPmVfcGhvZmYpOwo+ICAJZm9yIChpID0gMDsgaSA8IGVoZHJfcHRyLT5l X3BobnVtOyBpKyssIHBoZHJfcHRyKyspIHsKPiAgCQlpbnQgajsKPiAgCQl2b2lkICpub3Rlc19z ZWN0aW9uOwo+IEBAIC0zODYsNyArMzg2LDcgQEAgc3RhdGljIGludCBfX2luaXQgbWVyZ2Vfbm90 ZV9oZWFkZXJzX2VsZjMyKGNoYXIgKmVsZnB0ciwgc2l6ZV90ICplbGZzeiwKPiAgCS8qIFByZXBh cmUgbWVyZ2VkIFBUX05PVEUgcHJvZ3JhbSBoZWFkZXIuICovCj4gIAlwaGRyLnBfdHlwZSAgICA9 IFBUX05PVEU7Cj4gIAlwaGRyLnBfZmxhZ3MgICA9IDA7Cj4gLQlub3RlX29mZiA9IHNpemVvZihF bGYzMl9FaGRyKSArCj4gKwlub3RlX29mZiA9IGVoZHJfcHRyLT5lX3Bob2ZmICsKPiAgCQkJKGVo ZHJfcHRyLT5lX3BobnVtIC0gbnJfcHRub3RlICsxKSAqIHNpemVvZihFbGYzMl9QaGRyKTsKPiAg CXBoZHIucF9vZmZzZXQgID0gbm90ZV9vZmY7Cj4gIAlwaGRyLnBfdmFkZHIgICA9IHBoZHIucF9w YWRkciA9IDA7Cj4gQEAgLTM5NCwxNCArMzk0LDE0IEBAIHN0YXRpYyBpbnQgX19pbml0IG1lcmdl X25vdGVfaGVhZGVyc19lbGYzMihjaGFyICplbGZwdHIsIHNpemVfdCAqZWxmc3osCj4gIAlwaGRy LnBfYWxpZ24gICA9IDA7Cj4gIAo+ICAJLyogQWRkIG1lcmdlZCBQVF9OT1RFIHByb2dyYW0gaGVh ZGVyKi8KPiAtCXRtcCA9IGVsZnB0ciArIHNpemVvZihFbGYzMl9FaGRyKTsKPiArCXRtcCA9IGVs ZnB0ciArIGVoZHJfcHRyLT5lX3Bob2ZmOwo+ICAJbWVtY3B5KHRtcCwgJnBoZHIsIHNpemVvZihw aGRyKSk7Cj4gIAl0bXAgKz0gc2l6ZW9mKHBoZHIpOwo+ICAKPiAgCS8qIFJlbW92ZSB1bndhbnRl ZCBQVF9OT1RFIHByb2dyYW0gaGVhZGVycy4gKi8KPiAgCWkgPSAobnJfcHRub3RlIC0gMSkgKiBz aXplb2YoRWxmMzJfUGhkcik7Cj4gIAkqZWxmc3ogPSAqZWxmc3ogLSBpOwo+IC0JbWVtbW92ZSh0 bXAsIHRtcCtpLCAoKCplbGZzeiktc2l6ZW9mKEVsZjMyX0VoZHIpLXNpemVvZihFbGYzMl9QaGRy KSkpOwo+ICsJbWVtbW92ZSh0bXAsIHRtcCtpLCAoKCplbGZzeiktZWhkcl9wdHItPmVfcGhvZmYt c2l6ZW9mKEVsZjMyX1BoZHIpKSk7Cj4gIAo+ICAJLyogTW9kaWZ5IGVfcGhudW0gdG8gcmVmbGVj dCBtZXJnZWQgaGVhZGVycy4gKi8KPiAgCWVoZHJfcHRyLT5lX3BobnVtID0gZWhkcl9wdHItPmVf cGhudW0gLSBucl9wdG5vdGUgKyAxOwo+IEBAIC00MjIsMTAgKzQyMiwxMCBAQCBzdGF0aWMgaW50 IF9faW5pdCBwcm9jZXNzX3B0bG9hZF9wcm9ncmFtX2hlYWRlcnNfZWxmNjQoY2hhciAqZWxmcHRy LAo+ICAJc3RydWN0IHZtY29yZSAqbmV3Owo+ICAKPiAgCWVoZHJfcHRyID0gKEVsZjY0X0VoZHIg KillbGZwdHI7Cj4gLQlwaGRyX3B0ciA9IChFbGY2NF9QaGRyKikoZWxmcHRyICsgc2l6ZW9mKEVs ZjY0X0VoZHIpKTsgLyogUFRfTk9URSBoZHIgKi8KPiArCXBoZHJfcHRyID0gKEVsZjY0X1BoZHIq KShlbGZwdHIgKyBlaGRyX3B0ci0+ZV9waG9mZik7IC8qIFBUX05PVEUgaGRyICovCj4gIAo+ICAJ LyogRmlyc3QgcHJvZ3JhbSBoZWFkZXIgaXMgUFRfTk9URSBoZWFkZXIuICovCj4gLQl2bWNvcmVf b2ZmID0gc2l6ZW9mKEVsZjY0X0VoZHIpICsKPiArCXZtY29yZV9vZmYgPSBlaGRyX3B0ci0+ZV9w aG9mZiArCj4gIAkJCShlaGRyX3B0ci0+ZV9waG51bSkgKiBzaXplb2YoRWxmNjRfUGhkcikgKwo+ ICAJCQlwaGRyX3B0ci0+cF9tZW1zejsgLyogTm90ZSBzZWN0aW9ucyAqLwo+ICAKPiBAQCAtNDU5 LDEwICs0NTksMTAgQEAgc3RhdGljIGludCBfX2luaXQgcHJvY2Vzc19wdGxvYWRfcHJvZ3JhbV9o ZWFkZXJzX2VsZjMyKGNoYXIgKmVsZnB0ciwKPiAgCXN0cnVjdCB2bWNvcmUgKm5ldzsKPiAgCj4g IAllaGRyX3B0ciA9IChFbGYzMl9FaGRyICopZWxmcHRyOwo+IC0JcGhkcl9wdHIgPSAoRWxmMzJf UGhkciopKGVsZnB0ciArIHNpemVvZihFbGYzMl9FaGRyKSk7IC8qIFBUX05PVEUgaGRyICovCj4g KwlwaGRyX3B0ciA9IChFbGYzMl9QaGRyKikoZWxmcHRyICsgZWhkcl9wdHItPmVfcGhvZmYpOyAv KiBQVF9OT1RFIGhkciAqLwo+ICAKPiAgCS8qIEZpcnN0IHByb2dyYW0gaGVhZGVyIGlzIFBUX05P VEUgaGVhZGVyLiAqLwo+IC0Jdm1jb3JlX29mZiA9IHNpemVvZihFbGYzMl9FaGRyKSArCj4gKwl2 bWNvcmVfb2ZmID0gZWhkcl9wdHItPmVfcGhvZmYgKwo+ICAJCQkoZWhkcl9wdHItPmVfcGhudW0p ICogc2l6ZW9mKEVsZjMyX1BoZHIpICsKPiAgCQkJcGhkcl9wdHItPnBfbWVtc3o7IC8qIE5vdGUg c2VjdGlvbnMgKi8KPiAgCj4gQEAgLTQ5Niw3ICs0OTYsNyBAQCBzdGF0aWMgdm9pZCBfX2luaXQg c2V0X3ZtY29yZV9saXN0X29mZnNldHNfZWxmNjQoY2hhciAqZWxmcHRyLAo+ICAJZWhkcl9wdHIg PSAoRWxmNjRfRWhkciAqKWVsZnB0cjsKPiAgCj4gIAkvKiBTa2lwIEVsZiBoZWFkZXIgYW5kIHBy b2dyYW0gaGVhZGVycy4gKi8KPiAtCXZtY29yZV9vZmYgPSBzaXplb2YoRWxmNjRfRWhkcikgKwo+ ICsJdm1jb3JlX29mZiA9IGVoZHJfcHRyLT5lX3Bob2ZmICsKPiAgCQkJKGVoZHJfcHRyLT5lX3Bo bnVtKSAqIHNpemVvZihFbGY2NF9QaGRyKTsKPiAgCj4gIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0s IHZjX2xpc3QsIGxpc3QpIHsKPiBAQCAtNTE2LDcgKzUxNiw3IEBAIHN0YXRpYyB2b2lkIF9faW5p dCBzZXRfdm1jb3JlX2xpc3Rfb2Zmc2V0c19lbGYzMihjaGFyICplbGZwdHIsCj4gIAllaGRyX3B0 ciA9IChFbGYzMl9FaGRyICopZWxmcHRyOwo+ICAKPiAgCS8qIFNraXAgRWxmIGhlYWRlciBhbmQg cHJvZ3JhbSBoZWFkZXJzLiAqLwo+IC0Jdm1jb3JlX29mZiA9IHNpemVvZihFbGYzMl9FaGRyKSAr Cj4gKwl2bWNvcmVfb2ZmID0gZWhkcl9wdHItPmVfcGhvZmYgKwo+ICAJCQkoZWhkcl9wdHItPmVf cGhudW0pICogc2l6ZW9mKEVsZjMyX1BoZHIpOwo+ICAKPiAgCWxpc3RfZm9yX2VhY2hfZW50cnko bSwgdmNfbGlzdCwgbGlzdCkgewo+IEBAIC01NTMsNyArNTUzLDcgQEAgc3RhdGljIGludCBfX2lu aXQgcGFyc2VfY3Jhc2hfZWxmNjRfaGVhZGVycyh2b2lkKQo+ICAJfQo+ICAKPiAgCS8qIFJlYWQg aW4gYWxsIGVsZiBoZWFkZXJzLiAqLwo+IC0JZWxmY29yZWJ1Zl9zeiA9IHNpemVvZihFbGY2NF9F aGRyKSArIGVoZHIuZV9waG51bSAqIHNpemVvZihFbGY2NF9QaGRyKTsKPiArCWVsZmNvcmVidWZf c3ogPSBlaGRyLmVfcGhvZmYgKyBlaGRyLmVfcGhudW0gKiBzaXplb2YoRWxmNjRfUGhkcik7Cj4g IAllbGZjb3JlYnVmID0ga21hbGxvYyhlbGZjb3JlYnVmX3N6LCBHRlBfS0VSTkVMKTsKPiAgCWlm ICghZWxmY29yZWJ1ZikKPiAgCQlyZXR1cm4gLUVOT01FTTsKPiBAQCAtNjA4LDcgKzYwOCw3IEBA IHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX2NyYXNoX2VsZjMyX2hlYWRlcnModm9pZCkKPiAgCX0K PiAgCj4gIAkvKiBSZWFkIGluIGFsbCBlbGYgaGVhZGVycy4gKi8KPiAtCWVsZmNvcmVidWZfc3og PSBzaXplb2YoRWxmMzJfRWhkcikgKyBlaGRyLmVfcGhudW0gKiBzaXplb2YoRWxmMzJfUGhkcik7 Cj4gKwllbGZjb3JlYnVmX3N6ID0gZWhkci5lX3Bob2ZmICsgZWhkci5lX3BobnVtICogc2l6ZW9m KEVsZjMyX1BoZHIpOwo+ICAJZWxmY29yZWJ1ZiA9IGttYWxsb2MoZWxmY29yZWJ1Zl9zeiwgR0ZQ X0tFUk5FTCk7Cj4gIAlpZiAoIWVsZmNvcmVidWYpCj4gIAkJcmV0dXJuIC1FTk9NRU07Cj4gCj4g Cj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiBrZXhl YyBtYWlsaW5nIGxpc3QKPiBrZXhlY0BsaXN0cy5pbmZyYWRlYWQub3JnCj4gaHR0cDovL2xpc3Rz LmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9rZXhlYwo+IAoKCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmtleGVjIG1haWxpbmcgbGlzdAprZXhl Y0BsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4v bGlzdGluZm8va2V4ZWMK