From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13516 invoked by alias); 4 Nov 2013 22:21:45 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 13507 invoked by uid 89); 4 Nov 2013 22:21:44 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=AWL,BAYES_50,RCVD_IN_DNSWL_LOW,RDNS_NONE,SPF_PASS,URIBL_BLOCKED autolearn=no version=3.3.2 X-HELO: mail-vc0-f170.google.com Received: from Unknown (HELO mail-vc0-f170.google.com) (209.85.220.170) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Mon, 04 Nov 2013 22:21:42 +0000 Received: by mail-vc0-f170.google.com with SMTP id hv10so5152895vcb.29 for ; Mon, 04 Nov 2013 14:21:34 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=kH231DKpwei+oLUn1umbI4h8mvfE8FvSIFmLOdJW0PI=; b=cnQvJf4hzJ4UzZzRDTdn7UZrWPy7e0/y6I+J/d67vEOFU2Ce4gGHOAxK6hS3fpzl7W ucSYsWCF3vQuB3fPVLScxOwTuFC2s+DGNb3b2amYBu0kd/v6sxiDTRcpJpeq+P4uwn9b 2dNVjMfEPHQmjV7MoEKdQd1zfBGjq4KF9CWg5mXCb19h5BBuMZnTlIxrrl+OGDSxKR1R S2eq6MniWgmcL/giN2i0DO4dXmQngksKoX2pRVCnGiLaikhxp6OzR2IZVv3VmW3UmO32 iv/7764tzZql1SDM66DA++dbdI8yDt1qKmOQIUzASpyqLgSHXG4EKmRNl7ALCEuBNuOH 7N8Q== X-Gm-Message-State: ALoCoQlXivh6B1Djde6t8k/IzRuqqf9ESWQ5wUcpcXhl6ji1v4MnDYLSSM5n7chqIGR0JvnUdoQxNrAe4zj2FMxaCKSzX9SwMKPgKfz7x2/abXxGjhXlxpGsdt8YDQYGX0u24lBT+nNMkNoQ5Gqbdfi4ct26wmGFHXHDTnSi7rDOOD6+S34s/ni7vtu2tw2SwhxBoKpuxsYEDF/bZXonjPsdBszJarx2DA== MIME-Version: 1.0 X-Received: by 10.220.86.69 with SMTP id r5mr13034043vcl.9.1383603694140; Mon, 04 Nov 2013 14:21:34 -0800 (PST) Received: by 10.52.237.232 with HTTP; Mon, 4 Nov 2013 14:21:33 -0800 (PST) In-Reply-To: <20131031154957.GA11260@host2.jankratochvil.net> References: <20131031154957.GA11260@host2.jankratochvil.net> Date: Mon, 04 Nov 2013 22:38:00 -0000 Message-ID: Subject: Re: [PATCH] Fix Gold/strip discrepancies for PR 11786 From: Doug Evans To: Jan Kratochvil Cc: gdb-patches , Cary Coutant Content-Type: multipart/mixed; boundary=001a11c1ff44b3350204ea615642 X-IsSubscribed: yes X-SW-Source: 2013-11/txt/msg00067.txt.bz2 --001a11c1ff44b3350204ea615642 Content-Type: text/plain; charset=ISO-8859-1 Content-length: 10700 On Thu, Oct 31, 2013 at 8:49 AM, Jan Kratochvil wrote: > Hi Doug, > > On Sat, 26 Oct 2013 01:26:22 +0200, Doug Evans wrote: >> This patch addresses the discrepancy in the flags and align fields >> of PT_GNU_RELRO between Gold and strip. > > originally I thought the discrepancy happened due to some speciality of Gold; > but you state Gold probably just because you use Gold by default. > On CentOS-5 x86_64 the problem happens to me even with GNU ld. > > And the problem is binutils strip. It is known it modifies the executable > more than it has to, AFAIK (IIRC according to Jakub) due to the generalization > by bfd. > > Red Hat OSes have been always using eu-strip instead (=elfutils strip), which > is native for ELF and modifies the file only minimally. > > During my test on CentOS-5 x86_64 really binutils strip changed it: > > Program Headers: > Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align > - GNU_RELRO 0x000de8 0x0000000000200de8 0x0000000000200de8 0x000218 0x000218 R 0x1 > + GNU_RELRO 0x000de8 0x0000000000200de8 0x0000000000200de8 0x000200 0x000200 R 0x1 > > while elfutils strip left Program Headers intact. So reviewed the patch below > and I am fine with it that way but I do not think it is the right solution to > your problem. What would be the right solution? [keeping in mind that I need this to work with existing tools] I can imagine multiple "solutions" are in fact needed. > On Sat, 26 Oct 2013 01:26:22 +0200, Doug Evans wrote: >> --- a/gdb/solib-svr4.c >> +++ b/gdb/solib-svr4.c >> @@ -2608,6 +2608,22 @@ svr4_exec_displacement (CORE_ADDR *displacementp) >> if (memcmp (phdrp, phdr2p, sizeof (*phdrp)) == 0) >> continue; >> >> + /* Gold and strip differ on the flags and alignment of >> + PT_GNU_RELRO. See PR 11786. */ >> + if (phdr2[i].p_type == PT_GNU_RELRO) >> + { >> + Elf32_External_Phdr tmp_phdr = *phdrp; >> + Elf32_External_Phdr tmp_phdr2 = *phdr2p; > > One can modify directly *phdrp and *phdr2p, when we decide to ignore the > PT_GNU_RELRO differences there is no other use for that data. I like the locality, and not imposing the side effect outside the scope of the task at hand (PT_GNU_RELRO). >> + >> + memset (tmp_phdr.p_flags, 0, 4); >> + memset (tmp_phdr.p_align, 0, 4); >> + memset (tmp_phdr2.p_flags, 0, 4); >> + memset (tmp_phdr2.p_align, 0, 4); > > Missing here also FileSiz and MemSiz, during my test on CentOS-5 x86_64 the > testcase was still FAILing due to: > > Program Headers: > Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align > - GNU_RELRO 0x000de8 0x0000000000200de8 0x0000000000200de8 0x000218 0x000218 R 0x1 > + GNU_RELRO 0x000de8 0x0000000000200de8 0x0000000000200de8 0x000200 0x000200 R 0x1 > > Therefore tested as PASSing with: > > memset (tmp_phdr.p_filesz, 0, 4); > memset (tmp_phdr.p_memsz, 0, 4); > memset (tmp_phdr.p_flags, 0, 4); > memset (tmp_phdr.p_align, 0, 4); > memset (tmp_phdr2.p_filesz, 0, 4); > memset (tmp_phdr2.p_memsz, 0, 4); > memset (tmp_phdr2.p_flags, 0, 4); > memset (tmp_phdr2.p_align, 0, 4); "works for me" >> + >> + if (memcmp (&tmp_phdr, &tmp_phdr2, sizeof (tmp_phdr)) == 0) >> + continue; >> + } >> + >> /* prelink can convert .plt SHT_NOBITS to SHT_PROGBITS. */ >> plt2_asect = bfd_get_section_by_name (exec_bfd, ".plt"); >> if (plt2_asect) >> @@ -2717,6 +2733,22 @@ svr4_exec_displacement (CORE_ADDR *displacementp) >> if (memcmp (phdrp, phdr2p, sizeof (*phdrp)) == 0) >> continue; >> >> + /* Gold and strip differ on the flags and alignment of >> + PT_GNU_RELRO. See PR 11786. */ >> + if (phdr2[i].p_type == PT_GNU_RELRO) >> + { >> + Elf64_External_Phdr tmp_phdr = *phdrp; >> + Elf64_External_Phdr tmp_phdr2 = *phdr2p; > > Likewise. > > >> + >> + memset (tmp_phdr.p_flags, 0, 4); >> + memset (tmp_phdr.p_align, 0, 8); >> + memset (tmp_phdr2.p_flags, 0, 4); >> + memset (tmp_phdr2.p_align, 0, 8); > > Change to: > memset (tmp_phdr.p_filesz, 0, 8); > memset (tmp_phdr.p_memsz, 0, 8); > memset (tmp_phdr.p_flags, 0, 4); > memset (tmp_phdr.p_align, 0, 8); > memset (tmp_phdr2.p_filesz, 0, 8); > memset (tmp_phdr2.p_memsz, 0, 8); > memset (tmp_phdr2.p_flags, 0, 4); > memset (tmp_phdr2.p_align, 0, 8); > > >> + >> + if (memcmp (&tmp_phdr, &tmp_phdr2, sizeof (tmp_phdr)) == 0) >> + continue; >> + } >> + >> /* prelink can convert .plt SHT_NOBITS to SHT_PROGBITS. */ >> plt2_asect = bfd_get_section_by_name (exec_bfd, ".plt"); >> if (plt2_asect) >> diff --git a/gdb/testsuite/gdb.base/gcore-relro-pie.c b/gdb/testsuite/gdb.base/gcore-relro-pie.c >> new file mode 100644 >> index 0000000..1594385 >> --- /dev/null >> +++ b/gdb/testsuite/gdb.base/gcore-relro-pie.c >> @@ -0,0 +1,41 @@ >> +/* Copyright 2013 Free Software Foundation, Inc. >> + >> + This file is part of GDB. >> + >> + This program is free software; you can redistribute it and/or modify >> + it under the terms of the GNU General Public License as published by >> + the Free Software Foundation; either version 3 of the License, or >> + (at your option) any later version. >> + >> + This program is distributed in the hope that it will be useful, >> + but WITHOUT ANY WARRANTY; without even the implied warranty of >> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + GNU General Public License for more details. >> + >> + You should have received a copy of the GNU General Public License >> + along with this program. If not, see . */ >> + >> +void >> +break_here () > > (void) We don't have any such style rules for testcases. But ok, done. Going forward though, for my own patch reviews of other people's code, what's the story here? Do we augment coding style rules for testcases to match the rest of gdb? I like rules being applied consistently. >> +{ >> + *(int *) 0 = 0; >> +} >> + >> +void >> +foo () > > (void) > >> +{ >> + break_here (); >> +} >> + >> +void >> +bar () > > (void) > >> +{ >> + foo (); >> +} >> + >> +int >> +main (void) >> +{ >> + bar (); >> + return 0; >> +} >> diff --git a/gdb/testsuite/gdb.base/gcore-relro-pie.exp b/gdb/testsuite/gdb.base/gcore-relro-pie.exp >> new file mode 100644 >> index 0000000..1fcfd8c >> --- /dev/null >> +++ b/gdb/testsuite/gdb.base/gcore-relro-pie.exp >> @@ -0,0 +1,70 @@ >> +# Copyright 2013 Free Software Foundation, Inc. >> + >> +# This program is free software; you can redistribute it and/or modify >> +# it under the terms of the GNU General Public License as published by >> +# the Free Software Foundation; either version 3 of the License, or >> +# (at your option) any later version. >> +# >> +# This program is distributed in the hope that it will be useful, >> +# but WITHOUT ANY WARRANTY; without even the implied warranty of >> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> +# GNU General Public License for more details. >> +# >> +# You should have received a copy of the GNU General Public License >> +# along with this program. If not, see . >> + >> +# PR 11786 (Gold and strip differ on flags,align fields of PT_GNU_RELRO). >> +# Generate a core file from the stripped version of the program, >> +# and then try to debug the core with the unstripped version. >> + >> +standard_testfile >> + >> +if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug additional_flags=-fpie additional_flags=-pie additional_flags=-Wl,-z,relro}]} { > > CentOS-5 (older GCC) compatibility: > gdb compile failed, gcc: -z: linker input file unused because linking not done > gcc: relro: linker input file unused because linking not done > > coding style: Three times repeating additional_flags=... > > -> > > if {[prepare_for_testing $testfile.exp $testfile $srcfile [list debug additional_flags=-fpie "ldflags=-pie -Wl,-z,relro"]]} { Done. >> + return -1 >> +} >> + >> +set stripped_binfile ${binfile}.stripped >> +set gcorefile ${binfile}.gcore >> + >> +set strip_program [transform strip] >> +remote_file host delete ${stripped_binfile} >> +if [run_on_host "strip" "$strip_program" "-g -o ${stripped_binfile} $binfile"] { >> + return -1 >> +} > > For CentOS-5 is missing this part, similar to what is in lib/gdb.exp: > > # Workaround PR binutils/10802: > # Preserve the 'x' bit also for PIEs (Position Independent Executables). > set perm [file attributes ${binfile} -permissions] > file attributes ${stripped_binfile} -permissions $perm Done. >> + >> +clean_restart ${stripped_binfile} >> + >> +# Does this gdb support gcore? >> +set test "help gcore" >> +gdb_test_multiple $test $test { >> + -re "Undefined command: .gcore.*\r\n$gdb_prompt $" { >> + # gcore command not supported -- nothing to test here. >> + unsupported "gdb does not support gcore on this target" >> + return -1 >> + } >> + -re "Save a core file .*\r\n$gdb_prompt $" { >> + pass $test >> + } >> +} >> + >> +# The binary is stripped of debug info, but not minsyms. >> +if ![runto break_here] { >> + fail "Can't run to break_here" >> + return -1 >> +} >> + >> +if {![gdb_gcore_cmd $gcorefile "save a corefile"]} { >> + return -1 >> +} >> + >> +# Now restart gdb with the unstripped binary and load the corefile. >> + >> +clean_restart ${binfile} >> + >> +gdb_test "core ${gcorefile}" \ >> + "Core was generated by .*" "re-load generated corefile" >> + >> +# Put $pc in gdb.log for debug purposes for comparison with stripped case. >> +gdb_test "x/i \$pc" "break_here.*" >> + >> +gdb_test "frame" "#0 \[^\r\n\]* break_here .*" "unstripped + core ok" > > > Thanks, > Jan I will check this in in a few days pending further requests for changes. [which I'm happy to do ... I just hate unnecessarily requiring people to send (and read) email, there's so much of it already] --001a11c1ff44b3350204ea615642 Content-Type: text/plain; charset=US-ASCII; name="gdb-131104-11786-2.patch.txt" Content-Disposition: attachment; filename="gdb-131104-11786-2.patch.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hnm9voml0 Content-length: 8630 MjAxMy0xMS0wNCAgRG91ZyBFdmFucyAgPGRqZUBnb29nbGUuY29tPgoKCVBS IDExNzg2CgkqICBzb2xpYi1zdnI0LmMgKHN2cjRfZXhlY19kaXNwbGFjZW1l bnQpOiBJZ25vcmUgZmlsZXN6LCBtZW1zeiwgZmxhZ3MKCWFuZCBhbGlnbiBm aWVsZHMgZm9yIFBUX0dOVV9SRUxSTyBzZWdtZW50cy4KCgl0ZXN0c3VpdGUv CgkqIGdkYi5iYXNlL2djb3JlLXJlbHJvLXBpZS5jOiBOZXcgZmlsZS4KCSog Z2RiLmJhc2UvZ2NvcmUtcmVscm8tcGllLmV4cDogTmV3IGZpbGUuCgpkaWZm IC0tZ2l0IGEvZ2RiL3NvbGliLXN2cjQuYyBiL2dkYi9zb2xpYi1zdnI0LmMK aW5kZXggM2VlYTA1Ny4uOTUzOGFmNiAxMDA2NDQKLS0tIGEvZ2RiL3NvbGli LXN2cjQuYworKysgYi9nZGIvc29saWItc3ZyNC5jCkBAIC0yNjA0LDYgKzI2 MDQsMjggQEAgc3ZyNF9leGVjX2Rpc3BsYWNlbWVudCAoQ09SRV9BRERSICpk aXNwbGFjZW1lbnRwKQogCQkgIGlmIChtZW1jbXAgKHBoZHJwLCBwaGRyMnAs IHNpemVvZiAoKnBoZHJwKSkgPT0gMCkKIAkJICAgIGNvbnRpbnVlOwogCisJ CSAgLyogU3RyaXAgbW9kaWZpZXMgdGhlIGZsYWdzIGFuZCBhbGlnbm1lbnQg b2YgUFRfR05VX1JFTFJPLgorCQkgICAgIENlbnRPUy01IGhhcyBwcm9ibGVt cyB3aXRoIGZpbGVzeiwgbWVtc3ogYXMgd2VsbC4KKwkJICAgICBTZWUgUFIg MTE3ODYuICAqLworCQkgIGlmIChwaGRyMltpXS5wX3R5cGUgPT0gUFRfR05V X1JFTFJPKQorCQkgICAgeworCQkgICAgICBFbGYzMl9FeHRlcm5hbF9QaGRy IHRtcF9waGRyID0gKnBoZHJwOworCQkgICAgICBFbGYzMl9FeHRlcm5hbF9Q aGRyIHRtcF9waGRyMiA9ICpwaGRyMnA7CisKKwkJICAgICAgbWVtc2V0ICh0 bXBfcGhkci5wX2ZpbGVzeiwgMCwgNCk7CisJCSAgICAgIG1lbXNldCAodG1w X3BoZHIucF9tZW1zeiwgMCwgNCk7CisJCSAgICAgIG1lbXNldCAodG1wX3Bo ZHIucF9mbGFncywgMCwgNCk7CisJCSAgICAgIG1lbXNldCAodG1wX3BoZHIu cF9hbGlnbiwgMCwgNCk7CisJCSAgICAgIG1lbXNldCAodG1wX3BoZHIyLnBf ZmlsZXN6LCAwLCA0KTsKKwkJICAgICAgbWVtc2V0ICh0bXBfcGhkcjIucF9t ZW1zeiwgMCwgNCk7CisJCSAgICAgIG1lbXNldCAodG1wX3BoZHIyLnBfZmxh Z3MsIDAsIDQpOworCQkgICAgICBtZW1zZXQgKHRtcF9waGRyMi5wX2FsaWdu LCAwLCA0KTsKKworCQkgICAgICBpZiAobWVtY21wICgmdG1wX3BoZHIsICZ0 bXBfcGhkcjIsIHNpemVvZiAodG1wX3BoZHIpKQorCQkJICA9PSAwKQorCQkJ Y29udGludWU7CisJCSAgICB9CisKIAkJICAvKiBwcmVsaW5rIGNhbiBjb252 ZXJ0IC5wbHQgU0hUX05PQklUUyB0byBTSFRfUFJPR0JJVFMuICAqLwogCQkg IHBsdDJfYXNlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZXhlY19i ZmQsICIucGx0Iik7CiAJCSAgaWYgKHBsdDJfYXNlY3QpCkBAIC0yNzEzLDYg KzI3MzUsMjggQEAgc3ZyNF9leGVjX2Rpc3BsYWNlbWVudCAoQ09SRV9BRERS ICpkaXNwbGFjZW1lbnRwKQogCQkgIGlmIChtZW1jbXAgKHBoZHJwLCBwaGRy MnAsIHNpemVvZiAoKnBoZHJwKSkgPT0gMCkKIAkJICAgIGNvbnRpbnVlOwog CisJCSAgLyogU3RyaXAgbW9kaWZpZXMgdGhlIGZsYWdzIGFuZCBhbGlnbm1l bnQgb2YgUFRfR05VX1JFTFJPLgorCQkgICAgIENlbnRPUy01IGhhcyBwcm9i bGVtcyB3aXRoIGZpbGVzeiwgbWVtc3ogYXMgd2VsbC4KKwkJICAgICBTZWUg UFIgMTE3ODYuICAqLworCQkgIGlmIChwaGRyMltpXS5wX3R5cGUgPT0gUFRf R05VX1JFTFJPKQorCQkgICAgeworCQkgICAgICBFbGY2NF9FeHRlcm5hbF9Q aGRyIHRtcF9waGRyID0gKnBoZHJwOworCQkgICAgICBFbGY2NF9FeHRlcm5h bF9QaGRyIHRtcF9waGRyMiA9ICpwaGRyMnA7CisKKwkJICAgICAgbWVtc2V0 ICh0bXBfcGhkci5wX2ZpbGVzeiwgMCwgOCk7CisJCSAgICAgIG1lbXNldCAo dG1wX3BoZHIucF9tZW1zeiwgMCwgOCk7CisJCSAgICAgIG1lbXNldCAodG1w X3BoZHIucF9mbGFncywgMCwgNCk7CisJCSAgICAgIG1lbXNldCAodG1wX3Bo ZHIucF9hbGlnbiwgMCwgOCk7CisJCSAgICAgIG1lbXNldCAodG1wX3BoZHIy LnBfZmlsZXN6LCAwLCA4KTsKKwkJICAgICAgbWVtc2V0ICh0bXBfcGhkcjIu cF9tZW1zeiwgMCwgOCk7CisJCSAgICAgIG1lbXNldCAodG1wX3BoZHIyLnBf ZmxhZ3MsIDAsIDQpOworCQkgICAgICBtZW1zZXQgKHRtcF9waGRyMi5wX2Fs aWduLCAwLCA4KTsKKworCQkgICAgICBpZiAobWVtY21wICgmdG1wX3BoZHIs ICZ0bXBfcGhkcjIsIHNpemVvZiAodG1wX3BoZHIpKQorCQkJICA9PSAwKQor CQkJY29udGludWU7CisJCSAgICB9CisKIAkJICAvKiBwcmVsaW5rIGNhbiBj b252ZXJ0IC5wbHQgU0hUX05PQklUUyB0byBTSFRfUFJPR0JJVFMuICAqLwog CQkgIHBsdDJfYXNlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZXhl Y19iZmQsICIucGx0Iik7CiAJCSAgaWYgKHBsdDJfYXNlY3QpCmRpZmYgLS1n aXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2djb3JlLXJlbHJvLXBpZS5j IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9nY29yZS1yZWxyby1waWUuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzI5NjliCi0t LSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9nY29y ZS1yZWxyby1waWUuYwpAQCAtMCwwICsxLDQxIEBACisvKiBDb3B5cmlnaHQg MjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhp cyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMg ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBG cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2Yg dGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl ciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQg aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBX SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk IHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZ b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dy YW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2Vz Lz4uICAqLworCit2b2lkCiticmVha19oZXJlICh2b2lkKQoreworICAqKGlu dCAqKSAwID0gMDsKK30KKwordm9pZAorZm9vICh2b2lkKQoreworICBicmVh a19oZXJlICgpOworfQorCit2b2lkCitiYXIgKHZvaWQpCit7CisgIGZvbyAo KTsKK30KKworaW50CittYWluICh2b2lkKQoreworICBiYXIgKCk7CisgIHJl dHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFz ZS9nY29yZS1yZWxyby1waWUuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFz ZS9nY29yZS1yZWxyby1waWUuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAuLmViNDVjNTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIv dGVzdHN1aXRlL2dkYi5iYXNlL2djb3JlLXJlbHJvLXBpZS5leHAKQEAgLTAs MCArMSw3NSBAQAorIyBDb3B5cmlnaHQgMjAxMyBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0 d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQor IyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNl LCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor IworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK KyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUg cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2Vl IDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworIyBQUiAxMTc4 NiAoR29sZCBhbmQgc3RyaXAgZGlmZmVyIG9uIGZsYWdzLGFsaWduIGZpZWxk cyBvZiBQVF9HTlVfUkVMUk8pLgorIyBHZW5lcmF0ZSBhIGNvcmUgZmlsZSBm cm9tIHRoZSBzdHJpcHBlZCB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtLAorIyBh bmQgdGhlbiB0cnkgdG8gZGVidWcgdGhlIGNvcmUgd2l0aCB0aGUgdW5zdHJp cHBlZCB2ZXJzaW9uLgorCitzdGFuZGFyZF90ZXN0ZmlsZQorCitpZiB7W3By ZXBhcmVfZm9yX3Rlc3RpbmcgJHRlc3RmaWxlLmV4cCAkdGVzdGZpbGUgJHNy Y2ZpbGUge2RlYnVnIGFkZGl0aW9uYWxfZmxhZ3M9LWZwaWUgImxkZmxhZ3M9 LXBpZSAtV2wsLXoscmVscm8ifV19IHsKKyAgICByZXR1cm4gLTEKK30KKwor c2V0IHN0cmlwcGVkX2JpbmZpbGUgJHtiaW5maWxlfS5zdHJpcHBlZAorc2V0 IGdjb3JlZmlsZSAke2JpbmZpbGV9Lmdjb3JlCisKK3NldCBzdHJpcF9wcm9n cmFtIFt0cmFuc2Zvcm0gc3RyaXBdCityZW1vdGVfZmlsZSBob3N0IGRlbGV0 ZSAke3N0cmlwcGVkX2JpbmZpbGV9CitpZiBbcnVuX29uX2hvc3QgInN0cmlw IiAiJHN0cmlwX3Byb2dyYW0iICItZyAtbyAke3N0cmlwcGVkX2JpbmZpbGV9 ICRiaW5maWxlIl0geworICAgIHJldHVybiAtMQorfQorCisjIFdvcmthcm91 bmQgUFIgYmludXRpbHMvMTA4MDI6CisjIFByZXNlcnZlIHRoZSAneCcgYml0 IGFsc28gZm9yIFBJRXMgKFBvc2l0aW9uIEluZGVwZW5kZW50IEV4ZWN1dGFi bGVzKS4KK3NldCBwZXJtIFtmaWxlIGF0dHJpYnV0ZXMgJHtiaW5maWxlfSAt cGVybWlzc2lvbnNdCitmaWxlIGF0dHJpYnV0ZXMgJHtzdHJpcHBlZF9iaW5m aWxlfSAtcGVybWlzc2lvbnMgJHBlcm0KKworY2xlYW5fcmVzdGFydCAke3N0 cmlwcGVkX2JpbmZpbGV9CisKKyMgRG9lcyB0aGlzIGdkYiBzdXBwb3J0IGdj b3JlPworc2V0IHRlc3QgImhlbHAgZ2NvcmUiCitnZGJfdGVzdF9tdWx0aXBs ZSAkdGVzdCAkdGVzdCB7CisgICAgLXJlICJVbmRlZmluZWQgY29tbWFuZDog Lmdjb3JlLipcclxuJGdkYl9wcm9tcHQgJCIgeworCSMgZ2NvcmUgY29tbWFu ZCBub3Qgc3VwcG9ydGVkIC0tIG5vdGhpbmcgdG8gdGVzdCBoZXJlLgorCXVu c3VwcG9ydGVkICJnZGIgZG9lcyBub3Qgc3VwcG9ydCBnY29yZSBvbiB0aGlz IHRhcmdldCIKKwlyZXR1cm4gLTEKKyAgICB9CisgICAgLXJlICJTYXZlIGEg Y29yZSBmaWxlIC4qXHJcbiRnZGJfcHJvbXB0ICQiIHsKKwlwYXNzICR0ZXN0 CisgICAgfQorfQorCisjIFRoZSBiaW5hcnkgaXMgc3RyaXBwZWQgb2YgZGVi dWcgaW5mbywgYnV0IG5vdCBtaW5zeW1zLgoraWYgIVtydW50byBicmVha19o ZXJlXSB7CisgICAgZmFpbCAiQ2FuJ3QgcnVuIHRvIGJyZWFrX2hlcmUiCisg ICAgcmV0dXJuIC0xCit9CisKK2lmIHshW2dkYl9nY29yZV9jbWQgJGdjb3Jl ZmlsZSAic2F2ZSBhIGNvcmVmaWxlIl19IHsKKyAgICByZXR1cm4gLTEKK30K KworIyBOb3cgcmVzdGFydCBnZGIgd2l0aCB0aGUgdW5zdHJpcHBlZCBiaW5h cnkgYW5kIGxvYWQgdGhlIGNvcmVmaWxlLgorCitjbGVhbl9yZXN0YXJ0ICR7 YmluZmlsZX0KKworZ2RiX3Rlc3QgImNvcmUgJHtnY29yZWZpbGV9IiBcCisg ICAgIkNvcmUgd2FzIGdlbmVyYXRlZCBieSAuKiIgInJlLWxvYWQgZ2VuZXJh dGVkIGNvcmVmaWxlIgorCisjIFB1dCAkcGMgaW4gZ2RiLmxvZyBmb3IgZGVi dWcgcHVycG9zZXMgZm9yIGNvbXBhcmlzb24gd2l0aCBzdHJpcHBlZCBjYXNl LgorZ2RiX3Rlc3QgIngvaSBcJHBjIiAiYnJlYWtfaGVyZS4qIgorCitnZGJf dGVzdCAiZnJhbWUiICIjMCBcW15cclxuXF0qIGJyZWFrX2hlcmUgLioiICJ1 bnN0cmlwcGVkICsgY29yZSBvayIK --001a11c1ff44b3350204ea615642--