From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21609 invoked by alias); 12 Jan 2012 22:27:39 -0000 Received: (qmail 21596 invoked by uid 22791); 12 Jan 2012 22:27:38 -0000 X-SWARE-Spam-Status: No, hits=-2.4 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_LOW,TW_BJ,TW_CP,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail-ww0-f41.google.com (HELO mail-ww0-f41.google.com) (74.125.82.41) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 12 Jan 2012 22:27:12 +0000 Received: by wgbed3 with SMTP id ed3so816519wgb.0 for ; Thu, 12 Jan 2012 14:27:10 -0800 (PST) Received: by 10.180.14.161 with SMTP id q1mr4122674wic.1.1326407230484; Thu, 12 Jan 2012 14:27:10 -0800 (PST) Received: by 10.180.14.161 with SMTP id q1mr4122656wic.1.1326407230403; Thu, 12 Jan 2012 14:27:10 -0800 (PST) MIME-Version: 1.0 Received: by 10.223.144.142 with HTTP; Thu, 12 Jan 2012 14:26:39 -0800 (PST) In-Reply-To: <20120112212959.GA24491@host2.jankratochvil.net> References: <20120112030648.14DBE190AFD@elbrus2.mtv.corp.google.com> <20120112212959.GA24491@host2.jankratochvil.net> From: Paul Pluzhnikov Date: Thu, 12 Jan 2012 22:29:00 -0000 Message-ID: Subject: Re: [patch] Fix for PR gdb/9538 (loading of separate debuginfo and symlinks). To: Jan Kratochvil Cc: Doug Evans , gdb-patches@sourceware.org X-System-Of-Record: true Content-Type: multipart/mixed; boundary=f46d04138a67cbb3a904b65c3f14 X-IsSubscribed: yes 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 X-SW-Source: 2012-01/txt/msg00439.txt.bz2 --f46d04138a67cbb3a904b65c3f14 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 6401 On Thu, Jan 12, 2012 at 1:29 PM, Jan Kratochvil wrote: > On Thu, 12 Jan 2012 21:35:21 +0100, Paul Pluzhnikov wrote: >> +/* Modify PATH to contain only "directory/" part of PATH. >> + =A0 If there were no, directory separators in PATH, PATH will be empty >> + =A0 string on return. =A0*/ >> + >> +static void >> +terminate_after_last_dir_separator (char *path) >> +{ >> + =A0int i; >> + >> + =A0/* Strip off the final filename part, leaving the directory name, >> + =A0 =A0 followed by a slash. =A0The directory can be relative or absol= ute. =A0*/ >> + =A0for (i =3D strlen(path) - 1; i >=3D 0; i--) >> + =A0 =A0{ >> + =A0 =A0 =A0if (IS_DIR_SEPARATOR (path[i])) >> + =A0 =A0 break; >> + =A0 =A0} > > Empty line. Done. >> + =A0/* If I is -1 then no directory is present there and DIR will be ""= . =A0*/ >> + =A0path[i+1] =3D '\0'; > > It was there already but there should be `i + 1'. Done. >> +} >> + >> +/* Find separate debuginfo for OBJFILE (using .gnu_debuglink section). >> + =A0 Returns pathname, or NULL. =A0*/ >> + >> +char * >> +find_separate_debug_file_by_debuglink (struct objfile *objfile) >> +{ >> + =A0char *debuglink; >> + =A0char *dir1, *dir2, *canon_dir; >> + =A0char *debugfile; >> + =A0unsigned long crc32; >> + >> + =A0debuglink =3D get_debug_link_info (objfile, &crc32); >> + >> + =A0if (debuglink =3D=3D NULL) >> + =A0 =A0/* There's no separate debug info, hence there's no way we could >> + =A0 =A0 =A0 load it =3D> no warning. =A0*/ >> + =A0 =A0return NULL; >> + >> + =A0dir1 =3D xstrdup (objfile->name); >> + =A0terminate_after_last_dir_separator (dir1); >> + =A0canon_dir =3D lrealpath (dir1); > > lrealpath can return NULL. =A0GDB did not crash before. =A0It will now. Where? canon_dir is passed into the utility function, which checks for NULL (as it did before). >> + >> + =A0debugfile =3D find_separate_debug_file (dir1, canon_dir, debuglink, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 crc32, objfile); >> + =A0xfree (canon_dir); >> + >> + =A0if (debugfile !=3D NULL) >> + =A0 =A0goto cleanup1; >> + >> + =A0/* For PR gdb/9538, try again with realpath (if different from the >> + =A0 =A0 original). =A0*/ >> + =A0dir2 =3D lrealpath (objfile->name); > > Maybe some optimization would be helpful. =A0realpath is expensive and the > directory path is already canonicalized. =A0Something like lstat (objfile= ->name) > and do this step only if it is a symlink. Wouldn't lstat need a configury #ifdef to make it build? But there is no need to do realpath on the directory again, so I just pass dir2 as canon_dir. > Not a requirement from me (modern systems use .build-id anyway). Not all of them. I've hit this bug while debugging libc on pre-release Ubuntu. >> + =A0if (dir2 =3D=3D NULL) >> + =A0 =A0goto cleanup1; >> + >> + =A0terminate_after_last_dir_separator (dir2); >> + =A0if (strcmp (dir1, dir2) =3D=3D 0) >> + =A0 =A0/* Same directory, no point retrying. =A0*/ >> + =A0 =A0goto cleanup2; > > There was some discussion with conclusion it should be written as, nitpic= k: > =A0 =A0 =A0if (strcmp (dir1, dir2) =3D=3D 0) > =A0 =A0 =A0 =A0{ > =A0 =A0 =A0 =A0 =A0/* Same directory, no point retrying. =A0*/ > =A0 =A0 =A0 =A0 =A0goto cleanup2; > =A0 =A0 =A0 =A0} Done. > >> + >> + =A0canon_dir =3D lrealpath (dir2); >> + =A0debugfile =3D find_separate_debug_file (dir2, canon_dir, debuglink, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 crc32, objfile); >> + =A0xfree (canon_dir); >> + >> + cleanup2: >> + =A0xfree (dir2); >> + cleanup1: > > Maybe it should be finally rewritten to cleanups but it may be out of the > scope of this patch. Done. > >> + =A0xfree (dir1); >> + =A0xfree (debuglink); >> >> -cleanup_return_debugfile: >> - =A0xfree (canon_name); >> - =A0xfree (basename); >> - =A0xfree (dir); >> =A0 =A0return debugfile; >> =A0} >> >> Index: testsuite/gdb.base/sepdebug.exp >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> RCS file: /cvs/src/src/gdb/testsuite/gdb.base/sepdebug.exp,v >> retrieving revision 1.33 >> diff -u -p -r1.33 sepdebug.exp >> --- testsuite/gdb.base/sepdebug.exp =A0 4 Jan 2012 08:17:46 -0000 =A0 = =A0 =A0 1.33 >> +++ testsuite/gdb.base/sepdebug.exp =A0 12 Jan 2012 20:29:53 -0000 >> @@ -45,7 +45,7 @@ if =A0{ [gdb_compile "${srcdir}/${subdir}/ >> >> =A0# Note: the procedure gdb_gnu_strip_debug will produce an executable = called >> =A0# ${binfile}, which is just like the executable ($binfile) but without >> -# the debuginfo. Instead $binfile has a .gnudebuglink section which con= tains >> +# the debuginfo. Instead $binfile has a .gnu_debuglink section which co= ntains >> =A0# the name of a debuginfo only file. This file will be stored in the >> =A0# gdb.base/ subdirectory. >> >> @@ -55,10 +55,26 @@ if [gdb_gnu_strip_debug $binfile] { >> =A0 =A0 =A0return -1 >> =A0} >> >> +# >> +# PR gdb/9538. =A0Verify that symlinked executable still finds the sepa= rate >> +# debuginfo. >> +# >> +set old_subdir ${subdir} >> +set subdir ${subdir}/pr9538 >> +remote_exec build "mkdir ${subdir}" >> +remote_exec build "ln -s ${binfile} ${subdir}" > > You should clean up first any stale files there. Done. > > >> +clean_restart ${testfile}${EXEEXT} >> +if { $gdb_file_cmd_debug_info !=3D "debug" } then { >> + =A0 =A0fail "No debug information found." >> +} >> + >> +# make sure we are not holding subdir/binary open. >> =A0gdb_exit >> -gdb_start >> -gdb_reinitialize_dir $srcdir/$subdir >> -gdb_load ${binfile} >> + >> +remote_exec build "rm -rf ${subdir}" > > It is not great the FAIL is not easily reproducible after it happens. Ok. We now leave state as is, and cleanup just before re-creating it. > >> +set subdir ${old_subdir} >> + >> +clean_restart ${testfile}${EXEEXT} >> =A0if { $gdb_file_cmd_debug_info !=3D "debug" } then { >> =A0 =A0 =A0fail "No debug information found." >> =A0} > > Re-tested on Linux/x86_64. Thanks, --=20 Paul Pluzhnikov 2012-01-11 Paul Pluzhnikov PR gdb/9538 * symfile.c (find_separate_debug_file): New function. (terminate_after_last_dir_separator): Likewise. (find_separate_debug_file_by_debuglink): Also try realpath. testsuite/ChangeLog: PR gdb/9538 * gdb.base/sepdebug.exp: New test. --f46d04138a67cbb3a904b65c3f14 Content-Type: text/plain; charset=US-ASCII; name="gdb-symlink-pr9538-20120112a.txt" Content-Disposition: attachment; filename="gdb-symlink-pr9538-20120112a.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gxccl4bf0 Content-length: 10826 SW5kZXg6IHN5bWZpbGUuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBm aWxlOiAvY3ZzL3NyYy9zcmMvZ2RiL3N5bWZpbGUuYyx2CnJldHJpZXZpbmcg cmV2aXNpb24gMS4zMjUKZGlmZiAtdSAtcCAtcjEuMzI1IHN5bWZpbGUuYwot LS0gc3ltZmlsZS5jCTEyIEphbiAyMDEyIDAwOjAwOjAxIC0wMDAwCTEuMzI1 CisrKyBzeW1maWxlLmMJMTIgSmFuIDIwMTIgMjI6MTE6MTcgLTAwMDAKQEAg LTE0NDEsNjMgKzE0NDEsNDggQEAgc2hvd19kZWJ1Z19maWxlX2RpcmVjdG9y eSAoc3RydWN0IHVpX2ZpbAogI2RlZmluZSBERUJVR19TVUJESVJFQ1RPUlkg Ii5kZWJ1ZyIKICNlbmRpZgogCi1jaGFyICoKLWZpbmRfc2VwYXJhdGVfZGVi dWdfZmlsZV9ieV9kZWJ1Z2xpbmsgKHN0cnVjdCBvYmpmaWxlICpvYmpmaWxl KQorLyogRmluZCBhIHNlcGFyYXRlIGRlYnVnaW5mbyBmaWxlIGZvciBPQkpG SUxFLCB1c2luZyBESVIgYXMgdGhlIGRpcmVjdG9yeQorICAgd2hlcmUgdGhl IG9yaWdpbmFsIGZpbGUgcmVzaWRlcyAobWF5IG5vdCBiZSB0aGUgc2FtZSBh cworICAgZGlybmFtZShvYmpmaWxlLT5uYW1lKSBkdWUgdG8gc3ltbGlua3Mp LCBhbmQgREVCVUdMSU5LIGFzIHRoZSBmaWxlIHdlIGFyZQorICAgbG9va2lu ZyBmb3IuICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBkZWJ1Z2luZm8sIG9m IE5VTEwuICAqLworCitzdGF0aWMgY2hhciAqCitmaW5kX3NlcGFyYXRlX2Rl YnVnX2ZpbGUgKGNvbnN0IGNoYXIgKmRpciwKKwkJCSAgY29uc3QgY2hhciAq Y2Fub25fZGlyLAorCQkJICBjb25zdCBjaGFyICpkZWJ1Z2xpbmssCisJCQkg IHVuc2lnbmVkIGxvbmcgY3JjMzIsIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxl KQogewotICBjaGFyICpiYXNlbmFtZSwgKmRlYnVnZGlyOwotICBjaGFyICpk aXIgPSBOVUxMOwotICBjaGFyICpkZWJ1Z2ZpbGUgPSBOVUxMOwotICBjaGFy ICpjYW5vbl9uYW1lID0gTlVMTDsKLSAgdW5zaWduZWQgbG9uZyBjcmMzMjsK KyAgY2hhciAqZGVidWdkaXI7CisgIGNoYXIgKmRlYnVnZmlsZTsKICAgaW50 IGk7CiAKLSAgYmFzZW5hbWUgPSBnZXRfZGVidWdfbGlua19pbmZvIChvYmpm aWxlLCAmY3JjMzIpOwotCi0gIGlmIChiYXNlbmFtZSA9PSBOVUxMKQotICAg IC8qIFRoZXJlJ3Mgbm8gc2VwYXJhdGUgZGVidWcgaW5mbywgaGVuY2UgdGhl cmUncyBubyB3YXkgd2UgY291bGQKLSAgICAgICBsb2FkIGl0ID0+IG5vIHdh cm5pbmcuICAqLwotICAgIGdvdG8gY2xlYW51cF9yZXR1cm5fZGVidWdmaWxl OwotCi0gIGRpciA9IHhzdHJkdXAgKG9iamZpbGUtPm5hbWUpOwotCi0gIC8q IFN0cmlwIG9mZiB0aGUgZmluYWwgZmlsZW5hbWUgcGFydCwgbGVhdmluZyB0 aGUgZGlyZWN0b3J5IG5hbWUsCi0gICAgIGZvbGxvd2VkIGJ5IGEgc2xhc2gu ICBUaGUgZGlyZWN0b3J5IGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4g ICovCi0gIGZvciAoaSA9IHN0cmxlbihkaXIpIC0gMTsgaSA+PSAwOyBpLS0p Ci0gICAgewotICAgICAgaWYgKElTX0RJUl9TRVBBUkFUT1IgKGRpcltpXSkp Ci0JYnJlYWs7Ci0gICAgfQotICAvKiBJZiBJIGlzIC0xIHRoZW4gbm8gZGly ZWN0b3J5IGlzIHByZXNlbnQgdGhlcmUgYW5kIERJUiB3aWxsIGJlICIiLiAg Ki8KLSAgZGlyW2krMV0gPSAnXDAnOwotCi0gIC8qIFNldCBJIHRvIG1heCAo c3RybGVuIChjYW5vbl9uYW1lKSwgc3RybGVuIChkaXIpKS4gICovCi0gIGNh bm9uX25hbWUgPSBscmVhbHBhdGggKGRpcik7CisgIC8qIFNldCBJIHRvIG1h eCAoc3RybGVuIChjYW5vbl9kaXIpLCBzdHJsZW4gKGRpcikpLiAgKi8KICAg aSA9IHN0cmxlbiAoZGlyKTsKLSAgaWYgKGNhbm9uX25hbWUgJiYgc3RybGVu IChjYW5vbl9uYW1lKSA+IGkpCi0gICAgaSA9IHN0cmxlbiAoY2Fub25fbmFt ZSk7CisgIGlmIChjYW5vbl9kaXIgIT0gTlVMTCAmJiBzdHJsZW4gKGNhbm9u X2RpcikgPiBpKQorICAgIGkgPSBzdHJsZW4gKGNhbm9uX2Rpcik7CiAKICAg ZGVidWdmaWxlID0geG1hbGxvYyAoc3RybGVuIChkZWJ1Z19maWxlX2RpcmVj dG9yeSkgKyAxCiAJCSAgICAgICArIGkKIAkJICAgICAgICsgc3RybGVuIChE RUJVR19TVUJESVJFQ1RPUlkpCiAJCSAgICAgICArIHN0cmxlbiAoIi8iKQot CQkgICAgICAgKyBzdHJsZW4gKGJhc2VuYW1lKQorCQkgICAgICAgKyBzdHJs ZW4gKGRlYnVnbGluaykKIAkJICAgICAgICsgMSk7CiAKICAgLyogRmlyc3Qg dHJ5IGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgb3JpZ2luYWwgZmls ZS4gICovCiAgIHN0cmNweSAoZGVidWdmaWxlLCBkaXIpOwotICBzdHJjYXQg KGRlYnVnZmlsZSwgYmFzZW5hbWUpOworICBzdHJjYXQgKGRlYnVnZmlsZSwg ZGVidWdsaW5rKTsKIAogICBpZiAoc2VwYXJhdGVfZGVidWdfZmlsZV9leGlz dHMgKGRlYnVnZmlsZSwgY3JjMzIsIG9iamZpbGUpKQotICAgIGdvdG8gY2xl YW51cF9yZXR1cm5fZGVidWdmaWxlOworICAgIHJldHVybiBkZWJ1Z2ZpbGU7 CiAKICAgLyogVGhlbiB0cnkgaW4gdGhlIHN1YmRpcmVjdG9yeSBuYW1lZCBE RUJVR19TVUJESVJFQ1RPUlkuICAqLwogICBzdHJjcHkgKGRlYnVnZmlsZSwg ZGlyKTsKICAgc3RyY2F0IChkZWJ1Z2ZpbGUsIERFQlVHX1NVQkRJUkVDVE9S WSk7CiAgIHN0cmNhdCAoZGVidWdmaWxlLCAiLyIpOwotICBzdHJjYXQgKGRl YnVnZmlsZSwgYmFzZW5hbWUpOworICBzdHJjYXQgKGRlYnVnZmlsZSwgZGVi dWdsaW5rKTsKIAogICBpZiAoc2VwYXJhdGVfZGVidWdfZmlsZV9leGlzdHMg KGRlYnVnZmlsZSwgY3JjMzIsIG9iamZpbGUpKQotICAgIGdvdG8gY2xlYW51 cF9yZXR1cm5fZGVidWdmaWxlOworICAgIHJldHVybiBkZWJ1Z2ZpbGU7CiAK ICAgLyogVGhlbiB0cnkgaW4gdGhlIGdsb2JhbCBkZWJ1Z2ZpbGUgZGlyZWN0 b3JpZXMuCiAKQEAgLTE1MjAsMjYgKzE1MDUsMjYgQEAgZmluZF9zZXBhcmF0 ZV9kZWJ1Z19maWxlX2J5X2RlYnVnbGluayAocwogICAgICAgZGVidWdmaWxl W2RlYnVnZGlyX2VuZCAtIGRlYnVnZGlyXSA9IDA7CiAgICAgICBzdHJjYXQg KGRlYnVnZmlsZSwgIi8iKTsKICAgICAgIHN0cmNhdCAoZGVidWdmaWxlLCBk aXIpOwotICAgICAgc3RyY2F0IChkZWJ1Z2ZpbGUsIGJhc2VuYW1lKTsKKyAg ICAgIHN0cmNhdCAoZGVidWdmaWxlLCBkZWJ1Z2xpbmspOwogCiAgICAgICBp ZiAoc2VwYXJhdGVfZGVidWdfZmlsZV9leGlzdHMgKGRlYnVnZmlsZSwgY3Jj MzIsIG9iamZpbGUpKQotCWdvdG8gY2xlYW51cF9yZXR1cm5fZGVidWdmaWxl OworCXJldHVybiBkZWJ1Z2ZpbGU7CiAKICAgICAgIC8qIElmIHRoZSBmaWxl IGlzIGluIHRoZSBzeXNyb290LCB0cnkgdXNpbmcgaXRzIGJhc2UgcGF0aCBp biB0aGUKIAkgZ2xvYmFsIGRlYnVnZmlsZSBkaXJlY3RvcnkuICAqLwotICAg ICAgaWYgKGNhbm9uX25hbWUKLQkgICYmIGZpbGVuYW1lX25jbXAgKGNhbm9u X25hbWUsIGdkYl9zeXNyb290LAorICAgICAgaWYgKGNhbm9uX2RpciAhPSBO VUxMCisJICAmJiBmaWxlbmFtZV9uY21wIChjYW5vbl9kaXIsIGdkYl9zeXNy b290LAogCQkJICAgIHN0cmxlbiAoZ2RiX3N5c3Jvb3QpKSA9PSAwCi0JICAm JiBJU19ESVJfU0VQQVJBVE9SIChjYW5vbl9uYW1lW3N0cmxlbiAoZ2RiX3N5 c3Jvb3QpXSkpCisJICAmJiBJU19ESVJfU0VQQVJBVE9SIChjYW5vbl9kaXJb c3RybGVuIChnZGJfc3lzcm9vdCldKSkKIAl7CiAJICBtZW1jcHkgKGRlYnVn ZmlsZSwgZGVidWdkaXIsIGRlYnVnZGlyX2VuZCAtIGRlYnVnZGlyKTsKIAkg IGRlYnVnZmlsZVtkZWJ1Z2Rpcl9lbmQgLSBkZWJ1Z2Rpcl0gPSAwOwotCSAg c3RyY2F0IChkZWJ1Z2ZpbGUsIGNhbm9uX25hbWUgKyBzdHJsZW4gKGdkYl9z eXNyb290KSk7CisJICBzdHJjYXQgKGRlYnVnZmlsZSwgY2Fub25fZGlyICsg c3RybGVuIChnZGJfc3lzcm9vdCkpOwogCSAgc3RyY2F0IChkZWJ1Z2ZpbGUs ICIvIik7Ci0JICBzdHJjYXQgKGRlYnVnZmlsZSwgYmFzZW5hbWUpOworCSAg c3RyY2F0IChkZWJ1Z2ZpbGUsIGRlYnVnbGluayk7CiAKIAkgIGlmIChzZXBh cmF0ZV9kZWJ1Z19maWxlX2V4aXN0cyAoZGVidWdmaWxlLCBjcmMzMiwgb2Jq ZmlsZSkpCi0JICAgIGdvdG8gY2xlYW51cF9yZXR1cm5fZGVidWdmaWxlOwor CSAgICByZXR1cm4gZGVidWdmaWxlOwogCX0KIAogICAgICAgZGVidWdkaXIg PSBkZWJ1Z2Rpcl9lbmQ7CkBAIC0xNTQ3LDEyICsxNTMyLDc4IEBAIGZpbmRf c2VwYXJhdGVfZGVidWdfZmlsZV9ieV9kZWJ1Z2xpbmsgKHMKICAgd2hpbGUg KCpkZWJ1Z2RpciAhPSAwKTsKIAogICB4ZnJlZSAoZGVidWdmaWxlKTsKLSAg ZGVidWdmaWxlID0gTlVMTDsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIE1v ZGlmeSBQQVRIIHRvIGNvbnRhaW4gb25seSAiZGlyZWN0b3J5LyIgcGFydCBv ZiBQQVRILgorICAgSWYgdGhlcmUgd2VyZSBubywgZGlyZWN0b3J5IHNlcGFy YXRvcnMgaW4gUEFUSCwgUEFUSCB3aWxsIGJlIGVtcHR5CisgICBzdHJpbmcg b24gcmV0dXJuLiAgKi8KKworc3RhdGljIHZvaWQKK3Rlcm1pbmF0ZV9hZnRl cl9sYXN0X2Rpcl9zZXBhcmF0b3IgKGNoYXIgKnBhdGgpCit7CisgIGludCBp OworCisgIC8qIFN0cmlwIG9mZiB0aGUgZmluYWwgZmlsZW5hbWUgcGFydCwg bGVhdmluZyB0aGUgZGlyZWN0b3J5IG5hbWUsCisgICAgIGZvbGxvd2VkIGJ5 IGEgc2xhc2guICBUaGUgZGlyZWN0b3J5IGNhbiBiZSByZWxhdGl2ZSBvciBh YnNvbHV0ZS4gICovCisgIGZvciAoaSA9IHN0cmxlbihwYXRoKSAtIDE7IGkg Pj0gMDsgaS0tKQorICAgIGlmIChJU19ESVJfU0VQQVJBVE9SIChwYXRoW2ld KSkKKyAgICAgIGJyZWFrOworCisgIC8qIElmIEkgaXMgLTEgdGhlbiBubyBk aXJlY3RvcnkgaXMgcHJlc2VudCB0aGVyZSBhbmQgRElSIHdpbGwgYmUgIiIu ICAqLworICBwYXRoW2kgKyAxXSA9ICdcMCc7Cit9CisKKy8qIEZpbmQgc2Vw YXJhdGUgZGVidWdpbmZvIGZvciBPQkpGSUxFICh1c2luZyAuZ251X2RlYnVn bGluayBzZWN0aW9uKS4KKyAgIFJldHVybnMgcGF0aG5hbWUsIG9yIE5VTEwu ICAqLworCitjaGFyICoKK2ZpbmRfc2VwYXJhdGVfZGVidWdfZmlsZV9ieV9k ZWJ1Z2xpbmsgKHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlKQoreworICBjaGFy ICpkZWJ1Z2xpbms7CisgIGNoYXIgKmRpcjEsICpkaXIyLCAqY2Fub25fZGly OworICBjaGFyICpkZWJ1Z2ZpbGU7CisgIHVuc2lnbmVkIGxvbmcgY3JjMzI7 CisgIHN0cnVjdCBjbGVhbnVwICpjbGVhbnVwczsKKworICBkZWJ1Z2xpbmsg PSBnZXRfZGVidWdfbGlua19pbmZvIChvYmpmaWxlLCAmY3JjMzIpOworCisg IGlmIChkZWJ1Z2xpbmsgPT0gTlVMTCkKKyAgICAvKiBUaGVyZSdzIG5vIHNl cGFyYXRlIGRlYnVnIGluZm8sIGhlbmNlIHRoZXJlJ3Mgbm8gd2F5IHdlIGNv dWxkCisgICAgICAgbG9hZCBpdCA9PiBubyB3YXJuaW5nLiAgKi8KKyAgICBy ZXR1cm4gTlVMTDsKKworICBkaXIxID0geHN0cmR1cCAob2JqZmlsZS0+bmFt ZSk7CisgIGNsZWFudXBzID0gbWFrZV9jbGVhbnVwICh4ZnJlZSwgZGlyMSk7 CisgIHRlcm1pbmF0ZV9hZnRlcl9sYXN0X2Rpcl9zZXBhcmF0b3IgKGRpcjEp OworICBjYW5vbl9kaXIgPSBscmVhbHBhdGggKGRpcjEpOworCisgIGRlYnVn ZmlsZSA9IGZpbmRfc2VwYXJhdGVfZGVidWdfZmlsZSAoZGlyMSwgY2Fub25f ZGlyLCBkZWJ1Z2xpbmssCisJCQkJCWNyYzMyLCBvYmpmaWxlKTsKKyAgeGZy ZWUgKGNhbm9uX2Rpcik7CisKKyAgaWYgKGRlYnVnZmlsZSAhPSBOVUxMKQor ICAgIGdvdG8gY2xlYW51cDsKKworICAvKiBGb3IgUFIgZ2RiLzk1MzgsIHRy eSBhZ2FpbiB3aXRoIHJlYWxwYXRoIChpZiBkaWZmZXJlbnQgZnJvbSB0aGUK KyAgICAgb3JpZ2luYWwpLiAgKi8KKyAgZGlyMiA9IGxyZWFscGF0aCAob2Jq ZmlsZS0+bmFtZSk7CisgIGlmIChkaXIyID09IE5VTEwpCisgICAgZ290byBj bGVhbnVwOworCisgIGNsZWFudXBzID0gbWFrZV9jbGVhbnVwICh4ZnJlZSwg ZGlyMik7CisgIHRlcm1pbmF0ZV9hZnRlcl9sYXN0X2Rpcl9zZXBhcmF0b3Ig KGRpcjIpOworICBpZiAoc3RyY21wIChkaXIxLCBkaXIyKSA9PSAwKQorICAg IHsKKyAgICAgIC8qIFNhbWUgZGlyZWN0b3J5LCBubyBwb2ludCByZXRyeWlu Zy4gICovCisgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorCisgIGRlYnVn ZmlsZSA9IGZpbmRfc2VwYXJhdGVfZGVidWdfZmlsZSAoZGlyMiwgZGlyMiwg ZGVidWdsaW5rLAorCQkJCQljcmMzMiwgb2JqZmlsZSk7CiAKLWNsZWFudXBf cmV0dXJuX2RlYnVnZmlsZToKLSAgeGZyZWUgKGNhbm9uX25hbWUpOwotICB4 ZnJlZSAoYmFzZW5hbWUpOwotICB4ZnJlZSAoZGlyKTsKKyBjbGVhbnVwOgor ICBkb19jbGVhbnVwcyAoY2xlYW51cHMpOwogICByZXR1cm4gZGVidWdmaWxl OwogfQogCkluZGV4OiB0ZXN0c3VpdGUvZ2RiLmJhc2Uvc2VwZGVidWcuZXhw Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9jdnMvc3JjL3Ny Yy9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NlcGRlYnVnLmV4cCx2CnJldHJp ZXZpbmcgcmV2aXNpb24gMS4zMwpkaWZmIC11IC1wIC1yMS4zMyBzZXBkZWJ1 Zy5leHAKLS0tIHRlc3RzdWl0ZS9nZGIuYmFzZS9zZXBkZWJ1Zy5leHAJNCBK YW4gMjAxMiAwODoxNzo0NiAtMDAwMAkxLjMzCisrKyB0ZXN0c3VpdGUvZ2Ri LmJhc2Uvc2VwZGVidWcuZXhwCTEyIEphbiAyMDEyIDIyOjExOjE3IC0wMDAw CkBAIC00NSw3ICs0NSw3IEBAIGlmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNk aXJ9LyR7c3ViZGlyfS8KIAogIyBOb3RlOiB0aGUgcHJvY2VkdXJlIGdkYl9n bnVfc3RyaXBfZGVidWcgd2lsbCBwcm9kdWNlIGFuIGV4ZWN1dGFibGUgY2Fs bGVkCiAjICR7YmluZmlsZX0sIHdoaWNoIGlzIGp1c3QgbGlrZSB0aGUgZXhl Y3V0YWJsZSAoJGJpbmZpbGUpIGJ1dCB3aXRob3V0Ci0jIHRoZSBkZWJ1Z2lu Zm8uIEluc3RlYWQgJGJpbmZpbGUgaGFzIGEgLmdudWRlYnVnbGluayBzZWN0 aW9uIHdoaWNoIGNvbnRhaW5zCisjIHRoZSBkZWJ1Z2luZm8uIEluc3RlYWQg JGJpbmZpbGUgaGFzIGEgLmdudV9kZWJ1Z2xpbmsgc2VjdGlvbiB3aGljaCBj b250YWlucwogIyB0aGUgbmFtZSBvZiBhIGRlYnVnaW5mbyBvbmx5IGZpbGUu IFRoaXMgZmlsZSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUKICMgZ2RiLmJhc2Uv IHN1YmRpcmVjdG9yeS4KIApAQCAtNTUsMTAgKzU1LDI3IEBAIGlmIFtnZGJf Z251X3N0cmlwX2RlYnVnICRiaW5maWxlXSB7CiAgICAgcmV0dXJuIC0xCiB9 CiAKLWdkYl9leGl0Ci1nZGJfc3RhcnQKLWdkYl9yZWluaXRpYWxpemVfZGly ICRzcmNkaXIvJHN1YmRpcgotZ2RiX2xvYWQgJHtiaW5maWxlfQorIworIyBQ UiBnZGIvOTUzOC4gIFZlcmlmeSB0aGF0IHN5bWxpbmtlZCBleGVjdXRhYmxl IHN0aWxsIGZpbmRzIHRoZSBzZXBhcmF0ZQorIyBkZWJ1Z2luZm8uCisjCitz ZXQgb2xkX3N1YmRpciAke3N1YmRpcn0KK3NldCBzdWJkaXIgJHtzdWJkaXJ9 L3ByOTUzOAorCisjIENsZWFudXAgYW55IHN0YWxlIHN0YXRlLgorcmVtb3Rl X2V4ZWMgYnVpbGQgInJtIC1yZiAke3N1YmRpcn0iCisKK3JlbW90ZV9leGVj IGJ1aWxkICJta2RpciAke3N1YmRpcn0iCityZW1vdGVfZXhlYyBidWlsZCAi bG4gLXMgJHtiaW5maWxlfSAke3N1YmRpcn0iCitjbGVhbl9yZXN0YXJ0ICR7 dGVzdGZpbGV9JHtFWEVFWFR9CitpZiB7ICRnZGJfZmlsZV9jbWRfZGVidWdf aW5mbyAhPSAiZGVidWciIH0gdGhlbiB7CisgICAgZmFpbCAiTm8gZGVidWcg aW5mb3JtYXRpb24gZm91bmQuIgorfQorCisjIFJlc3RvcmUgc3ViZGlyCitz ZXQgc3ViZGlyICR7b2xkX3N1YmRpcn0KKworY2xlYW5fcmVzdGFydCAke3Rl c3RmaWxlfSR7RVhFRVhUfQogaWYgeyAkZ2RiX2ZpbGVfY21kX2RlYnVnX2lu Zm8gIT0gImRlYnVnIiB9IHRoZW4gewogICAgIGZhaWwgIk5vIGRlYnVnIGlu Zm9ybWF0aW9uIGZvdW5kLiIKIH0K --f46d04138a67cbb3a904b65c3f14--