From unknown Fri Jun 20 20:11:03 2025 X-Loop: help-debbugs@gnu.org Subject: bug#37389: [PATCH] Improve reporting of I/O, access errors Resent-From: Paul Eggert Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 12 Sep 2019 08:08:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 37389 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: 37389@debbugs.gnu.org X-Debbugs-Original-To: Emacs bug reports and feature requests Received: via spool by submit@debbugs.gnu.org id=B.156827564217859 (code B ref -1); Thu, 12 Sep 2019 08:08:01 +0000 Received: (at submit) by debbugs.gnu.org; 12 Sep 2019 08:07:22 +0000 Received: from localhost ([127.0.0.1]:43006 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1i8K8P-0004dx-8U for submit@debbugs.gnu.org; Thu, 12 Sep 2019 04:07:22 -0400 Received: from lists.gnu.org ([209.51.188.17]:55936) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1i8K8M-0004dp-Hp for submit@debbugs.gnu.org; Thu, 12 Sep 2019 04:07:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57946) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8K8I-0003GY-HI for bug-gnu-emacs@gnu.org; Thu, 12 Sep 2019 04:07:18 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_50,RCVD_IN_DNSWL_MED, URIBL_BLOCKED autolearn=disabled version=3.3.2 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i8K8E-0005Ny-Bg for bug-gnu-emacs@gnu.org; Thu, 12 Sep 2019 04:07:14 -0400 Received: from zimbra.cs.ucla.edu ([131.179.128.68]:59724) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i8K8D-0005Mh-UG for bug-gnu-emacs@gnu.org; Thu, 12 Sep 2019 04:07:10 -0400 Received: from localhost (localhost [127.0.0.1]) by zimbra.cs.ucla.edu (Postfix) with ESMTP id 005341601EE for ; Thu, 12 Sep 2019 01:07:02 -0700 (PDT) Received: from zimbra.cs.ucla.edu ([127.0.0.1]) by localhost (zimbra.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id naR6XyZDdHsg for ; Thu, 12 Sep 2019 01:06:59 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by zimbra.cs.ucla.edu (Postfix) with ESMTP id E418916022F for ; Thu, 12 Sep 2019 01:06:59 -0700 (PDT) X-Virus-Scanned: amavisd-new at zimbra.cs.ucla.edu Received: from zimbra.cs.ucla.edu ([127.0.0.1]) by localhost (zimbra.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id PlWNLAfloqnR for ; Thu, 12 Sep 2019 01:06:59 -0700 (PDT) Received: from [192.168.1.9] (cpe-23-242-74-103.socal.res.rr.com [23.242.74.103]) by zimbra.cs.ucla.edu (Postfix) with ESMTPSA id AD6E91601EE for ; Thu, 12 Sep 2019 01:06:59 -0700 (PDT) From: Paul Eggert Organization: UCLA Computer Science Department Message-ID: <5d1cd1a5-9d1f-5a32-7a19-c7ffd0880489@cs.ucla.edu> Date: Thu, 12 Sep 2019 01:06:59 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------82F8A0A7664CCE7948FBE02E" Content-Language: en-US X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 131.179.128.68 X-Spam-Score: -1.3 (-) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) This is a multi-part message in MIME format. --------------82F8A0A7664CCE7948FBE02E Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Attached is a patch to fix some problems Emacs has with failing to report I/O and access errors. It affects MS-Windows which I don't use, so I'm filing it as a bug report to give people a chance to review it. The main idea is to signal an error for I/O errors that are not tame errors. Typically ENOENT and ENOTDIR are tame, whereas the rest are more serious. --------------82F8A0A7664CCE7948FBE02E Content-Type: text/plain; charset=UTF-8; name="0001-Improve-reporting-of-I-O-access-errors.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="0001-Improve-reporting-of-I-O-access-errors.txt" RnJvbSBiNjQxYWEwMDg1ZjNlZjRlNzllN2Q3MjE5OGM2N2MzYjYxZGI5ZTQxIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBQYXVsIEVnZ2VydCA8ZWdnZXJ0QGNzLnVjbGEuZWR1 PgpEYXRlOiBUaHUsIDEyIFNlcCAyMDE5IDAwOjU5OjAzIC0wNzAwClN1YmplY3Q6IFtQQVRD SF0gSW1wcm92ZSByZXBvcnRpbmcgb2YgSS9PLCBhY2Nlc3MgZXJyb3JzCk1JTUUtVmVyc2lv bjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOApDb250ZW50 LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CgpFbWFjcyB3YXMgaWdub3JpbmcgSS9PIGFuZCBh Y2Nlc3MgZXJyb3JzIGluIHNldmVyYWwgcGxhY2VzCndoZW4gYWNjZXNzaW5nIGZpbGVzLiAg Rm9yIGV4YW1wbGUsIGl0IHNpbGVudGx5IGlnbm9yZWQgSS9PIG9yCmFjY2VzcyBlcnJvcnMg d2hlbiByZWFkaW5nIHN5bWJvbGljIGxpbmtzLiAgVXBkYXRlIEVtYWNzIHNvCnRoYXQgaXQg c2lnbmFscyBzZXJpb3VzIEkvTyBhbmQgYWNjZXNzIGVycm9ycyBtb3JlIGNvbnNpc3RlbnRs eS4KKiBkb2MvbGlzcHJlZi9maWxlcy50ZXhpIChGaWxlIEF0dHJpYnV0ZXMpOgpmaWxlLWF0 dHJpYnV0ZXMgcmV0dXJucyBuaWwgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsCm5vdCBp ZiBpdCBjYW5ub3QgYmUgYWNjZXNzZWQgZm9yIG90aGVyIHJlYXNvbnMgKHdoZXJlCml0IG1p Z2h0IHNpZ25hbCBhbiBlcnJvcikuCiogc3JjL2RpcmVkLmMgKEZmaWxlX2F0dHJpYnV0ZXMp OiBGaXggZG9jLgooZmlsZV9hdHRyaWJ1dGVzKTogSWYgZnN0YXRhdCBmYWlscywgdXNlIGl0 cyBlcnJubyBpbiByZXBvcnQuClNpZ25hbCBhbiBlcnJvciBmb3Igc2VyaW91cyBwcm9ibGVt cy4KKiBzcmMvZW1hY3MuYyAobG9hZF9wZHVtcF9maW5kX2V4ZWN1dGFibGUpOgpVc2UgZmFj Y2Vzc2F0IHNpbmNlIGNoZWNrX2V4ZWN1dGFibGUgbm8gbG9uZ2VyIGV4aXN0cy4KKiBzcmMv ZmlsZWlvLmMgKGNoZWNrX2ZpbGVfYWNjZXNzKTogTmV3IGZ1bmN0aW9uLAp3aGljaCBzaWdu YWxzIGFuIGVycm9yIGZvciBzZXJpb3VzIHByb2JsZW1zLgooY2hlY2tfZXhpc3RpbmcsIGNo ZWNrX3dyaXRhYmxlKTogVXNlIGl0LgooY2hlY2tfZXhpc3RpbmcpOiBOb3cgYWNjZXB0cyBh bmQgcmV0dXJucyBMaXNwX09iamVjdCwgYW5kCnRha2VzIEVOQ09ERURfRklMRSBhcmcuICBB bGwgY2FsbGVycyBjaGFuZ2VkLgooY2hlY2tfd3JpdGFibGUpOiBOZXcgYWNjZXB0cyBhbmQg cmV0dXJucyBMaXNwX09iamVjdC4KQWxsIGNhbGxlcnMgY2hhbmdlZC4KKGZpbGVfbmFtZV9j YXNlX2luc2Vuc2l0aXZlX3ApOiBOb3cgYWNjZXB0cyBMaXNwX09iamVjdCBmaWxlCmluc3Rl YWQgb2YgY2hhciAqZGVjb2RlZCBmaWxlbmFtZS4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuClNp Z25hbCBhbiBlcnJvciBmb3Igc2VyaW91cyBwcm9ibGVtcy4gIERvbuKAmXQgc3F1aXNoIGEg bG9uZwppbnRvIGFuIGludC4KKGZpbGVfYWNjZXNzaWJsZV9wKTogTmV3IGZ1bmN0aW9uLCBm b3Igc2ltcGxpZnlpbmcgY2FsbGVycwphbmQgc2lnbmFsaW5nIGVycm9ycyBmb3Igc2VyaW91 cyBwcm9ibGVtcy4KKEZmaWxlX2V4ZWN1dGFibGVfcCwgRmZpbGVfcmVhZGFibGVfcCk6IFVz ZSBpdC4KKEZmaWxlX3dyaXRhYmxlX3ApOiBTaW1wbGlmeSBhIGJpdCBieSBleHBsb2l0aW5n IG5ldwpjaGVja193cml0YWJsZSBBUEkuCihlbWFjc19yZWFkbGlua2F0KTogQWNjZXB0IExp c3BfT2JqZWN0IGluc3RlYWQgb2YgY2hhciBjb25zdCAqLgpOZXcgRU5DT0RFRF9GSUxFIGFy Zy4gIEFsbCB1c2VzIGNoYW5nZWQuICBTaWduYWwgZXJyb3IgZm9yCnNlcmlvdXMgcHJvYmxl bXMuCihmaWxlX2RpcmVjdG9yeV9wKTogTmV3IGFyZyBFTkNPREVEX0ZJTEUsIGFuZCByZXR1 cm4gTGlzcF9PYmplY3QKaW5zdGVhZCBvZiBib29sLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4g IFNpZ25hbCBlcnJvciBmb3IKc2VyaW91cyBwcm9ibGVtcy4KKGZpbGVfYWNjZXNzaWJsZV9k aXJlY3RvcnlfcCk6IE5ldyBhcmcgRU5DT0RFRF9GSUxFLAphbmQgcmV0dXJuIExpc3BfT2Jq ZWN0IGluc3RlYWQgb2YgYm9vbC4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuClNpZ25hbCBlcnJv ciBmb3Igc2VyaW91cyBwcm9ibGVtcy4KKHRpbWVfZXJyb3JfdmFsdWUpOiBFQUNDRVMgbWVh bnMgdGhlIHRpbWUgdmFsdWUgaXMgdW5rbm93biwKbm90IG5vbmV4aXN0ZW50LgoqIHNyYy9m aWxlbG9jay5jIChjdXJyZW50X2xvY2tfb3duZXIpOiBVc2UgLTEgYW5kIC0yIGluc3RlYWQg b2YKMSBhbmQgMiBmb3Igc3BlY2lhbCBjYXNlcy4gIFJldHVybiBhIHBvc2l0aXZlIGVycm5v IHZhbHVlIG9uIGZhaWx1cmUuCkFsbCBjYWxsZXJzIGNoYW5nZWQuCihsb2NrX2lmX2ZyZWUp OiBOZWdhdGUgc2Vuc2Ugb2YgcmV0dXJuIHZhbHVlLiAgUmV0dXJuIGEgcG9zaXRpdmUKZXJy bm8gdmFsdWUgb24gZmFpbHVyZS4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCihsb2NrX2ZpbGUp OiBBZGQgYSBGSVhNRSBhYm91dCB0aGUgc2VyaW91cyBlcnJvcnMgdGhhdCBnbwp1bmRpYWdu b3NlZC4KKHVubG9ja19maWxlLCBGZmlsZV9sb2NrZWRfcCk6IFNpZ25hbCBzZXJpb3VzIGZh aWx1cmVzLgoqIHNyYy9scmVhZC5jIChvcGVucCk6IEJlIG1vcmUgY29uc2lzdGVudCBhYm91 dCB3aGljaAplcnJvcnMgYXJlIHNlcmlvdXMuICBFTk9FTlQgYW5kIEVOT1RESVIgYXJlIGJl bmlnbiBpbgphIHBhdGgtc2VhcmNoIGZ1bmN0aW9uOyB0aGUgb3RoZXIgZXJyb3JzIGFyZSBt b3JlIHNlcmlvdXMuCi0tLQogZG9jL2xpc3ByZWYvZmlsZXMudGV4aSB8ICAgMiArLQogc3Jj L2NhbGxwcm9jLmMgICAgICAgICB8ICAgOCArLQogc3JjL2NoYXJzZXQuYyAgICAgICAgICB8 ICAgMiArLQogc3JjL2RpcmVkLmMgICAgICAgICAgICB8ICAxMyArLQogc3JjL2VtYWNzLmMg ICAgICAgICAgICB8ICAgMiArLQogc3JjL2ZpbGVpby5jICAgICAgICAgICB8IDI4NCArKysr KysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLQogc3JjL2ZpbGVsb2NrLmMg ICAgICAgICB8ICA4OCArKysrKystLS0tLS0tCiBzcmMvbGlzcC5oICAgICAgICAgICAgIHwg ICA3ICstCiBzcmMvbHJlYWQuYyAgICAgICAgICAgIHwgICA4ICstCiA5IGZpbGVzIGNoYW5n ZWQsIDIxOSBpbnNlcnRpb25zKCspLCAxOTUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEv ZG9jL2xpc3ByZWYvZmlsZXMudGV4aSBiL2RvYy9saXNwcmVmL2ZpbGVzLnRleGkKaW5kZXgg MThhMWY0OTA4ZC4uZGEyZTFlOTBhZSAxMDA2NDQKLS0tIGEvZG9jL2xpc3ByZWYvZmlsZXMu dGV4aQorKysgYi9kb2MvbGlzcHJlZi9maWxlcy50ZXhpCkBAIC0xMjYyLDcgKzEyNjIsNyBA QCBGaWxlIEF0dHJpYnV0ZXMKIEBkZWZ1biBmaWxlLWF0dHJpYnV0ZXMgZmlsZW5hbWUgJm9w dGlvbmFsIGlkLWZvcm1hdAogQGFuY2hvcntEZWZpbml0aW9uIG9mIGZpbGUtYXR0cmlidXRl c30KIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGxpc3Qgb2YgYXR0cmlidXRlcyBvZiBmaWxl IEB2YXJ7ZmlsZW5hbWV9LiAgSWYKLXRoZSBzcGVjaWZpZWQgZmlsZSdzIGF0dHJpYnV0ZXMg Y2Fubm90IGJlIGFjY2Vzc2VkLCBpdCByZXR1cm5zIEBjb2Rle25pbH0uCit0aGUgc3BlY2lm aWVkIGZpbGUgZG9lcyBub3QgZXhpc3QsIGl0IHJldHVybnMgQGNvZGV7bmlsfS4KIFRoaXMg ZnVuY3Rpb24gZG9lcyBub3QgZm9sbG93IHN5bWJvbGljIGxpbmtzLgogVGhlIG9wdGlvbmFs IHBhcmFtZXRlciBAdmFye2lkLWZvcm1hdH0gc3BlY2lmaWVzIHRoZSBwcmVmZXJyZWQgZm9y bWF0CiBvZiBhdHRyaWJ1dGVzIEBhY3Jvbnlte1VJRH0gYW5kIEBhY3Jvbnlte0dJRH0gKHNl ZSBiZWxvdyktLS10aGUKZGlmZiAtLWdpdCBhL3NyYy9jYWxscHJvYy5jIGIvc3JjL2NhbGxw cm9jLmMKaW5kZXggNDQ3M2IxOWEyOS4uY2M5YmU1NjYxYSAxMDA2NDQKLS0tIGEvc3JjL2Nh bGxwcm9jLmMKKysrIGIvc3JjL2NhbGxwcm9jLmMKQEAgLTExOSw3ICsxMTksNyBAQCBlbmNv ZGVfY3VycmVudF9kaXJlY3RvcnkgKHZvaWQpCiAgIGRpciA9IGV4cGFuZF9hbmRfZGlyX3Rv X2ZpbGUgKGRpcik7CiAgIGRpciA9IEVOQ09ERV9GSUxFIChyZW1vdmVfc2xhc2hfY29sb24g KGRpcikpOwogCi0gIGlmICghIGZpbGVfYWNjZXNzaWJsZV9kaXJlY3RvcnlfcCAoZGlyKSkK KyAgaWYgKE5JTFAgKGZpbGVfYWNjZXNzaWJsZV9kaXJlY3RvcnlfcCAoY3VyZGlyLCBkaXIp KSkKICAgICByZXBvcnRfZmlsZV9lcnJvciAoIlNldHRpbmcgY3VycmVudCBkaXJlY3Rvcnki LCBjdXJkaXIpOwogCiAgIHJldHVybiBkaXI7CkBAIC0xNTgxLDEyICsxNTgxLDEyIEBAIGlu aXRfY2FsbHByb2MgKHZvaWQpCiAgIGlmICghd2lsbF9kdW1wX3AgKCkpCiAgICAgewogICAg ICAgdGVtcGRpciA9IEZkaXJlY3RvcnlfZmlsZV9uYW1lIChWZXhlY19kaXJlY3RvcnkpOwot ICAgICAgaWYgKCEgZmlsZV9hY2Nlc3NpYmxlX2RpcmVjdG9yeV9wICh0ZW1wZGlyKSkKKyAg ICAgIGlmIChOSUxQIChmaWxlX2FjY2Vzc2libGVfZGlyZWN0b3J5X3AgKHRlbXBkaXIsIHRl bXBkaXIpKSkKIAlkaXJfd2FybmluZyAoImFyY2gtZGVwZW5kZW50IGRhdGEgZGlyIiwgVmV4 ZWNfZGlyZWN0b3J5KTsKICAgICB9CiAKICAgdGVtcGRpciA9IEZkaXJlY3RvcnlfZmlsZV9u YW1lIChWZGF0YV9kaXJlY3RvcnkpOwotICBpZiAoISBmaWxlX2FjY2Vzc2libGVfZGlyZWN0 b3J5X3AgKHRlbXBkaXIpKQorICBpZiAoTklMUCAoZmlsZV9hY2Nlc3NpYmxlX2RpcmVjdG9y eV9wICh0ZW1wZGlyLCB0ZW1wZGlyKSkpCiAgICAgZGlyX3dhcm5pbmcgKCJhcmNoLWluZGVw ZW5kZW50IGRhdGEgZGlyIiwgVmRhdGFfZGlyZWN0b3J5KTsKIAogICBzaCA9IGdldGVudiAo IlNIRUxMIik7CkBAIC0xNTk2LDcgKzE1OTYsNyBAQCBpbml0X2NhbGxwcm9jICh2b2lkKQog ICBpZiAoUEFUSF9HQU1FKQogICAgIHsKICAgICAgIExpc3BfT2JqZWN0IHBhdGhfZ2FtZSA9 IGJ1aWxkX3VuaWJ5dGVfc3RyaW5nIChQQVRIX0dBTUUpOwotICAgICAgaWYgKGZpbGVfYWNj ZXNzaWJsZV9kaXJlY3RvcnlfcCAocGF0aF9nYW1lKSkKKyAgICAgIGlmICghTklMUCAoZmls ZV9hY2Nlc3NpYmxlX2RpcmVjdG9yeV9wIChwYXRoX2dhbWUsIHBhdGhfZ2FtZSkpKQogCWdh bWVkaXIgPSBwYXRoX2dhbWU7CiAgICAgfQogICBWc2hhcmVkX2dhbWVfc2NvcmVfZGlyZWN0 b3J5ID0gZ2FtZWRpcjsKZGlmZiAtLWdpdCBhL3NyYy9jaGFyc2V0LmMgYi9zcmMvY2hhcnNl dC5jCmluZGV4IDhjNTQzODFkYzQuLjkzNTM3ODZjY2EgMTAwNjQ0Ci0tLSBhL3NyYy9jaGFy c2V0LmMKKysrIGIvc3JjL2NoYXJzZXQuYwpAQCAtMjI4OCw3ICsyMjg4LDcgQEAgaW5pdF9j aGFyc2V0ICh2b2lkKQogewogICBMaXNwX09iamVjdCB0ZW1wZGlyOwogICB0ZW1wZGlyID0g RmV4cGFuZF9maWxlX25hbWUgKGJ1aWxkX3N0cmluZyAoImNoYXJzZXRzIiksIFZkYXRhX2Rp cmVjdG9yeSk7Ci0gIGlmICghIGZpbGVfYWNjZXNzaWJsZV9kaXJlY3RvcnlfcCAodGVtcGRp cikpCisgIGlmIChOSUxQIChmaWxlX2FjY2Vzc2libGVfZGlyZWN0b3J5X3AgKHRlbXBkaXIs IHRlbXBkaXIpKSkKICAgICB7CiAgICAgICAvKiBUaGlzIHVzZWQgdG8gYmUgbm9uLWZhdGFs IChkaXJfd2FybmluZyksIGJ1dCBpdCBzaG91bGQgbm90CiAgICAgICAgICBoYXBwZW4sIGFu ZCBpZiBpdCBkb2VzIHNvb25lciBvciBsYXRlciBpdCB3aWxsIGNhdXNlIHNvbWUKZGlmZiAt LWdpdCBhL3NyYy9kaXJlZC5jIGIvc3JjL2RpcmVkLmMKaW5kZXggY2VjNzlhYjQ2Yi4uMzc4 OWMyZDdlNSAxMDA2NDQKLS0tIGEvc3JjL2RpcmVkLmMKKysrIGIvc3JjL2RpcmVkLmMKQEAg LTg1MSw3ICs4NTEsNyBAQCBzdGF0X2duYW1lIChzdHJ1Y3Qgc3RhdCAqc3QpCiAKIERFRlVO ICgiZmlsZS1hdHRyaWJ1dGVzIiwgRmZpbGVfYXR0cmlidXRlcywgU2ZpbGVfYXR0cmlidXRl cywgMSwgMiwgMCwKICAgICAgICBkb2M6IC8qIFJldHVybiBhIGxpc3Qgb2YgYXR0cmlidXRl cyBvZiBmaWxlIEZJTEVOQU1FLgotVmFsdWUgaXMgbmlsIGlmIHNwZWNpZmllZCBmaWxlIGNh bm5vdCBiZSBvcGVuZWQuCitWYWx1ZSBpcyBuaWwgaWYgc3BlY2lmaWVkIGZpbGUgZG9lcyBu b3QgZXhpc3QuCiAKIElELUZPUk1BVCBzcGVjaWZpZXMgdGhlIHByZWZlcnJlZCBmb3JtYXQg b2YgYXR0cmlidXRlcyB1aWQgYW5kIGdpZCAoc2VlCiBiZWxvdykgLSB2YWxpZCB2YWx1ZXMg YXJlIGBzdHJpbmcnIGFuZCBgaW50ZWdlcicuICBUaGUgbGF0dGVyIGlzIHRoZQpAQCAtOTcx LDE1ICs5NzEsMTggQEAgZmlsZV9hdHRyaWJ1dGVzIChpbnQgZmQsIGNoYXIgY29uc3QgKm5h bWUsCiAJIGluZm9ybWF0aW9uIHRvIGJlIGFjY3VyYXRlLiAgKi8KICAgICAgIHczMl9zdGF0 X2dldF9vd25lcl9ncm91cCA9IDE7CiAjZW5kaWYKLSAgICAgIGlmIChmc3RhdGF0IChmZCwg bmFtZSwgJnMsIEFUX1NZTUxJTktfTk9GT0xMT1cpID09IDApCi0JZXJyID0gMDsKKyAgICAg IGVyciA9IGZzdGF0YXQgKGZkLCBuYW1lLCAmcywgQVRfU1lNTElOS19OT0ZPTExPVykgPT0g MCA/IDAgOiBlcnJubzsKICNpZmRlZiBXSU5ET1dTTlQKICAgICAgIHczMl9zdGF0X2dldF9v d25lcl9ncm91cCA9IDA7CiAjZW5kaWYKICAgICB9CiAKICAgaWYgKGVyciAhPSAwKQotICAg IHJldHVybiB1bmJpbmRfdG8gKGNvdW50LCBRbmlsKTsKKyAgICB7CisgICAgICBpZiAoZXJy ID09IEVOT0VOVCB8fCBlcnIgPT0gRU5PVERJUikKKwlyZXR1cm4gdW5iaW5kX3RvIChjb3Vu dCwgUW5pbCk7CisgICAgICByZXBvcnRfZmlsZV9lcnJubyAoIkdldHRpbmcgYXR0cmlidXRl cyIsIGZpbGVuYW1lLCBlcnIpOworICAgIH0KIAogICBMaXNwX09iamVjdCBmaWxlX3R5cGU7 CiAgIGlmIChTX0lTTE5LIChzLnN0X21vZGUpKQpAQCAtOTg4LDcgKzk5MSw3IEBAIGZpbGVf YXR0cmlidXRlcyAoaW50IGZkLCBjaGFyIGNvbnN0ICpuYW1lLAogCSBzeW1saW5rIGlzIHJl cGxhY2VkIGJldHdlZW4gdGhlIGNhbGwgdG8gZnN0YXRhdCBhbmQgdGhlIGNhbGwKIAkgdG8g ZW1hY3NfcmVhZGxpbmthdC4gIERldGVjdCB0aGlzIHJhY2UgdW5sZXNzIHRoZSByZXBsYWNl bWVudAogCSBpcyBhbHNvIGEgc3ltbGluay4gICovCi0gICAgICBmaWxlX3R5cGUgPSBlbWFj c19yZWFkbGlua2F0IChmZCwgbmFtZSk7CisgICAgICBmaWxlX3R5cGUgPSBlbWFjc19yZWFk bGlua2F0IChmZCwgZmlsZW5hbWUsIG5hbWUpOwogICAgICAgaWYgKE5JTFAgKGZpbGVfdHlw ZSkpCiAJcmV0dXJuIHVuYmluZF90byAoY291bnQsIFFuaWwpOwogICAgIH0KZGlmZiAtLWdp dCBhL3NyYy9lbWFjcy5jIGIvc3JjL2VtYWNzLmMKaW5kZXggNWE1MjY2ODdiMS4uMjYzMDZm N2NmZSAxMDA2NDQKLS0tIGEvc3JjL2VtYWNzLmMKKysrIGIvc3JjL2VtYWNzLmMKQEAgLTc0 Niw3ICs3NDYsNyBAQCBsb2FkX3BkdW1wX2ZpbmRfZXhlY3V0YWJsZSAoY2hhciBjb25zdCAq YXJndjAsIHB0cmRpZmZfdCAqY2FuZGlkYXRlX3NpemUpCiAgICAgICBjYW5kaWRhdGVbcGF0 aF9wYXJ0X2xlbmd0aF0gPSBESVJFQ1RPUllfU0VQOwogICAgICAgbWVtY3B5IChjYW5kaWRh dGUgKyBwYXRoX3BhcnRfbGVuZ3RoICsgMSwgYXJndjAsIGFyZ3YwX2xlbmd0aCArIDEpOwog ICAgICAgc3RydWN0IHN0YXQgc3Q7Ci0gICAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZSAoY2Fu ZGlkYXRlKQorICAgICAgaWYgKGZhY2Nlc3NhdCAoQVRfRkRDV0QsIGNhbmRpZGF0ZSwgWF9P SywgQVRfRUFDQ0VTUykgPT0gMAogCSAgJiYgc3RhdCAoY2FuZGlkYXRlLCAmc3QpID09IDAg JiYgU19JU1JFRyAoc3Quc3RfbW9kZSkpCiAJcmV0dXJuIGNhbmRpZGF0ZTsKICAgICAgICpj YW5kaWRhdGUgPSAnXDAnOwpkaWZmIC0tZ2l0IGEvc3JjL2ZpbGVpby5jIGIvc3JjL2ZpbGVp by5jCmluZGV4IGNiYzBjODljZjMuLjMyNjdiYTg1MDUgMTAwNjQ0Ci0tLSBhL3NyYy9maWxl aW8uYworKysgYi9zcmMvZmlsZWlvLmMKQEAgLTE0MCw1MyArMTQwLDY0IEBAICNkZWZpbmUg RFJJVkVfTEVUVEVSKHgpIGNfdG9sb3dlciAoeCkKIAkJICAgICBzdHJ1Y3QgY29kaW5nX3N5 c3RlbSAqKTsKIAogDAotLyogUmV0dXJuIHRydWUgaWYgRklMRU5BTUUgZXhpc3RzLCBvdGhl cndpc2UgcmV0dXJuIGZhbHNlIGFuZCBzZXQgZXJybm8uICAqLworLyogVGVzdCB3aGV0aGVy IEZJTEUgaXMgYWNjZXNzaWJsZSBmb3IgQU1PREUuCisgICBFTkNPREVEX0ZJTEUgaXMgRklM RSwgZW5jb2RlZCBmb3IgdGhlIHN5c3RlbS4KKyAgIFJldHVybiB0IGlmIGFjY2Vzc2libGUs IG5pbCAoc2V0dGluZyBlcnJubykgaWYgYWNjZXNzIGlzIGRlbmllZC4KKyAgIFNpZ25hbCBh biBlcnJvciBpZiBhY2Nlc3NpYmlsaXR5IGNhbm5vdCBiZSBkZXRlcm1pbmVkLiAgKi8KIAot c3RhdGljIGJvb2wKLWNoZWNrX2V4aXN0aW5nIChjb25zdCBjaGFyICpmaWxlbmFtZSkKK3N0 YXRpYyBMaXNwX09iamVjdAorY2hlY2tfZmlsZV9hY2Nlc3MgKExpc3BfT2JqZWN0IGZpbGUs IGNoYXIgY29uc3QgKmVuY29kZWRfZmlsZSwgaW50IGFtb2RlKQogewotICByZXR1cm4gZmFj Y2Vzc2F0IChBVF9GRENXRCwgZmlsZW5hbWUsIEZfT0ssIEFUX0VBQ0NFU1MpID09IDA7Cisg IGlmIChmYWNjZXNzYXQgKEFUX0ZEQ1dELCBlbmNvZGVkX2ZpbGUsIGFtb2RlLCBBVF9FQUND RVNTKSA9PSAwKQorICAgIHJldHVybiBRdDsKKyAgaW50IGVyciA9IGVycm5vOworCisjaWZk ZWYgQ1lHV0lOCisgIC8qIFJldHVybiBzdWNjZXNzIGlmIGZhY2Nlc3NhdCBmYWlsZWQgYmVj YXVzZSBDeWd3aW4gY291bGRuJ3QKKyAgICAgZGV0ZXJtaW5lIHRoZSBmaWxlJ3MgVUlEIG9y IEdJRC4gICovCisgIHN0cnVjdCBzdGF0IHN0OworICBpZiAoc3RhdCAoZW5jb2RlZF9maWxl LCAmc3QpID09IDAgJiYgKHN0LnN0X3VpZCA9PSAtMSB8fCBzdC5zdF9naWQgPT0gLTEpKQor ICAgIHJldHVybiBRdDsKKyNlbmRpZgorCisgIGlmIChlcnIgPT0gRU5PRU5UIHx8IGVyciA9 PSBFTk9URElSIHx8IGVyciA9PSBFUk9GUyB8fCBlcnIgPT0gRVRYVEJTWQorICAgICAgfHwg KGVyciA9PSBFQUNDRVMgJiYgYW1vZGUgIT0gRl9PSworCSAgJiYgZmFjY2Vzc2F0IChBVF9G RENXRCwgZW5jb2RlZF9maWxlLCBGX09LLCBBVF9FQUNDRVNTKSA9PSAwKSkKKyAgICB7Cisg ICAgICBlcnJubyA9IGVycjsKKyAgICAgIHJldHVybiBRbmlsOworICAgIH0KKyAgcmVwb3J0 X2ZpbGVfZXJybm8gKCJUZXN0aW5nIGZpbGUiLCBmaWxlLCBlcnIpOwogfQogCi0vKiBSZXR1 cm4gdHJ1ZSBpZiBmaWxlIEZJTEVOQU1FIGV4aXN0cyBhbmQgY2FuIGJlIGV4ZWN1dGVkLiAg Ki8KKy8qIFJldHVybiB0IGlmIEZJTEUgZXhpc3RzLCBuaWwgKHNldHRpbmcgZXJybm8pIGlm IG5vdC4gIEVOQ09ERURfRklMRQorICAgaXMgRklMRSwgZW5jb2RlZCBmb3IgdGhlIHN5c3Rl bS4gIFNpZ25hbCBhbiBlcnJvciBpZiB0aGUgcmVzdWx0CisgICBjYW5ub3QgYmUgZGV0ZXJt aW5lZC4gICovCiAKLWJvb2wKLWNoZWNrX2V4ZWN1dGFibGUgKGNoYXIgKmZpbGVuYW1lKQor c3RhdGljIExpc3BfT2JqZWN0CitjaGVja19leGlzdGluZyAoTGlzcF9PYmplY3QgZmlsZSwg Y2hhciBjb25zdCAqZW5jb2RlZF9maWxlKQogewotICByZXR1cm4gZmFjY2Vzc2F0IChBVF9G RENXRCwgZmlsZW5hbWUsIFhfT0ssIEFUX0VBQ0NFU1MpID09IDA7CisgIHJldHVybiBjaGVj a19maWxlX2FjY2VzcyAoZmlsZSwgZW5jb2RlZF9maWxlLCBGX09LKTsKIH0KIAotLyogUmV0 dXJuIHRydWUgaWYgZmlsZSBGSUxFTkFNRSBleGlzdHMgYW5kIGNhbiBiZSBhY2Nlc3NlZAot ICAgYWNjb3JkaW5nIHRvIEFNT0RFLCB3aGljaCBzaG91bGQgaW5jbHVkZSBXX09LLgotICAg T24gZmFpbHVyZSwgcmV0dXJuIGZhbHNlIGFuZCBzZXQgZXJybm8uICAqLworLyogUmV0dXJu IHQgaWYgRklMRSBleGlzdHMgYW5kIGNhbiBiZSBhY2Nlc3NlZCwgbmlsIChzZXR0aW5nIGVy cm5vKSBpZiBub3QuCisgICBUaGUgYWNjZXNzIG1vZGUgaXMgQU1PREUsIHdoaWNoIHNob3Vs ZCBpbmNsdWRlIFdfT0suCisgICBTaWduYWwgYW4gZXJyb3IgaWYgdGhlIHJlc3VsdCBjYW5u b3QgYmUgZGV0ZXJtaW5lZC4gICovCiAKLXN0YXRpYyBib29sCi1jaGVja193cml0YWJsZSAo Y29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBhbW9kZSkKK3N0YXRpYyBMaXNwX09iamVjdAor Y2hlY2tfd3JpdGFibGUgKExpc3BfT2JqZWN0IGZpbGUsIGludCBhbW9kZSkKIHsKKyAgY2hh ciAqZmlsZW5hbWUgPSBTU0RBVEEgKEVOQ09ERV9GSUxFIChmaWxlKSk7CiAjaWZkZWYgTVNE T1MKICAgLyogRklYTUU6IGFuIGZhY2Nlc3NhdCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUg YWRkZWQgdG8gdGhlCiAgICAgIERPUy9XaW5kb3dzIHBvcnRzIGFuZCB0aGlzICNpZmRlZiBi cmFuY2ggc2hvdWxkIGJlIHJlbW92ZWQuICAqLwogICBzdHJ1Y3Qgc3RhdCBzdDsKICAgaWYg KHN0YXQgKGZpbGVuYW1lLCAmc3QpIDwgMCkKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4g UW5pbDsKICAgZXJybm8gPSBFUEVSTTsKLSAgcmV0dXJuIChzdC5zdF9tb2RlICYgU19JV1JJ VEUgfHwgU19JU0RJUiAoc3Quc3RfbW9kZSkpOworICByZXR1cm4gc3Quc3RfbW9kZSAmIFNf SVdSSVRFIHx8IFNfSVNESVIgKHN0LnN0X21vZGUpID8gUXQgOiBRbmlsOwogI2Vsc2UgLyog bm90IE1TRE9TICovCi0gIGJvb2wgcmVzID0gZmFjY2Vzc2F0IChBVF9GRENXRCwgZmlsZW5h bWUsIGFtb2RlLCBBVF9FQUNDRVNTKSA9PSAwOwotI2lmZGVmIENZR1dJTgotICAvKiBmYWNj ZXNzYXQgbWF5IGhhdmUgcmV0dXJuZWQgZmFpbHVyZSBiZWNhdXNlIEN5Z3dpbiBjb3VsZG4n dAotICAgICBkZXRlcm1pbmUgdGhlIGZpbGUncyBVSUQgb3IgR0lEOyBpZiBzbywgd2UgcmV0 dXJuIHN1Y2Nlc3MuICAqLwotICBpZiAoIXJlcykKLSAgICB7Ci0gICAgICBpbnQgZmFjY2Vz c2F0X2Vycm5vID0gZXJybm87Ci0gICAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICAgIGlmIChz dGF0IChmaWxlbmFtZSwgJnN0KSA8IDApCi0gICAgICAgIHJldHVybiAwOwotICAgICAgcmVz ID0gKHN0LnN0X3VpZCA9PSAtMSB8fCBzdC5zdF9naWQgPT0gLTEpOwotICAgICAgZXJybm8g PSBmYWNjZXNzYXRfZXJybm87Ci0gICAgfQotI2VuZGlmIC8qIENZR1dJTiAqLwotICByZXR1 cm4gcmVzOworICByZXR1cm4gY2hlY2tfZmlsZV9hY2Nlc3MgKGZpbGUsIGZpbGVuYW1lLCBh bW9kZSk7CiAjZW5kaWYgLyogbm90IE1TRE9TICovCiB9CiAMCkBAIC0yMzgyLDcgKzIzOTMs NyBAQCBpbnRlcm5hbF9kZWxldGVfZmlsZSAoTGlzcF9PYmplY3QgZmlsZW5hbWUpCiAgICBk ZXRlY3QgdGhpcz8gICovCiAKIHN0YXRpYyBib29sCi1maWxlX25hbWVfY2FzZV9pbnNlbnNp dGl2ZV9wIChjb25zdCBjaGFyICpmaWxlbmFtZSkKK2ZpbGVfbmFtZV9jYXNlX2luc2Vuc2l0 aXZlX3AgKExpc3BfT2JqZWN0IGZpbGUpCiB7CiAgIC8qIFVzZSBwYXRoY29uZiB3aXRoIF9Q Q19DQVNFX0lOU0VOU0lUSVZFIG9yIF9QQ19DQVNFX1NFTlNJVElWRSBpZgogICAgICB0aG9z ZSBmbGFncyBhcmUgYXZhaWxhYmxlLiAgQXMgb2YgdGhpcyB3cml0aW5nICgyMDE3LTA1LTIw KSwKQEAgLTIzOTAsMTQgKzI0MDEsMTkgQEAgZmlsZV9uYW1lX2Nhc2VfaW5zZW5zaXRpdmVf cCAoY29uc3QgY2hhciAqZmlsZW5hbWUpCiAgICAgIHdpdGggQ3lnd2luLTIuNi4xKSwgYW5k IG1hY09TIGlzIHRoZSBvbmx5IHBsYXRmb3JtIGtub3duIHRvCiAgICAgIHN1cHBvcnQgdGhl IGxhdHRlci4gICovCiAKLSNpZmRlZiBfUENfQ0FTRV9JTlNFTlNJVElWRQotICBpbnQgcmVz ID0gcGF0aGNvbmYgKGZpbGVuYW1lLCBfUENfQ0FTRV9JTlNFTlNJVElWRSk7CisjaWYgZGVm aW5lZCBfUENfQ0FTRV9JTlNFTlNJVElWRSB8fCBkZWZpbmVkIF9QQ19DQVNFX1NFTlNJVElW RQorICBjaGFyICpmaWxlbmFtZSA9IFNTREFUQSAoRU5DT0RFX0ZJTEUgKGZpbGUpKTsKKyMg aWZkZWYgX1BDX0NBU0VfSU5TRU5TSVRJVkUKKyAgbG9uZyBpbnQgcmVzID0gcGF0aGNvbmYg KGZpbGVuYW1lLCBfUENfQ0FTRV9JTlNFTlNJVElWRSk7CiAgIGlmIChyZXMgPj0gMCkKICAg ICByZXR1cm4gcmVzID4gMDsKLSNlbGlmIGRlZmluZWQgX1BDX0NBU0VfU0VOU0lUSVZFCi0g IGludCByZXMgPSBwYXRoY29uZiAoZmlsZW5hbWUsIF9QQ19DQVNFX1NFTlNJVElWRSk7Cisj IGVsc2UKKyAgbG9uZyBpbnQgcmVzID0gcGF0aGNvbmYgKGZpbGVuYW1lLCBfUENfQ0FTRV9T RU5TSVRJVkUpOwogICBpZiAocmVzID49IDApCiAgICAgcmV0dXJuIHJlcyA9PSAwOworIyBl bmRpZgorICBpZiAoZXJybm8gIT0gRUlOVkFMKQorICAgIHJlcG9ydF9maWxlX2Vycm9yICgi VGVzdGluZyBmaWxlIiwgZmlsZSk7CiAjZW5kaWYKIAogI2lmIGRlZmluZWQgQ1lHV0lOIHx8 IGRlZmluZWQgRE9TX05UCkBAIC0yNDM5LDggKzI0NTUsNyBAQCBERUZVTiAoImZpbGUtbmFt ZS1jYXNlLWluc2Vuc2l0aXZlLXAiLCBGZmlsZV9uYW1lX2Nhc2VfaW5zZW5zaXRpdmVfcCwK IAkgIGZpbGVuYW1lID0gbmV3bmFtZTsKIAl9CiAgICAgfQotICBmaWxlbmFtZSA9IEVOQ09E RV9GSUxFIChmaWxlbmFtZSk7Ci0gIHJldHVybiBmaWxlX25hbWVfY2FzZV9pbnNlbnNpdGl2 ZV9wIChTU0RBVEEgKGZpbGVuYW1lKSkgPyBRdCA6IFFuaWw7CisgIHJldHVybiBmaWxlX25h bWVfY2FzZV9pbnNlbnNpdGl2ZV9wIChmaWxlbmFtZSkgPyBRdCA6IFFuaWw7CiB9CiAKIERF RlVOICgicmVuYW1lLWZpbGUiLCBGcmVuYW1lX2ZpbGUsIFNyZW5hbWVfZmlsZSwgMiwgMywK QEAgLTI1NDYsNyArMjU2MSw3IEBAIERFRlVOICgicmVuYW1lLWZpbGUiLCBGcmVuYW1lX2Zp bGUsIFNyZW5hbWVfZmlsZSwgMiwgMywKICAgICB7CiAgICAgICBMaXNwX09iamVjdCBzeW1s aW5rX3RhcmdldAogCT0gKFNfSVNMTksgKGZpbGVfc3Quc3RfbW9kZSkKLQkgICA/IGVtYWNz X3JlYWRsaW5rYXQgKEFUX0ZEQ1dELCBTU0RBVEEgKGVuY29kZWRfZmlsZSkpCisJICAgPyBl bWFjc19yZWFkbGlua2F0IChBVF9GRENXRCwgZmlsZSwgU1NEQVRBIChlbmNvZGVkX2ZpbGUp KQogCSAgIDogUW5pbCk7CiAgICAgICBpZiAoIU5JTFAgKHN5bWxpbmtfdGFyZ2V0KSkKIAlG bWFrZV9zeW1ib2xpY19saW5rIChzeW1saW5rX3RhcmdldCwgbmV3bmFtZSwgb2tfaWZfYWxy ZWFkeV9leGlzdHMpOwpAQCAtMjcxNyw5ICsyNzMyLDIwIEBAIERFRlVOICgiZmlsZS1leGlz dHMtcCIsIEZmaWxlX2V4aXN0c19wLCBTZmlsZV9leGlzdHNfcCwgMSwgMSwgMCwKICAgICAg IHJldHVybiByZXN1bHQ7CiAgICAgfQogCi0gIGFic25hbWUgPSBFTkNPREVfRklMRSAoYWJz bmFtZSk7CisgIHJldHVybiBjaGVja19leGlzdGluZyAoYWJzbmFtZSwgU1NEQVRBIChFTkNP REVfRklMRSAoYWJzbmFtZSkpKTsKK30KKworLyogUmV0dXJuIHQgaWYgRklMRSBleGlzdHMg YW5kIGlzIGFjY2Vzc2libGUgdmlhIE9QRVJBVElPTiBhbmQgQU1PREUsCisgICBuaWwgaWYg bm90LiAgU2lnbmFsIGFuIGVycm9yIGlmIHRoZSByZXN1bHQgY2Fubm90IGJlIGRldGVybWlu ZWQuICAqLwogCi0gIHJldHVybiBjaGVja19leGlzdGluZyAoU1NEQVRBIChhYnNuYW1lKSkg PyBRdCA6IFFuaWw7CitzdGF0aWMgTGlzcF9PYmplY3QKK2ZpbGVfYWNjZXNzaWJsZV9wIChM aXNwX09iamVjdCBmaWxlLCBMaXNwX09iamVjdCBvcGVyYXRpb24sIGludCBhbW9kZSkKK3sK KyAgTGlzcF9PYmplY3QgYWJzbmFtZSA9IEZleHBhbmRfZmlsZV9uYW1lIChmaWxlLCBRbmls KTsKKyAgTGlzcF9PYmplY3QgaGFuZGxlciA9IEZmaW5kX2ZpbGVfbmFtZV9oYW5kbGVyIChh YnNuYW1lLCBvcGVyYXRpb24pOworICBpZiAoIU5JTFAgKGhhbmRsZXIpKQorICAgIHJldHVy biBjYWxsMiAoaGFuZGxlciwgb3BlcmF0aW9uLCBhYnNuYW1lKTsKKyAgcmV0dXJuIGNoZWNr X2ZpbGVfYWNjZXNzIChhYnNuYW1lLCBTU0RBVEEgKEVOQ09ERV9GSUxFIChhYnNuYW1lKSks IGFtb2RlKTsKIH0KIAogREVGVU4gKCJmaWxlLWV4ZWN1dGFibGUtcCIsIEZmaWxlX2V4ZWN1 dGFibGVfcCwgU2ZpbGVfZXhlY3V0YWJsZV9wLCAxLCAxLCAwLApAQCAtMjcyOSwyMSArMjc1 NSw3IEBAIERFRlVOICgiZmlsZS1leGVjdXRhYmxlLXAiLCBGZmlsZV9leGVjdXRhYmxlX3As IFNmaWxlX2V4ZWN1dGFibGVfcCwgMSwgMSwgMCwKIHB1cnBvc2UsIHRob3VnaC4pICAqLykK ICAgKExpc3BfT2JqZWN0IGZpbGVuYW1lKQogewotICBMaXNwX09iamVjdCBhYnNuYW1lOwot ICBMaXNwX09iamVjdCBoYW5kbGVyOwotCi0gIENIRUNLX1NUUklORyAoZmlsZW5hbWUpOwot ICBhYnNuYW1lID0gRmV4cGFuZF9maWxlX25hbWUgKGZpbGVuYW1lLCBRbmlsKTsKLQotICAv KiBJZiB0aGUgZmlsZSBuYW1lIGhhcyBzcGVjaWFsIGNvbnN0cnVjdHMgaW4gaXQsCi0gICAg IGNhbGwgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZSBuYW1lIGhhbmRsZXIuICAqLwotICBoYW5k bGVyID0gRmZpbmRfZmlsZV9uYW1lX2hhbmRsZXIgKGFic25hbWUsIFFmaWxlX2V4ZWN1dGFi bGVfcCk7Ci0gIGlmICghTklMUCAoaGFuZGxlcikpCi0gICAgcmV0dXJuIGNhbGwyIChoYW5k bGVyLCBRZmlsZV9leGVjdXRhYmxlX3AsIGFic25hbWUpOwotCi0gIGFic25hbWUgPSBFTkNP REVfRklMRSAoYWJzbmFtZSk7Ci0KLSAgcmV0dXJuIChjaGVja19leGVjdXRhYmxlIChTU0RB VEEgKGFic25hbWUpKSA/IFF0IDogUW5pbCk7CisgIHJldHVybiBmaWxlX2FjY2Vzc2libGVf cCAoZmlsZW5hbWUsIFFmaWxlX2V4ZWN1dGFibGVfcCwgWF9PSyk7CiB9CiAKIERFRlVOICgi ZmlsZS1yZWFkYWJsZS1wIiwgRmZpbGVfcmVhZGFibGVfcCwgU2ZpbGVfcmVhZGFibGVfcCwg MSwgMSwgMCwKQEAgLTI3NTEsMjggKzI3NjMsMTQgQEAgREVGVU4gKCJmaWxlLXJlYWRhYmxl LXAiLCBGZmlsZV9yZWFkYWJsZV9wLCBTZmlsZV9yZWFkYWJsZV9wLCAxLCAxLCAwLAogU2Vl IGFsc28gYGZpbGUtZXhpc3RzLXAnIGFuZCBgZmlsZS1hdHRyaWJ1dGVzJy4gICovKQogICAo TGlzcF9PYmplY3QgZmlsZW5hbWUpCiB7Ci0gIExpc3BfT2JqZWN0IGFic25hbWU7Ci0gIExp c3BfT2JqZWN0IGhhbmRsZXI7Ci0KLSAgQ0hFQ0tfU1RSSU5HIChmaWxlbmFtZSk7Ci0gIGFi c25hbWUgPSBGZXhwYW5kX2ZpbGVfbmFtZSAoZmlsZW5hbWUsIFFuaWwpOwotCi0gIC8qIElm IHRoZSBmaWxlIG5hbWUgaGFzIHNwZWNpYWwgY29uc3RydWN0cyBpbiBpdCwKLSAgICAgY2Fs bCB0aGUgY29ycmVzcG9uZGluZyBmaWxlIG5hbWUgaGFuZGxlci4gICovCi0gIGhhbmRsZXIg PSBGZmluZF9maWxlX25hbWVfaGFuZGxlciAoYWJzbmFtZSwgUWZpbGVfcmVhZGFibGVfcCk7 Ci0gIGlmICghTklMUCAoaGFuZGxlcikpCi0gICAgcmV0dXJuIGNhbGwyIChoYW5kbGVyLCBR ZmlsZV9yZWFkYWJsZV9wLCBhYnNuYW1lKTsKLQotICBhYnNuYW1lID0gRU5DT0RFX0ZJTEUg KGFic25hbWUpOwotICByZXR1cm4gKGZhY2Nlc3NhdCAoQVRfRkRDV0QsIFNTREFUQSAoYWJz bmFtZSksIFJfT0ssIEFUX0VBQ0NFU1MpID09IDAKLQkgID8gUXQgOiBRbmlsKTsKKyAgcmV0 dXJuIGZpbGVfYWNjZXNzaWJsZV9wIChmaWxlbmFtZSwgUWZpbGVfcmVhZGFibGVfcCwgUl9P Syk7CiB9CiAKIERFRlVOICgiZmlsZS13cml0YWJsZS1wIiwgRmZpbGVfd3JpdGFibGVfcCwg U2ZpbGVfd3JpdGFibGVfcCwgMSwgMSwgMCwKICAgICAgICBkb2M6IC8qIFJldHVybiB0IGlm IGZpbGUgRklMRU5BTUUgY2FuIGJlIHdyaXR0ZW4gb3IgY3JlYXRlZCBieSB5b3UuICAqLykK ICAgKExpc3BfT2JqZWN0IGZpbGVuYW1lKQogewotICBMaXNwX09iamVjdCBhYnNuYW1lLCBk aXIsIGVuY29kZWQ7CisgIExpc3BfT2JqZWN0IGFic25hbWUsIGRpcjsKICAgTGlzcF9PYmpl Y3QgaGFuZGxlcjsKIAogICBDSEVDS19TVFJJTkcgKGZpbGVuYW1lKTsKQEAgLTI3ODQsMTEg KzI3ODIsOSBAQCBERUZVTiAoImZpbGUtd3JpdGFibGUtcCIsIEZmaWxlX3dyaXRhYmxlX3As IFNmaWxlX3dyaXRhYmxlX3AsIDEsIDEsIDAsCiAgIGlmICghTklMUCAoaGFuZGxlcikpCiAg ICAgcmV0dXJuIGNhbGwyIChoYW5kbGVyLCBRZmlsZV93cml0YWJsZV9wLCBhYnNuYW1lKTsK IAotICBlbmNvZGVkID0gRU5DT0RFX0ZJTEUgKGFic25hbWUpOwotICBpZiAoY2hlY2tfd3Jp dGFibGUgKFNTREFUQSAoZW5jb2RlZCksIFdfT0spKQotICAgIHJldHVybiBRdDsKLSAgaWYg KGVycm5vICE9IEVOT0VOVCkKLSAgICByZXR1cm4gUW5pbDsKKyAgTGlzcF9PYmplY3Qgd3Jp dGFibGUgPSBjaGVja193cml0YWJsZSAoYWJzbmFtZSwgV19PSyk7CisgIGlmICghTklMUCAo d3JpdGFibGUpIHx8IGVycm5vICE9IEVOT0VOVCkKKyAgICByZXR1cm4gd3JpdGFibGU7CiAK ICAgZGlyID0gRmZpbGVfbmFtZV9kaXJlY3RvcnkgKGFic25hbWUpOwogICBlYXNzZXJ0ICgh TklMUCAoZGlyKSk7CkBAIC0yNzk2LDE0ICsyNzkyLDEzIEBAIERFRlVOICgiZmlsZS13cml0 YWJsZS1wIiwgRmZpbGVfd3JpdGFibGVfcCwgU2ZpbGVfd3JpdGFibGVfcCwgMSwgMSwgMCwK ICAgZGlyID0gRmRpcmVjdG9yeV9maWxlX25hbWUgKGRpcik7CiAjZW5kaWYgLyogTVNET1Mg Ki8KIAotICBkaXIgPSBFTkNPREVfRklMRSAoZGlyKTsKICNpZmRlZiBXSU5ET1dTTlQKICAg LyogVGhlIHJlYWQtb25seSBhdHRyaWJ1dGUgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkgZG9l c24ndCBhZmZlY3QKICAgICAgd2hldGhlciBhIGZpbGUgb3IgZGlyZWN0b3J5IGNhbiBiZSBj cmVhdGVkIHdpdGhpbiBpdC4gIFNvbWUgZGF5IHdlCiAgICAgIHNob3VsZCBjaGVjayBBQ0xz IHRob3VnaCwgd2hpY2ggZG8gYWZmZWN0IHRoaXMuICAqLwotICByZXR1cm4gZmlsZV9kaXJl Y3RvcnlfcCAoZGlyKSA/IFF0IDogUW5pbDsKKyAgcmV0dXJuIGZpbGVfZGlyZWN0b3J5X3Ag KGRpciwgRU5DT0RFX0ZJTEUgKGRpcikpOwogI2Vsc2UKLSAgcmV0dXJuIGNoZWNrX3dyaXRh YmxlIChTU0RBVEEgKGRpciksIFdfT0sgfCBYX09LKSA/IFF0IDogUW5pbDsKKyAgcmV0dXJu IGNoZWNrX3dyaXRhYmxlIChkaXIsIFdfT0sgfCBYX09LKTsKICNlbmRpZgogfQogDApAQCAt MjgzNCwxOSArMjgyOSwzMSBAQCBERUZVTiAoImFjY2Vzcy1maWxlIiwgRmFjY2Vzc19maWxl LCBTYWNjZXNzX2ZpbGUsIDIsIDIsIDAsCiAgIHJldHVybiBRbmlsOwogfQogDAotLyogUmVs YXRpdmUgdG8gZGlyZWN0b3J5IEZELCByZXR1cm4gdGhlIHN5bWJvbGljIGxpbmsgdmFsdWUg b2YgRklMRU5BTUUuCi0gICBPbiBmYWlsdXJlLCByZXR1cm4gbmlsLiAgKi8KKy8qIFJlbGF0 aXZlIHRvIGRpcmVjdG9yeSBGRCwgcmV0dXJuIHRoZSBzeW1ib2xpYyBsaW5rIHZhbHVlIG9m IEZJTEUuCisgICBJZiBGSUxFIGlzIG5vdCBhIHN5bWJvbGljIGxpbmssIHJldHVybiBuaWwu CisgICBFTkNPREVEX0ZJTEUgaXMgRklMRSwgZW5jb2RlZCBmb3IgdGhlIHN5c3RlbS4KKyAg IFNpZ25hbCBhbiBlcnJvciBvbiBmYWlsdXJlLiAgKi8KIExpc3BfT2JqZWN0Ci1lbWFjc19y ZWFkbGlua2F0IChpbnQgZmQsIGNoYXIgY29uc3QgKmZpbGVuYW1lKQorZW1hY3NfcmVhZGxp bmthdCAoaW50IGZkLCBMaXNwX09iamVjdCBmaWxlLCBjaGFyIGNvbnN0ICplbmNvZGVkX2Zp bGUpCiB7CiAgIHN0YXRpYyBzdHJ1Y3QgYWxsb2NhdG9yIGNvbnN0IGVtYWNzX25vcmVhbGxv Y19hbGxvY2F0b3IgPQogICAgIHsgeG1hbGxvYywgTlVMTCwgeGZyZWUsIG1lbW9yeV9mdWxs IH07CiAgIExpc3BfT2JqZWN0IHZhbDsKICAgY2hhciByZWFkbGlua19idWZbMTAyNF07Ci0g IGNoYXIgKmJ1ZiA9IGNhcmVhZGxpbmthdCAoZmQsIGZpbGVuYW1lLCByZWFkbGlua19idWYs IHNpemVvZiByZWFkbGlua19idWYsCisgIGNoYXIgKmJ1ZiA9IGNhcmVhZGxpbmthdCAoZmQs IGVuY29kZWRfZmlsZSwKKwkJCSAgICByZWFkbGlua19idWYsIHNpemVvZiByZWFkbGlua19i dWYsCiAJCQkgICAgJmVtYWNzX25vcmVhbGxvY19hbGxvY2F0b3IsIHJlYWRsaW5rYXQpOwog ICBpZiAoIWJ1ZikKLSAgICByZXR1cm4gUW5pbDsKKyAgICB7CisgICAgICBpZiAoZXJybm8g PT0gRUlOVkFMIHx8IGVycm5vID09IEVOT0VOVCB8fCBlcnJubyA9PSBFTk9URElSKQorCXJl dHVybiBRbmlsOworI2lmZGVmIENZR1dJTgorICAgICAgLyogV29yayBhcm91bmQgQ3lnd2lu IGJ1Z3MuICAqLworICAgICAgaWYgKGVycm5vID09IEVJTyB8fCBlcnJubyA9PSBFQUNDRVMp CisJcmV0dXJuIFFuaWw7CisjZW5kaWYKKyAgICAgIHJlcG9ydF9maWxlX2Vycm9yICgiUmVh ZGluZyBzeW1ib2xpYyBsaW5rIiwgZmlsZSk7CisgICAgfQogCiAgIHZhbCA9IGJ1aWxkX3Vu aWJ5dGVfc3RyaW5nIChidWYpOwogICBpZiAoYnVmICE9IHJlYWRsaW5rX2J1ZikKQEAgLTI4 NzQsOSArMjg4MSw4IEBAIERFRlVOICgiZmlsZS1zeW1saW5rLXAiLCBGZmlsZV9zeW1saW5r X3AsIFNmaWxlX3N5bWxpbmtfcCwgMSwgMSwgMCwKICAgaWYgKCFOSUxQIChoYW5kbGVyKSkK ICAgICByZXR1cm4gY2FsbDIgKGhhbmRsZXIsIFFmaWxlX3N5bWxpbmtfcCwgZmlsZW5hbWUp OwogCi0gIGZpbGVuYW1lID0gRU5DT0RFX0ZJTEUgKGZpbGVuYW1lKTsKLQotICByZXR1cm4g ZW1hY3NfcmVhZGxpbmthdCAoQVRfRkRDV0QsIFNTREFUQSAoZmlsZW5hbWUpKTsKKyAgY2hh ciAqZW5jb2RlZF9maWxlbmFtZSA9IFNTREFUQSAoRU5DT0RFX0ZJTEUgKGZpbGVuYW1lKSk7 CisgIHJldHVybiBlbWFjc19yZWFkbGlua2F0IChBVF9GRENXRCwgZmlsZW5hbWUsIGVuY29k ZWRfZmlsZW5hbWUpOwogfQogCiBERUZVTiAoImZpbGUtZGlyZWN0b3J5LXAiLCBGZmlsZV9k aXJlY3RvcnlfcCwgU2ZpbGVfZGlyZWN0b3J5X3AsIDEsIDEsIDAsCkBAIC0yODkzLDQ5ICsy ODk5LDYwIEBAIERFRlVOICgiZmlsZS1kaXJlY3RvcnktcCIsIEZmaWxlX2RpcmVjdG9yeV9w LCBTZmlsZV9kaXJlY3RvcnlfcCwgMSwgMSwgMCwKICAgaWYgKCFOSUxQIChoYW5kbGVyKSkK ICAgICByZXR1cm4gY2FsbDIgKGhhbmRsZXIsIFFmaWxlX2RpcmVjdG9yeV9wLCBhYnNuYW1l KTsKIAotICBhYnNuYW1lID0gRU5DT0RFX0ZJTEUgKGFic25hbWUpOwotCi0gIHJldHVybiBm aWxlX2RpcmVjdG9yeV9wIChhYnNuYW1lKSA/IFF0IDogUW5pbDsKKyAgcmV0dXJuIGZpbGVf ZGlyZWN0b3J5X3AgKGFic25hbWUsIEVOQ09ERV9GSUxFIChhYnNuYW1lKSk7CiB9CiAKLS8q IFJldHVybiB0cnVlIGlmIEZJTEUgaXMgYSBkaXJlY3Rvcnkgb3IgYSBzeW1saW5rIHRvIGEg ZGlyZWN0b3J5LgotICAgT3RoZXJ3aXNlIHJldHVybiBmYWxzZSBhbmQgc2V0IGVycm5vLiAg Ki8KLWJvb2wKLWZpbGVfZGlyZWN0b3J5X3AgKExpc3BfT2JqZWN0IGZpbGUpCisvKiBSZXR1 cm4gdCBpZiBGSUxFIGlzIGEgZGlyZWN0b3J5IG9yIGEgc3ltbGluayB0byBhIGRpcmVjdG9y eSwgbmlsCisgICAoc2V0dGluZyBlcnJubykgaWYgbm90LiAgRU5DT0RFRF9GSUxFIGlzIEZJ TEUsIGVuY29kZWQgZm9yIHRoZSBzeXN0ZW0uCisgICBTaWduYWwgYW4gZXJyb3IgaWYgdGhl IHJlc3VsdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4gICovCitMaXNwX09iamVjdAorZmlsZV9k aXJlY3RvcnlfcCAoTGlzcF9PYmplY3QgZmlsZSwgTGlzcF9PYmplY3QgZW5jb2RlZF9maWxl KQogeworICBjaGFyICpmaWxlbmFtZSA9IFNTREFUQSAoZW5jb2RlZF9maWxlKTsKICNpZmRl ZiBET1NfTlQKICAgLyogVGhpcyBpcyBjaGVhcGVyIHRoYW4gJ3N0YXQnLiAgKi8KLSAgcmV0 dXJuIGZhY2Nlc3NhdCAoQVRfRkRDV0QsIFNTREFUQSAoZmlsZSksIERfT0ssIEFUX0VBQ0NF U1MpID09IDA7CisgIHJldHVybiAoZmFjY2Vzc2F0IChBVF9GRENXRCwgZmlsZW5hbWUsIERf T0ssIEFUX0VBQ0NFU1MpID09IDAKKwkgID8gUXQgOiBRbmlsKTsKICNlbHNlCisKKyAgYm9v bCB1c2VfZ2VuZXJpY19jb2RlID0gdHJ1ZTsKKwogIyBpZmRlZiBPX1BBVEgKICAgLyogVXNl IE9fUEFUSCBpZiBhdmFpbGFibGUsIGFzIGl0IGF2b2lkcyByYWNlcyBhbmQgRU9WRVJGTE9X IGlzc3Vlcy4gICovCi0gIGludCBmZCA9IG9wZW5hdCAoQVRfRkRDV0QsIFNTREFUQSAoZmls ZSksIE9fUEFUSCB8IE9fQ0xPRVhFQyB8IE9fRElSRUNUT1JZKTsKKyAgaW50IGZkID0gb3Bl bmF0IChBVF9GRENXRCwgZmlsZW5hbWUsIE9fUEFUSCB8IE9fQ0xPRVhFQyB8IE9fRElSRUNU T1JZKTsKICAgaWYgKDAgPD0gZmQpCiAgICAgewogICAgICAgZW1hY3NfY2xvc2UgKGZkKTsK LSAgICAgIHJldHVybiB0cnVlOworICAgICAgcmV0dXJuIFF0OwogICAgIH0KLSAgaWYgKGVy cm5vICE9IEVJTlZBTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIC8qIE9fUEFUSCBpcyBkZWZp bmVkIGJ1dCBldmlkZW50bHkgdGhpcyBMaW51eCBrZXJuZWwgcHJlZGF0ZXMgMi42LjM5Lgot ICAgICBGYWxsIGJhY2sgb24gZ2VuZXJpYyBQT1NJWCBjb2RlLiAgKi8KKyAgLyogSWYgZXJy bm8gPT0gRUlOVkFMLCBPX1BBVEggaXMgZGVmaW5lZCBidXQgZXZpZGVudGx5IHRoaXMgTGlu dXgKKyAgICAga2VybmVsIHByZWRhdGVzIDIuNi4zOSwgc28gZmFsbCBiYWNrIG9uIGdlbmVy aWMgUE9TSVggY29kZS4gICovCisgIHVzZV9nZW5lcmljX2NvZGUgPSBlcnJubyA9PSBFSU5W QUw7CiAjIGVuZGlmCi0gIC8qIFVzZSBmaWxlX2FjY2Vzc2libGVfZGlyZWN0b3J5LCBhcyBp dCBhdm9pZHMgc3RhdCBFT1ZFUkZMT1cKLSAgICAgcHJvYmxlbXMgYW5kIGNvdWxkIGJlIGNo ZWFwZXIuICBIb3dldmVyLCBpZiBpdCBmYWlscyBiZWNhdXNlIEZJTEUKLSAgICAgaXMgaW5h Y2Nlc3NpYmxlLCBmYWxsIGJhY2sgb24gc3RhdDsgaWYgdGhlIGxhdHRlciBmYWlscyB3aXRo Ci0gICAgIEVPVkVSRkxPVyB0aGVuIEZJTEUgbXVzdCBoYXZlIGJlZW4gYSBkaXJlY3Rvcnkg dW5sZXNzIGEgcmFjZQotICAgICBjb25kaXRpb24gb2NjdXJyZWQgKGEgcHJvYmxlbSBoYXJk IHRvIHdvcmsgYXJvdW5kIHBvcnRhYmx5KS4gICovCi0gIGlmIChmaWxlX2FjY2Vzc2libGVf ZGlyZWN0b3J5X3AgKGZpbGUpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoZXJybm8gIT0g RUFDQ0VTKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0gIGlmIChz dGF0IChTU0RBVEEgKGZpbGUpLCAmc3QpICE9IDApCi0gICAgcmV0dXJuIGVycm5vID09IEVP VkVSRkxPVzsKLSAgaWYgKFNfSVNESVIgKHN0LnN0X21vZGUpKQotICAgIHJldHVybiB0cnVl OwotICBlcnJubyA9IEVOT1RESVI7Ci0gIHJldHVybiBmYWxzZTsKKworICBpZiAodXNlX2dl bmVyaWNfY29kZSkKKyAgICB7CisgICAgICAvKiBVc2UgZmlsZV9hY2Nlc3NpYmxlX2RpcmVj dG9yeV9wLCBhcyBpdCBhdm9pZHMgc3RhdCBFT1ZFUkZMT1cKKwkgcHJvYmxlbXMgYW5kIGNv dWxkIGJlIGNoZWFwZXIuICBIb3dldmVyLCBpZiBpdCBmYWlscyBiZWNhdXNlIEZJTEUKKwkg aXMgaW5hY2Nlc3NpYmxlLCBmYWxsIGJhY2sgb24gc3RhdDsgaWYgdGhlIGxhdHRlciBmYWls cyB3aXRoCisJIEVPVkVSRkxPVyB0aGVuIEZJTEUgbXVzdCBoYXZlIGJlZW4gYSBkaXJlY3Rv cnkgdW5sZXNzIGEgcmFjZQorCSBjb25kaXRpb24gb2NjdXJyZWQgKGEgcHJvYmxlbSBoYXJk IHRvIHdvcmsgYXJvdW5kIHBvcnRhYmx5KS4gICovCisgICAgICBMaXNwX09iamVjdCBhY2Nl c3NpYmxlID0gZmlsZV9hY2Nlc3NpYmxlX2RpcmVjdG9yeV9wIChmaWxlLCBlbmNvZGVkX2Zp bGUpOworICAgICAgaWYgKCEgKE5JTFAgKGFjY2Vzc2libGUpICYmIGVycm5vID09IEVBQ0NF UykpCisJcmV0dXJuIGFjY2Vzc2libGU7CisgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICAg IGlmIChzdGF0IChmaWxlbmFtZSwgJnN0KSA9PSAwKQorCXsKKwkgIGVycm5vID0gRU5PVERJ UjsKKwkgIHJldHVybiBTX0lTRElSIChzdC5zdF9tb2RlKSA/IFF0IDogUW5pbDsKKwl9Cisg ICAgICBpZiAoZXJybm8gPT0gRU9WRVJGTE9XKQorCXJldHVybiBRdDsKKyAgICB9CisKKyAg aWYgKGVycm5vID09IEVOT0VOVCB8fCBlcnJubyA9PSBFTk9URElSKQorICAgIHJldHVybiBR bmlsOworICByZXBvcnRfZmlsZV9lcnJvciAoIlRlc3RpbmcgZmlsZSIsIGZpbGUpOwogI2Vu ZGlmCiB9CiAKQEAgLTI5NzYsMTUgKzI5OTMsMTUgQEAgREVGVU4gKCJmaWxlLWFjY2Vzc2li bGUtZGlyZWN0b3J5LXAiLCBGZmlsZV9hY2Nlc3NpYmxlX2RpcmVjdG9yeV9wLAogICAgICAg cmV0dXJuIHI7CiAgICAgfQogCi0gIGFic25hbWUgPSBFTkNPREVfRklMRSAoYWJzbmFtZSk7 Ci0gIHJldHVybiBmaWxlX2FjY2Vzc2libGVfZGlyZWN0b3J5X3AgKGFic25hbWUpID8gUXQg OiBRbmlsOworICByZXR1cm4gZmlsZV9hY2Nlc3NpYmxlX2RpcmVjdG9yeV9wIChhYnNuYW1l LCBFTkNPREVfRklMRSAoYWJzbmFtZSkpOwogfQogCi0vKiBJZiBGSUxFIGlzIGEgc2VhcmNo YWJsZSBkaXJlY3Rvcnkgb3IgYSBzeW1saW5rIHRvIGEKLSAgIHNlYXJjaGFibGUgZGlyZWN0 b3J5LCByZXR1cm4gdHJ1ZS4gIE90aGVyd2lzZSByZXR1cm4KLSAgIGZhbHNlIGFuZCBzZXQg ZXJybm8gdG8gYW4gZXJyb3IgbnVtYmVyLiAgKi8KLWJvb2wKLWZpbGVfYWNjZXNzaWJsZV9k aXJlY3RvcnlfcCAoTGlzcF9PYmplY3QgZmlsZSkKKy8qIElmIEZJTEUgaXMgYSBzZWFyY2hh YmxlIGRpcmVjdG9yeSBvciBhIHN5bWxpbmsgdG8gYSBzZWFyY2hhYmxlCisgICBkaXJlY3Rv cnksIHJldHVybiB0LiAgSWYgbm90LCByZXR1cm4gbmlsIGFuZCBzZXQgZXJybm8gdG8gYW4g ZXJyb3IKKyAgIG51bWJlci4gIEVOQ09ERURfRklMRSBpcyBGSUxFLCBlbmNvZGVkIGZvciB0 aGUgc3lzdGVtLiAgU2lnbmFsIGFuCisgICBlcnJvciBpZiB0aGUgcmVzdWx0IGNhbm5vdCBi ZSBkZXRlcm1pbmVkLiAgKi8KK0xpc3BfT2JqZWN0CitmaWxlX2FjY2Vzc2libGVfZGlyZWN0 b3J5X3AgKExpc3BfT2JqZWN0IGZpbGUsIExpc3BfT2JqZWN0IGVuY29kZWRfZmlsZSkKIHsK ICNpZmRlZiBET1NfTlQKICMgaWZkZWYgV0lORE9XU05UCkBAIC0yOTkzLDE4ICszMDEwLDE5 IEBAIGZpbGVfYWNjZXNzaWJsZV9kaXJlY3RvcnlfcCAoTGlzcF9PYmplY3QgZmlsZSkKICAg ICAgYWNjZXNzaW5nICJESVIvLiIsIHVzZWQgYmVsb3cgb24gUG9zaXggaG9zdHMsIGRvZXNu J3Qgd29yayBvbgogICAgICBXaW5kb3dzLCBiZWNhdXNlICJESVIvLiIgaXMgbm9ybWFsaXpl ZCB0byBqdXN0ICJESVIiIGJlZm9yZQogICAgICBoaXR0aW5nIHRoZSBkaXNrLiAgKi8KLSAg cmV0dXJuIChTQllURVMgKGZpbGUpID09IDAKLQkgIHx8IHczMl9hY2Nlc3NpYmxlX2RpcmVj dG9yeV9wIChTU0RBVEEgKGZpbGUpLCBTQllURVMgKGZpbGUpKSk7CisgIHJldHVybiAoKFNC WVRFUyAoZW5jb2RlZF9maWxlKSA9PSAwCisJICAgfHwgdzMyX2FjY2Vzc2libGVfZGlyZWN0 b3J5X3AgKFNTREFUQSAoZW5jb2RlZF9maWxlKSwKKwkJCQkJICBTQllURVMgKGVuY29kZWRf ZmlsZSkpKQorCSAgPyBRdCA6IFFuaWwpOwogIyBlbHNlCS8qIE1TRE9TICovCi0gIHJldHVy biBmaWxlX2RpcmVjdG9yeV9wIChmaWxlKTsKKyAgcmV0dXJuIGZpbGVfZGlyZWN0b3J5X3Ag KGZpbGUsIGVuY29kZWRfZmlsZSk7CiAjIGVuZGlmCSAvKiBNU0RPUyAqLwogI2Vsc2UJIC8q ICFET1NfTlQgKi8KICAgLyogT24gUE9TSVhpc2ggcGxhdGZvcm1zLCB1c2UganVzdCBvbmUg c3lzdGVtIGNhbGw7IHRoaXMgYXZvaWRzIGEKICAgICAgcmFjZSBhbmQgaXMgdHlwaWNhbGx5 IGZhc3Rlci4gICovCi0gIGNvbnN0IGNoYXIgKmRhdGEgPSBTU0RBVEEgKGZpbGUpOwotICBw dHJkaWZmX3QgbGVuID0gU0JZVEVTIChmaWxlKTsKKyAgY29uc3QgY2hhciAqZGF0YSA9IFNT REFUQSAoZW5jb2RlZF9maWxlKTsKKyAgcHRyZGlmZl90IGxlbiA9IFNCWVRFUyAoZW5jb2Rl ZF9maWxlKTsKICAgY2hhciBjb25zdCAqZGlyOwotICBib29sIG9rOwogICBpbnQgc2F2ZWRf ZXJybm87CiAgIFVTRV9TQUZFX0FMTE9DQTsKIApAQCAtMzAyOSw3ICszMDQ3LDcgQEAgZmls ZV9hY2Nlc3NpYmxlX2RpcmVjdG9yeV9wIChMaXNwX09iamVjdCBmaWxlKQogICAgICAgZGly ID0gYnVmOwogICAgIH0KIAotICBvayA9IGNoZWNrX2V4aXN0aW5nIChkaXIpOworICBMaXNw X09iamVjdCBvayA9IGNoZWNrX2V4aXN0aW5nIChmaWxlLCBkaXIpOwogICBzYXZlZF9lcnJu byA9IGVycm5vOwogICBTQUZFX0ZSRUUgKCk7CiAgIGVycm5vID0gc2F2ZWRfZXJybm87CkBA IC0zNDI5LDcgKzM0NDcsNyBAQCBERUZVTiAoInNldC1maWxlLXRpbWVzIiwgRnNldF9maWxl X3RpbWVzLCBTc2V0X2ZpbGVfdGltZXMsIDEsIDIsIDAsCiAgICAgICB7CiAjaWZkZWYgTVNE T1MKICAgICAgICAgLyogU2V0dGluZyB0aW1lcyBvbiBhIGRpcmVjdG9yeSBhbHdheXMgZmFp bHMuICAqLwotICAgICAgICBpZiAoZmlsZV9kaXJlY3RvcnlfcCAoZW5jb2RlZF9hYnNuYW1l KSkKKyAgICAgICAgaWYgKCFOSUxQIChmaWxlX2RpcmVjdG9yeV9wIChhYnNuYW1lLCBlbmNv ZGVkX2Fic25hbWUpKSkKICAgICAgICAgICByZXR1cm4gUW5pbDsKICNlbmRpZgogICAgICAg ICByZXBvcnRfZmlsZV9lcnJvciAoIlNldHRpbmcgZmlsZSB0aW1lcyIsIGFic25hbWUpOwpA QCAtMzYxMiw3ICszNjMwLDcgQEAgZmlsZV9vZmZzZXQgKExpc3BfT2JqZWN0IHZhbCkKIHN0 YXRpYyBzdHJ1Y3QgdGltZXNwZWMKIHRpbWVfZXJyb3JfdmFsdWUgKGludCBlcnJudW0pCiB7 Ci0gIGludCBucyA9IChlcnJudW0gPT0gRU5PRU5UIHx8IGVycm51bSA9PSBFQUNDRVMgfHwg ZXJybnVtID09IEVOT1RESVIKKyAgaW50IG5zID0gKGVycm51bSA9PSBFTk9FTlQgfHwgZXJy bnVtID09IEVOT1RESVIKIAkgICAgPyBOT05FWElTVEVOVF9NT0RUSU1FX05TRUNTCiAJICAg IDogVU5LTk9XTl9NT0RUSU1FX05TRUNTKTsKICAgcmV0dXJuIG1ha2VfdGltZXNwZWMgKDAs IG5zKTsKZGlmZiAtLWdpdCBhL3NyYy9maWxlbG9jay5jIGIvc3JjL2ZpbGVsb2NrLmMKaW5k ZXggNDYzNDlhNjNlNC4uZGIwZjg3MDEwZCAxMDA2NDQKLS0tIGEvc3JjL2ZpbGVsb2NrLmMK KysrIGIvc3JjL2ZpbGVsb2NrLmMKQEAgLTUwNCw5ICs1MDQsOSBAQCByZWFkX2xvY2tfZGF0 YSAoY2hhciAqbGZuYW1lLCBjaGFyIGxmaW5mb1tNQVhfTEZJTkZPICsgMV0pCiB9CiAKIC8q IFJldHVybiAwIGlmIG5vYm9keSBvd25zIHRoZSBsb2NrIGZpbGUgTEZOQU1FIG9yIHRoZSBs b2NrIGlzIG9ic29sZXRlLAotICAgMSBpZiBhbm90aGVyIHByb2Nlc3Mgb3ducyBpdCAoYW5k IHNldCBPV05FUiAoaWYgbm9uLW51bGwpIHRvIGluZm8pLAotICAgMiBpZiB0aGUgY3VycmVu dCBwcm9jZXNzIG93bnMgaXQsCi0gICBvciAtMSBpZiBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0 aCB0aGUgbG9ja2luZyBtZWNoYW5pc20uICAqLworICAgLTEgaWYgYW5vdGhlciBwcm9jZXNz IG93bnMgaXQgKGFuZCBzZXQgT1dORVIgKGlmIG5vbi1udWxsKSB0byBpbmZvKSwKKyAgIC0y IGlmIHRoZSBjdXJyZW50IHByb2Nlc3Mgb3ducyBpdCwKKyAgIG9yIGFuIGVycm5vIHZhbHVl IGlmIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBsb2NraW5nIG1lY2hhbmlzbS4gICov CiAKIHN0YXRpYyBpbnQKIGN1cnJlbnRfbG9ja19vd25lciAobG9ja19pbmZvX3R5cGUgKm93 bmVyLCBjaGFyICpsZm5hbWUpCkBAIC01MjUsMjMgKzUyNSwyMyBAQCBjdXJyZW50X2xvY2tf b3duZXIgKGxvY2tfaW5mb190eXBlICpvd25lciwgY2hhciAqbGZuYW1lKQogICAvKiBJZiBu b25leGlzdGVudCBsb2NrIGZpbGUsIGFsbCBpcyB3ZWxsOyBvdGhlcndpc2UsIGdvdCBzdHJh bmdlIGVycm9yLiAqLwogICBsZmluZm9sZW4gPSByZWFkX2xvY2tfZGF0YSAobGZuYW1lLCBv d25lci0+dXNlcik7CiAgIGlmIChsZmluZm9sZW4gPCAwKQotICAgIHJldHVybiBlcnJubyA9 PSBFTk9FTlQgPyAwIDogLTE7CisgICAgcmV0dXJuIGVycm5vID09IEVOT0VOVCA/IDAgOiBl cnJubzsKICAgaWYgKE1BWF9MRklORk8gPCBsZmluZm9sZW4pCi0gICAgcmV0dXJuIC0xOwor ICAgIHJldHVybiBFTkFNRVRPT0xPTkc7CiAgIG93bmVyLT51c2VyW2xmaW5mb2xlbl0gPSAw OwogCi0gIC8qIFBhcnNlIFVTRVJASE9TVC5QSUQ6Qk9PVF9USU1FLiAgSWYgY2FuJ3QgcGFy c2UsIHJldHVybiAtMS4gICovCisgIC8qIFBhcnNlIFVTRVJASE9TVC5QSUQ6Qk9PVF9USU1F LiAgSWYgY2FuJ3QgcGFyc2UsIHJldHVybiBFSU5WQUwuICAqLwogICAvKiBUaGUgVVNFUiBp cyBldmVyeXRoaW5nIGJlZm9yZSB0aGUgbGFzdCBALiAgKi8KICAgb3duZXItPmF0ID0gYXQg PSBtZW1yY2hyIChvd25lci0+dXNlciwgJ0AnLCBsZmluZm9sZW4pOwogICBpZiAoIWF0KQot ICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gRUlOVkFMOwogICBvd25lci0+ZG90ID0gZG90 ID0gc3RycmNociAoYXQsICcuJyk7CiAgIGlmICghZG90KQotICAgIHJldHVybiAtMTsKKyAg ICByZXR1cm4gRUlOVkFMOwogCiAgIC8qIFRoZSBQSUQgaXMgZXZlcnl0aGluZyBmcm9tIHRo ZSBsYXN0ICcuJyB0byB0aGUgJzonIG9yIGVxdWl2YWxlbnQuICAqLwogICBpZiAoISBjX2lz ZGlnaXQgKGRvdFsxXSkpCi0gICAgcmV0dXJuIC0xOworICAgIHJldHVybiBFSU5WQUw7CiAg IGVycm5vID0gMDsKICAgcGlkID0gc3RydG9pbWF4IChkb3QgKyAxLCAmb3duZXItPmNvbG9u LCAxMCk7CiAgIGlmIChlcnJubyA9PSBFUkFOR0UpCkBAIC01NjIsMjAgKzU2MiwyMCBAQCBj dXJyZW50X2xvY2tfb3duZXIgKGxvY2tfaW5mb190eXBlICpvd25lciwgY2hhciAqbGZuYW1l KQogCSBtaXN0YWtlbmx5IHRyYW5zbGl0ZXJhdGUgJzonIHRvIFUrRjAyMiBpbiBzeW1saW5r IGNvbnRlbnRzLgogCSBTZWUgPGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1 Zy5jZ2k/aWQ9MTM4NDE1Mz4uICAqLwogICAgICAgaWYgKCEgKGJvb3RbMF0gPT0gJ1wyMDAn ICYmIGJvb3RbMV0gPT0gJ1wyNDInKSkKLQlyZXR1cm4gLTE7CisJcmV0dXJuIEVJTlZBTDsK ICAgICAgIGJvb3QgKz0gMjsKICAgICAgIEZBTExUSFJPVUdIOwogICAgIGNhc2UgJzonOgog ICAgICAgaWYgKCEgY19pc2RpZ2l0IChib290WzBdKSkKLQlyZXR1cm4gLTE7CisJcmV0dXJu IEVJTlZBTDsKICAgICAgIGJvb3RfdGltZSA9IHN0cnRvaW1heCAoYm9vdCwgJmxmaW5mb19l bmQsIDEwKTsKICAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAt MTsKKyAgICAgIHJldHVybiBFSU5WQUw7CiAgICAgfQogICBpZiAobGZpbmZvX2VuZCAhPSBv d25lci0+dXNlciArIGxmaW5mb2xlbikKLSAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIEVJ TlZBTDsKIAogICAvKiBPbiBjdXJyZW50IGhvc3Q/ICAqLwogICBMaXNwX09iamVjdCBzeXN0 ZW1fbmFtZSA9IEZzeXN0ZW1fbmFtZSAoKTsKQEAgLTU4NCwyMiArNTg0LDIyIEBAIGN1cnJl bnRfbG9ja19vd25lciAobG9ja19pbmZvX3R5cGUgKm93bmVyLCBjaGFyICpsZm5hbWUpCiAg ICAgICAmJiBtZW1jbXAgKGF0ICsgMSwgU1NEQVRBIChzeXN0ZW1fbmFtZSksIFNCWVRFUyAo c3lzdGVtX25hbWUpKSA9PSAwKQogICAgIHsKICAgICAgIGlmIChwaWQgPT0gZ2V0cGlkICgp KQotICAgICAgICByZXQgPSAyOyAvKiBXZSBvd24gaXQuICAqLworICAgICAgICByZXQgPSAt MjsgLyogV2Ugb3duIGl0LiAgKi8KICAgICAgIGVsc2UgaWYgKDAgPCBwaWQgJiYgcGlkIDw9 IFRZUEVfTUFYSU1VTSAocGlkX3QpCiAgICAgICAgICAgICAgICAmJiAoa2lsbCAocGlkLCAw KSA+PSAwIHx8IGVycm5vID09IEVQRVJNKQogCSAgICAgICAmJiAoYm9vdF90aW1lID09IDAK IAkJICAgfHwgKGJvb3RfdGltZSA8PSBUWVBFX01BWElNVU0gKHRpbWVfdCkKIAkJICAgICAg ICYmIHdpdGhpbl9vbmVfc2Vjb25kIChib290X3RpbWUsIGdldF9ib290X3RpbWUgKCkpKSkp Ci0gICAgICAgIHJldCA9IDE7IC8qIEFuIGV4aXN0aW5nIHByb2Nlc3Mgb24gdGhpcyBtYWNo aW5lIG93bnMgaXQuICAqLworICAgICAgICByZXQgPSAtMTsgLyogQW4gZXhpc3RpbmcgcHJv Y2VzcyBvbiB0aGlzIG1hY2hpbmUgb3ducyBpdC4gICovCiAgICAgICAvKiBUaGUgb3duZXIg cHJvY2VzcyBpcyBkZWFkIG9yIGhhcyBhIHN0cmFuZ2UgcGlkLCBzbyB0cnkgdG8KICAgICAg ICAgIHphcCB0aGUgbG9ja2ZpbGUuICAqLwogICAgICAgZWxzZQotICAgICAgICByZXR1cm4g dW5saW5rIChsZm5hbWUpOworICAgICAgICByZXR1cm4gdW5saW5rIChsZm5hbWUpIDwgMCA/ IGVycm5vIDogMDsKICAgICB9CiAgIGVsc2UKICAgICB7IC8qIElmIHdlIHdhbnRlZCB0byBz dXBwb3J0IHRoZSBjaGVjayBmb3Igc3RhbGUgbG9ja3Mgb24gcmVtb3RlIG1hY2hpbmVzLAog ICAgICAgICAgaGVyZSdzIHdoZXJlIHdlJ2QgZG8gaXQuICAqLwotICAgICAgcmV0ID0gMTsK KyAgICAgIHJldCA9IC0xOwogICAgIH0KIAogICByZXR1cm4gcmV0OwpAQCAtNjA4LDMwICs2 MDgsMjggQEAgY3VycmVudF9sb2NrX293bmVyIChsb2NrX2luZm9fdHlwZSAqb3duZXIsIGNo YXIgKmxmbmFtZSkKIAwKIC8qIExvY2sgdGhlIGxvY2sgbmFtZWQgTEZOQU1FIGlmIHBvc3Np YmxlLgogICAgUmV0dXJuIDAgaW4gdGhhdCBjYXNlLgotICAgUmV0dXJuIHBvc2l0aXZlIGlm IHNvbWUgb3RoZXIgcHJvY2VzcyBvd25zIHRoZSBsb2NrLCBhbmQgaW5mbyBhYm91dAorICAg UmV0dXJuIG5lZ2F0aXZlIGlmIHNvbWUgb3RoZXIgcHJvY2VzcyBvd25zIHRoZSBsb2NrLCBh bmQgaW5mbyBhYm91dAogICAgICB0aGF0IHByb2Nlc3MgaW4gQ0xBU0hFUi4KLSAgIFJldHVy biAtMSBpZiBjYW5ub3QgbG9jayBmb3IgYW55IG90aGVyIHJlYXNvbi4gICovCisgICBSZXR1 cm4gcG9zaXRpdmUgZXJybm8gdmFsdWUgaWYgY2Fubm90IGxvY2sgZm9yIGFueSBvdGhlciBy ZWFzb24uICAqLwogCiBzdGF0aWMgaW50Ci1sb2NrX2lmX2ZyZWUgKGxvY2tfaW5mb190eXBl ICpjbGFzaGVyLCBjaGFyICpsZm5hbWUpCitsb2NrX2lmX2ZyZWUgKGxvY2tfaW5mb190eXBl ICpjbGFzaGVyLCBjaGFyICpsZm5hbWUsIExpc3BfT2JqZWN0IGZuKQogewogICBpbnQgZXJy OwogICB3aGlsZSAoKGVyciA9IGxvY2tfZmlsZV8xIChsZm5hbWUsIDApKSA9PSBFRVhJU1Qp CiAgICAgewotICAgICAgc3dpdGNoIChjdXJyZW50X2xvY2tfb3duZXIgKGNsYXNoZXIsIGxm bmFtZSkpCisgICAgICBlcnIgPSBjdXJyZW50X2xvY2tfb3duZXIgKGNsYXNoZXIsIGxmbmFt ZSk7CisgICAgICBpZiAoZXJyICE9IDApCiAJewotCWNhc2UgMjoKLQkgIHJldHVybiAwOyAg IC8qIFdlIG91cnNlbHZlcyBsb2NrZWQgaXQuICAqLwotCWNhc2UgMToKLQkgIHJldHVybiAx OyAgIC8qIFNvbWVvbmUgZWxzZSBoYXMgaXQuICAqLwotCWNhc2UgLTE6Ci0JICByZXR1cm4g LTE7ICAvKiBjdXJyZW50X2xvY2tfb3duZXIgcmV0dXJuZWQgc3RyYW5nZSBlcnJvci4gICov CisJICBpZiAoZXJyIDwgMCkKKwkgICAgcmV0dXJuIC0yIC0gZXJyOyAvKiBXZSBsb2NrZWQg aXQsIG9yIHNvbWVvbmUgZWxzZSBoYXMgaXQuICAqLworCSAgYnJlYWs7IC8qIGN1cnJlbnRf bG9ja19vd25lciByZXR1cm5lZCBzdHJhbmdlIGVycm9yLiAgKi8KIAl9CiAKICAgICAgIC8q IFdlIGRlbGV0ZWQgYSBzdGFsZSBsb2NrOyB0cnkgYWdhaW4gdG8gbG9jayB0aGUgZmlsZS4g ICovCiAgICAgfQogCi0gIHJldHVybiBlcnIgPyAtMSA6IDA7CisgIHJldHVybiBlcnI7CiB9 CiAKIC8qIGxvY2tfZmlsZSBsb2NrcyBmaWxlIEZOLApAQCAtNjk3LDggKzY5NSw5IEBAIGxv Y2tfZmlsZSAoTGlzcF9PYmplY3QgZm4pCiAgICAgICAvKiBDcmVhdGUgdGhlIG5hbWUgb2Yg dGhlIGxvY2stZmlsZSBmb3IgZmlsZSBmbiAqLwogICAgICAgTUFLRV9MT0NLX05BTUUgKGxm bmFtZSwgZW5jb2RlZF9mbik7CiAKLSAgICAgIC8qIFRyeSB0byBsb2NrIHRoZSBsb2NrLiAg Ki8KLSAgICAgIGlmICgwIDwgbG9ja19pZl9mcmVlICgmbG9ja19pbmZvLCBsZm5hbWUpKQor ICAgICAgLyogVHJ5IHRvIGxvY2sgdGhlIGxvY2suICBGSVhNRTogVGhpcyBpZ25vcmVzIGVy cm9ycyB3aGVuCisJIGxvY2tfaWZfZnJlZSByZXR1cm5zIGEgcG9zaXRpdmUgZXJybm8gdmFs dWUuICAqLworICAgICAgaWYgKGxvY2tfaWZfZnJlZSAoJmxvY2tfaW5mbywgbGZuYW1lLCBm bikgPCAwKQogCXsKIAkgIC8qIFNvbWVvbmUgZWxzZSBoYXMgdGhlIGxvY2suICBDb25zaWRl ciBicmVha2luZyBpdC4gICovCiAJICBMaXNwX09iamVjdCBhdHRhY2s7CkBAIC03MjUsMTMg KzcyNCwxNiBAQCB1bmxvY2tfZmlsZSAoTGlzcF9PYmplY3QgZm4pCiAgIGNoYXIgKmxmbmFt ZTsKICAgVVNFX1NBRkVfQUxMT0NBOwogCi0gIGZuID0gRmV4cGFuZF9maWxlX25hbWUgKGZu LCBRbmlsKTsKLSAgZm4gPSBFTkNPREVfRklMRSAoZm4pOworICBMaXNwX09iamVjdCBmaWxl bmFtZSA9IEZleHBhbmRfZmlsZV9uYW1lIChmbiwgUW5pbCk7CisgIGZuID0gRU5DT0RFX0ZJ TEUgKGZpbGVuYW1lKTsKIAogICBNQUtFX0xPQ0tfTkFNRSAobGZuYW1lLCBmbik7CiAKLSAg aWYgKGN1cnJlbnRfbG9ja19vd25lciAoMCwgbGZuYW1lKSA9PSAyKQotICAgIHVubGluayAo bGZuYW1lKTsKKyAgaW50IGVyciA9IGN1cnJlbnRfbG9ja19vd25lciAoMCwgbGZuYW1lKTsK KyAgaWYgKGVyciA9PSAtMiAmJiB1bmxpbmsgKGxmbmFtZSkgIT0gMCAmJiBlcnJubyAhPSBF Tk9FTlQpCisgICAgZXJyID0gZXJybm87CisgIGlmICgwIDwgZXJyKQorICAgIHJlcG9ydF9m aWxlX2Vycm5vICgiVW5sb2NraW5nIGZpbGUiLCBmaWxlbmFtZSwgZXJyKTsKIAogICBTQUZF X0ZSRUUgKCk7CiB9CkBAIC04MjIsMTcgKzgyNCwxNyBAQCBERUZVTiAoImZpbGUtbG9ja2Vk LXAiLCBGZmlsZV9sb2NrZWRfcCwgU2ZpbGVfbG9ja2VkX3AsIDEsIDEsIDAsCiAgIFVTRV9T QUZFX0FMTE9DQTsKIAogICBmaWxlbmFtZSA9IEZleHBhbmRfZmlsZV9uYW1lIChmaWxlbmFt ZSwgUW5pbCk7Ci0gIGZpbGVuYW1lID0gRU5DT0RFX0ZJTEUgKGZpbGVuYW1lKTsKLQotICBN QUtFX0xPQ0tfTkFNRSAobGZuYW1lLCBmaWxlbmFtZSk7CisgIExpc3BfT2JqZWN0IGVuY29k ZWRfZmlsZW5hbWUgPSBFTkNPREVfRklMRSAoZmlsZW5hbWUpOworICBNQUtFX0xPQ0tfTkFN RSAobGZuYW1lLCBlbmNvZGVkX2ZpbGVuYW1lKTsKIAogICBvd25lciA9IGN1cnJlbnRfbG9j a19vd25lciAoJmxvY2tlciwgbGZuYW1lKTsKLSAgaWYgKG93bmVyIDw9IDApCi0gICAgcmV0 ID0gUW5pbDsKLSAgZWxzZSBpZiAob3duZXIgPT0gMikKLSAgICByZXQgPSBRdDsKLSAgZWxz ZQotICAgIHJldCA9IG1ha2Vfc3RyaW5nIChsb2NrZXIudXNlciwgbG9ja2VyLmF0IC0gbG9j a2VyLnVzZXIpOworICBzd2l0Y2ggKG93bmVyKQorICAgIHsKKyAgICBjYXNlIC0yOiByZXQg PSBRdDsgYnJlYWs7CisgICAgY2FzZSAtMTogcmV0ID0gbWFrZV9zdHJpbmcgKGxvY2tlci51 c2VyLCBsb2NrZXIuYXQgLSBsb2NrZXIudXNlcik7IGJyZWFrOworICAgIGNhc2UgIDA6IHJl dCA9IFFuaWw7IGJyZWFrOworICAgIGRlZmF1bHQ6IHJlcG9ydF9maWxlX2Vycm5vICgiVGVz dGluZyBmaWxlIGxvY2siLCBmaWxlbmFtZSwgb3duZXIpOworICAgIH0KIAogICBTQUZFX0ZS RUUgKCk7CiAgIHJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9zcmMvbGlzcC5oIGIvc3JjL2xp c3AuaAppbmRleCAwMjRlNWVkYjI2Li5jYjI4NDI5MTMxIDEwMDY0NAotLS0gYS9zcmMvbGlz cC5oCisrKyBiL3NyYy9saXNwLmgKQEAgLTQyOTgsNyArNDI5OCw2IEBAIFhNT0RVTEVfRlVO Q1RJT04gKExpc3BfT2JqZWN0IG8pCiAKIC8qIERlZmluZWQgaW4gZmlsZWlvLmMuICAqLwog Ci1leHRlcm4gYm9vbCBjaGVja19leGVjdXRhYmxlIChjaGFyICopOwogZXh0ZXJuIGNoYXIg KnNwbGljZV9kaXJfZmlsZSAoY2hhciAqLCBjaGFyIGNvbnN0ICosIGNoYXIgY29uc3QgKik7 CiBleHRlcm4gYm9vbCBmaWxlX25hbWVfYWJzb2x1dGVfcCAoY29uc3QgY2hhciAqKTsKIGV4 dGVybiBjaGFyIGNvbnN0ICpnZXRfaG9tZWRpciAodm9pZCk7CkBAIC00MzE0LDkgKzQzMTMs OSBAQCBYTU9EVUxFX0ZVTkNUSU9OIChMaXNwX09iamVjdCBvKQogZXh0ZXJuIEFWT0lEIHJl cG9ydF9maWxlX2Vycm9yIChjb25zdCBjaGFyICosIExpc3BfT2JqZWN0KTsKIGV4dGVybiBB Vk9JRCByZXBvcnRfZmlsZV9ub3RpZnlfZXJyb3IgKGNvbnN0IGNoYXIgKiwgTGlzcF9PYmpl Y3QpOwogZXh0ZXJuIGJvb2wgaW50ZXJuYWxfZGVsZXRlX2ZpbGUgKExpc3BfT2JqZWN0KTsK LWV4dGVybiBMaXNwX09iamVjdCBlbWFjc19yZWFkbGlua2F0IChpbnQsIGNvbnN0IGNoYXIg Kik7Ci1leHRlcm4gYm9vbCBmaWxlX2RpcmVjdG9yeV9wIChMaXNwX09iamVjdCk7Ci1leHRl cm4gYm9vbCBmaWxlX2FjY2Vzc2libGVfZGlyZWN0b3J5X3AgKExpc3BfT2JqZWN0KTsKK2V4 dGVybiBMaXNwX09iamVjdCBlbWFjc19yZWFkbGlua2F0IChpbnQsIExpc3BfT2JqZWN0LCBj aGFyIGNvbnN0ICopOworZXh0ZXJuIExpc3BfT2JqZWN0IGZpbGVfZGlyZWN0b3J5X3AgKExp c3BfT2JqZWN0LCBMaXNwX09iamVjdCk7CitleHRlcm4gTGlzcF9PYmplY3QgZmlsZV9hY2Nl c3NpYmxlX2RpcmVjdG9yeV9wIChMaXNwX09iamVjdCwgTGlzcF9PYmplY3QpOwogZXh0ZXJu IHZvaWQgaW5pdF9maWxlaW8gKHZvaWQpOwogZXh0ZXJuIHZvaWQgc3ltc19vZl9maWxlaW8g KHZvaWQpOwogCmRpZmYgLS1naXQgYS9zcmMvbHJlYWQuYyBiL3NyYy9scmVhZC5jCmluZGV4 IDZhZTdhMGQ4YmEuLmJmMDMyMWIwM2EgMTAwNjQ0Ci0tLSBhL3NyYy9scmVhZC5jCisrKyBi L3NyYy9scmVhZC5jCkBAIC0xNzQ2LDE4ICsxNzQ2LDIwIEBAIG9wZW5wIChMaXNwX09iamVj dCBwYXRoLCBMaXNwX09iamVjdCBzdHIsIExpc3BfT2JqZWN0IHN1ZmZpeGVzLAogCQkJCSAg ICBBVF9FQUNDRVNTKQogCQkJID09IDApCiAJCSAgewotCQkgICAgaWYgKGZpbGVfZGlyZWN0 b3J5X3AgKGVuY29kZWRfZm4pKQorCQkgICAgaWYgKCFOSUxQIChmaWxlX2RpcmVjdG9yeV9w IChzdHJpbmcsIGVuY29kZWRfZm4pKSkKIAkJICAgICAgbGFzdF9lcnJubyA9IEVJU0RJUjsK IAkJICAgIGVsc2UKIAkJICAgICAgZmQgPSAxOwogCQkgIH0KKwkJZWxzZSBpZiAoZXJybm8g IT0gRU5PRU5UICYmIGVycm5vICE9IEVOT1RESVIpCisJCSAgbGFzdF9lcnJubyA9IGVycm5v OwogCSAgICAgIH0KIAkgICAgZWxzZQogCSAgICAgIHsKIAkJZmQgPSBlbWFjc19vcGVuIChw Zm4sIE9fUkRPTkxZLCAwKTsKIAkJaWYgKGZkIDwgMCkKIAkJICB7Ci0JCSAgICBpZiAoZXJy bm8gIT0gRU5PRU5UKQorCQkgICAgaWYgKGVycm5vICE9IEVOT0VOVCAmJiBlcnJubyAhPSBF Tk9URElSKQogCQkgICAgICBsYXN0X2Vycm5vID0gZXJybm87CiAJCSAgfQogCQllbHNlCkBA IC00NTE3LDcgKzQ1MTksNyBAQCBsb2FkX3BhdGhfY2hlY2sgKExpc3BfT2JqZWN0IGxwYXRo KQogICAgICAgaWYgKFNUUklOR1AgKGRpcmZpbGUpKQogICAgICAgICB7CiAgICAgICAgICAg ZGlyZmlsZSA9IEZkaXJlY3RvcnlfZmlsZV9uYW1lIChkaXJmaWxlKTsKLSAgICAgICAgICBp ZiAoISBmaWxlX2FjY2Vzc2libGVfZGlyZWN0b3J5X3AgKGRpcmZpbGUpKQorICAgICAgICAg IGlmIChOSUxQIChmaWxlX2FjY2Vzc2libGVfZGlyZWN0b3J5X3AgKGRpcmZpbGUsIGRpcmZp bGUpKSkKICAgICAgICAgICAgIGRpcl93YXJuaW5nICgiTGlzcCBkaXJlY3RvcnkiLCBYQ0FS IChwYXRoX3RhaWwpKTsKICAgICAgICAgfQogICAgIH0KLS0gCjIuMjEuMAoK --------------82F8A0A7664CCE7948FBE02E-- From unknown Fri Jun 20 20:11:03 2025 MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) X-Loop: help-debbugs@gnu.org From: help-debbugs@gnu.org (GNU bug Tracking System) To: Paul Eggert Subject: bug#37389: closed (Re: [PATCH] Improve reporting of I/O, access errors) Message-ID: References: <5d1cd1a5-9d1f-5a32-7a19-c7ffd0880489@cs.ucla.edu> X-Gnu-PR-Message: they-closed 37389 X-Gnu-PR-Package: emacs X-Gnu-PR-Keywords: patch Reply-To: 37389@debbugs.gnu.org Date: Wed, 18 Sep 2019 02:29:02 +0000 Content-Type: multipart/mixed; boundary="----------=_1568773742-31139-1" This is a multi-part message in MIME format... ------------=_1568773742-31139-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Your bug report #37389: [PATCH] Improve reporting of I/O, access errors which was filed against the emacs package, has been closed. The explanation is attached below, along with your original report. If you require more details, please reply to 37389@debbugs.gnu.org. --=20 37389: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D37389 GNU Bug Tracking System Contact help-debbugs@gnu.org with problems ------------=_1568773742-31139-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at 37389-done) by debbugs.gnu.org; 18 Sep 2019 02:28:38 +0000 Received: from localhost ([127.0.0.1]:53441 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iAPhr-00085M-1I for submit@debbugs.gnu.org; Tue, 17 Sep 2019 22:28:36 -0400 Received: from zimbra.cs.ucla.edu ([131.179.128.68]:36350) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iAPhn-000855-IP for 37389-done@debbugs.gnu.org; Tue, 17 Sep 2019 22:28:33 -0400 Received: from localhost (localhost [127.0.0.1]) by zimbra.cs.ucla.edu (Postfix) with ESMTP id EC4A81600A0 for <37389-done@debbugs.gnu.org>; Tue, 17 Sep 2019 19:28:25 -0700 (PDT) Received: from zimbra.cs.ucla.edu ([127.0.0.1]) by localhost (zimbra.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id 1j8LsG4OuRks for <37389-done@debbugs.gnu.org>; Tue, 17 Sep 2019 19:28:22 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by zimbra.cs.ucla.edu (Postfix) with ESMTP id D5A54160226 for <37389-done@debbugs.gnu.org>; Tue, 17 Sep 2019 19:28:22 -0700 (PDT) X-Virus-Scanned: amavisd-new at zimbra.cs.ucla.edu Received: from zimbra.cs.ucla.edu ([127.0.0.1]) by localhost (zimbra.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id 3jjm0PDsJH4y for <37389-done@debbugs.gnu.org>; Tue, 17 Sep 2019 19:28:22 -0700 (PDT) Received: from Penguin.CS.UCLA.EDU (Penguin.CS.UCLA.EDU [131.179.64.200]) by zimbra.cs.ucla.edu (Postfix) with ESMTPSA id A0A811600A0 for <37389-done@debbugs.gnu.org>; Tue, 17 Sep 2019 19:28:22 -0700 (PDT) To: 37389-done@debbugs.gnu.org From: Paul Eggert Subject: Re: [PATCH] Improve reporting of I/O, access errors Organization: UCLA Computer Science Department Message-ID: Date: Tue, 17 Sep 2019 19:28:22 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.1.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------BC1322618985A5B453D8329F" Content-Language: en-US X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 37389-done X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) This is a multi-part message in MIME format. --------------BC1322618985A5B453D8329F Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit After a review by Eli, and discovery of a few less-often-used primitives like file-system-info that should also signal non-tame errors, I installed the attached into master and am closing the bug report. --------------BC1322618985A5B453D8329F Content-Type: text/x-patch; charset=UTF-8; name="0001-Improve-reporting-of-I-O-access-errors.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0001-Improve-reporting-of-I-O-access-errors.patch" >From 9dc306b1db08196684d05a474148e16305adbad0 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 17 Sep 2019 19:18:14 -0700 Subject: [PATCH] Improve reporting of I/O, access errors Signal an error for file-oriented errors that are not tame errors like ENOENT and ENOTDIR (Bug#37389). Do this for primitives exposed to Lisp; the lower level internal C API merely makes errno values available to higher-level C code. * doc/lispref/files.texi (Testing Accessibility) (File Attributes, Extended Attributes): Do not say that the functions return nil when the return value cannot be determined. * etc/NEWS: Mention the change. * src/dired.c (Ffile_attributes): Fix doc string confusion about opening a file vs getting its attributes. (file_attributes): Signal serious errors. * src/fileio.c (check_existing, check_executable) (check_writable): Remove. All callers changed to use check_file_access or file_access_p. (file_access_p, file_metadata_errno, file_attribute_errno) (file_test_errno, check_file_access, check_emacs_readlinkat): New functions. * src/fileio.c (Ffile_executable_p, Ffile_readable_p) (Ffile_name_case_insensitive_p, Frename_file, Ffile_exists_p): (Ffile_symlink_p, Ffile_directory_p) (Ffile_accessible_directory_p, Ffile_regular_p) (Ffile_selinux_context, Ffile_acl, Ffile_modes) (Ffile_newer_than_file_p, Fset_visited_file_modtime) (Ffile_system_info): * src/filelock.c (unlock_file, Ffile_locked_p): * src/lread.c (Fload): Signal serious errors. * src/fileio.c (Ffile_writable_p): Remove unnecessary CHECK_STRING. (emacs_readlinkat): Now static. * src/filelock.c (current_lock_owner, lock_if_free): Return a positive errno on error, and the negative of the old old value on success. All callers changed. * src/lread.c (openp): Propagate serious errno values to caller. --- doc/lispref/files.texi | 13 +- etc/NEWS | 10 ++ src/dired.c | 9 +- src/emacs.c | 2 +- src/fileio.c | 359 +++++++++++++++++++++++------------------ src/filelock.c | 86 +++++----- src/lisp.h | 5 +- src/lread.c | 21 ++- 8 files changed, 282 insertions(+), 223 deletions(-) diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi index 18a1f4908d..fba9622fec 100644 --- a/doc/lispref/files.texi +++ b/doc/lispref/files.texi @@ -856,8 +856,7 @@ Testing Accessibility permission on the containing directories, regardless of the permissions of the file itself.) -If the file does not exist, or if access control policies prevent you -from finding its attributes, this function returns @code{nil}. +If the file does not exist, this function returns @code{nil}. Directories are files, so @code{file-exists-p} can return @code{t} when given a directory. However, because @code{file-exists-p} follows @@ -1262,7 +1261,7 @@ File Attributes @defun file-attributes filename &optional id-format @anchor{Definition of file-attributes} This function returns a list of attributes of file @var{filename}. If -the specified file's attributes cannot be accessed, it returns @code{nil}. +the specified file does not exist, it returns @code{nil}. This function does not follow symbolic links. The optional parameter @var{id-format} specifies the preferred format of attributes @acronym{UID} and @acronym{GID} (see below)---the @@ -1464,9 +1463,8 @@ Extended Attributes and BSD, Emacs uses the POSIX ACL interface, while on MS-Windows Emacs emulates the POSIX ACL interface with native file security APIs. -If Emacs was not compiled with ACL support, or the file does not exist -or is inaccessible, or Emacs was unable to determine the ACL entries -for any other reason, then the return value is @code{nil}. +If ACLs are not supported or the file does not exist, +then the return value is @code{nil}. @end defun @defun file-selinux-context filename @@ -1478,8 +1476,7 @@ Extended Attributes same form as what @code{set-file-selinux-context} takes for its @var{context} argument (@pxref{Changing Files}). -If Emacs was not compiled with SELinux support, or the file does not -exist or is inaccessible, or if the system does not support SELinux, +If SELinux is not supported or the file does not exist, then the return value is @code{(nil nil nil nil)}. @end defun diff --git a/etc/NEWS b/etc/NEWS index 9aec8da566..dce4903384 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2005,6 +2005,16 @@ file name if there is no user named "foo". ** The FILENAME argument to 'file-name-base' is now mandatory and no longer defaults to 'buffer-file-name'. ++++ +** File metadata primitives now signal an error if I/O, access, or +other serious errors prevent them from determining the result. +Formerly, these functions often (though not always) returned nil. +For example, if the directory /etc/firewalld is not searchable, +(file-symlink-p "/etc/firewalld/firewalld.conf") now signals an error +instead of returning nil, because file-symlink-p cannot determine +whether a symbolic link exists there. These functions still behave as +before if the only problem is that the file does not exist. + --- ** The function 'eldoc-message' now accepts a single argument. Programs that called it with multiple arguments before should pass diff --git a/src/dired.c b/src/dired.c index df03bc32ce..3768b6dbb7 100644 --- a/src/dired.c +++ b/src/dired.c @@ -819,7 +819,7 @@ stat_gname (struct stat *st) DEFUN ("file-attributes", Ffile_attributes, Sfile_attributes, 1, 2, 0, doc: /* Return a list of attributes of file FILENAME. -Value is nil if specified file cannot be opened. +Value is nil if specified file does not exist. ID-FORMAT specifies the preferred format of attributes uid and gid (see below) - valid values are `string' and `integer'. The latter is the @@ -939,15 +939,14 @@ file_attributes (int fd, char const *name, information to be accurate. */ w32_stat_get_owner_group = 1; #endif - if (fstatat (fd, name, &s, AT_SYMLINK_NOFOLLOW) == 0) - err = 0; + err = fstatat (fd, name, &s, AT_SYMLINK_NOFOLLOW) == 0 ? 0 : errno; #ifdef WINDOWSNT w32_stat_get_owner_group = 0; #endif } if (err != 0) - return unbind_to (count, Qnil); + return unbind_to (count, file_attribute_errno (filename, err)); Lisp_Object file_type; if (S_ISLNK (s.st_mode)) @@ -956,7 +955,7 @@ file_attributes (int fd, char const *name, symlink is replaced between the call to fstatat and the call to emacs_readlinkat. Detect this race unless the replacement is also a symlink. */ - file_type = emacs_readlinkat (fd, name); + file_type = check_emacs_readlinkat (fd, filename, name); if (NILP (file_type)) return unbind_to (count, Qnil); } diff --git a/src/emacs.c b/src/emacs.c index 558dd11a35..eb732810db 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -746,7 +746,7 @@ load_pdump_find_executable (char const *argv0, ptrdiff_t *candidate_size) candidate[path_part_length] = DIRECTORY_SEP; memcpy (candidate + path_part_length + 1, argv0, argv0_length + 1); struct stat st; - if (check_executable (candidate) + if (file_access_p (candidate, X_OK) && stat (candidate, &st) == 0 && S_ISREG (st.st_mode)) return candidate; *candidate = '\0'; diff --git a/src/fileio.c b/src/fileio.c index 81c29ca0cc..0977516f01 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -141,54 +141,38 @@ #define DRIVE_LETTER(x) c_tolower (x) struct coding_system *); -/* Return true if FILENAME exists, otherwise return false and set errno. */ - -static bool -check_existing (const char *filename) -{ - return faccessat (AT_FDCWD, filename, F_OK, AT_EACCESS) == 0; -} - -/* Return true if file FILENAME exists and can be executed. */ +/* Test whether FILE is accessible for AMODE. + Return true if successful, false (setting errno) otherwise. */ bool -check_executable (char *filename) -{ - return faccessat (AT_FDCWD, filename, X_OK, AT_EACCESS) == 0; -} - -/* Return true if file FILENAME exists and can be accessed - according to AMODE, which should include W_OK. - On failure, return false and set errno. */ - -static bool -check_writable (const char *filename, int amode) +file_access_p (char const *file, int amode) { #ifdef MSDOS - /* FIXME: an faccessat implementation should be added to the - DOS/Windows ports and this #ifdef branch should be removed. */ - struct stat st; - if (stat (filename, &st) < 0) - return 0; - errno = EPERM; - return (st.st_mode & S_IWRITE || S_ISDIR (st.st_mode)); -#else /* not MSDOS */ - bool res = faccessat (AT_FDCWD, filename, amode, AT_EACCESS) == 0; -#ifdef CYGWIN - /* faccessat may have returned failure because Cygwin couldn't - determine the file's UID or GID; if so, we return success. */ - if (!res) + if (amode & W_OK) { - int faccessat_errno = errno; + /* FIXME: The MS-DOS faccessat implementation should handle this. */ struct stat st; - if (stat (filename, &st) < 0) - return 0; - res = (st.st_uid == -1 || st.st_gid == -1); - errno = faccessat_errno; - } -#endif /* CYGWIN */ - return res; -#endif /* not MSDOS */ + if (stat (file, &st) != 0) + return false; + errno = EPERM; + return st.st_mode & S_IWRITE || S_ISDIR (st.st_mode); + } +#endif + + if (faccessat (AT_FDCWD, file, amode, AT_EACCESS) == 0) + return true; + +#ifdef CYGWIN + /* Return success if faccessat failed because Cygwin couldn't + determine the file's UID or GID. */ + int err = errno; + struct stat st; + if (stat (file, &st) == 0 && (st.st_uid == -1 || st.st_gid == -1)) + return true; + errno = err; +#endif + + return false; } /* Signal a file-access failure. STRING describes the failure, @@ -251,6 +235,30 @@ report_file_notify_error (const char *string, Lisp_Object name) } #endif +/* ACTION failed for FILE with errno ERR. Signal an error if ERR + means the file's metadata could not be retrieved even though it may + exist, otherwise return nil. */ + +static Lisp_Object +file_metadata_errno (char const *action, Lisp_Object file, int err) +{ + if (err == ENOENT || err == ENOTDIR || err == 0) + return Qnil; + report_file_errno (action, file, err); +} + +Lisp_Object +file_attribute_errno (Lisp_Object file, int err) +{ + return file_metadata_errno ("Getting attributes", file, err); +} + +static Lisp_Object +file_test_errno (Lisp_Object file, int err) +{ + return file_metadata_errno ("Testing file", file, err); +} + void close_file_unwind (int fd) { @@ -2446,8 +2454,12 @@ DEFUN ("file-name-case-insensitive-p", Ffile_name_case_insensitive_p, while (true) { int err = file_name_case_insensitive_err (filename); - if (! (err == ENOENT || err == ENOTDIR)) - return err < 0 ? Qt : Qnil; + switch (err) + { + case -1: return Qt; + default: return file_test_errno (filename, err); + case ENOENT: case ENOTDIR: break; + } Lisp_Object parent = file_name_directory (filename); /* Avoid infinite loop if the root is reported as non-existing (impossible?). */ @@ -2560,7 +2572,7 @@ DEFUN ("rename-file", Frename_file, Srename_file, 2, 3, { Lisp_Object symlink_target = (S_ISLNK (file_st.st_mode) - ? emacs_readlinkat (AT_FDCWD, SSDATA (encoded_file)) + ? check_emacs_readlinkat (AT_FDCWD, file, SSDATA (encoded_file)) : Qnil); if (!NILP (symlink_target)) Fmake_symbolic_link (symlink_target, newname, ok_if_already_exists); @@ -2708,32 +2720,48 @@ file_name_absolute_p (char const *filename) || user_homedir (&filename[1])))); } -DEFUN ("file-exists-p", Ffile_exists_p, Sfile_exists_p, 1, 1, 0, - doc: /* Return t if file FILENAME exists (whether or not you can read it). -See also `file-readable-p' and `file-attributes'. -This returns nil for a symlink to a nonexistent file. -Use `file-symlink-p' to test for such links. */) - (Lisp_Object filename) -{ - Lisp_Object absname; - Lisp_Object handler; +/* Return t if FILE exists and is accessible via OPERATION and AMODE, + nil (setting errno) if not. Signal an error if the result cannot + be determined. */ - CHECK_STRING (filename); - absname = Fexpand_file_name (filename, Qnil); - - /* If the file name has special constructs in it, - call the corresponding file name handler. */ - handler = Ffind_file_name_handler (absname, Qfile_exists_p); +static Lisp_Object +check_file_access (Lisp_Object file, Lisp_Object operation, int amode) +{ + file = Fexpand_file_name (file, Qnil); + Lisp_Object handler = Ffind_file_name_handler (file, operation); if (!NILP (handler)) { - Lisp_Object result = call2 (handler, Qfile_exists_p, absname); + Lisp_Object ok = call2 (handler, operation, file); + /* This errno value is bogus. Any caller that depends on errno + should be rethought anyway, to avoid a race between testing a + handled file's accessibility and using the file. */ errno = 0; - return result; + return ok; } - absname = ENCODE_FILE (absname); + char *encoded_file = SSDATA (ENCODE_FILE (file)); + bool ok = file_access_p (encoded_file, amode); + if (ok) + return Qt; + int err = errno; + if (err == EROFS || err == ETXTBSY + || (err == EACCES && amode != F_OK + && file_access_p (encoded_file, F_OK))) + { + errno = err; + return Qnil; + } + return file_test_errno (file, err); +} - return check_existing (SSDATA (absname)) ? Qt : Qnil; +DEFUN ("file-exists-p", Ffile_exists_p, Sfile_exists_p, 1, 1, 0, + doc: /* Return t if file FILENAME exists (whether or not you can read it). +See also `file-readable-p' and `file-attributes'. +This returns nil for a symlink to a nonexistent file. +Use `file-symlink-p' to test for such links. */) + (Lisp_Object filename) +{ + return check_file_access (filename, Qfile_exists_p, F_OK); } DEFUN ("file-executable-p", Ffile_executable_p, Sfile_executable_p, 1, 1, 0, @@ -2743,21 +2771,7 @@ DEFUN ("file-executable-p", Ffile_executable_p, Sfile_executable_p, 1, 1, 0, purpose, though.) */) (Lisp_Object filename) { - Lisp_Object absname; - Lisp_Object handler; - - CHECK_STRING (filename); - absname = Fexpand_file_name (filename, Qnil); - - /* If the file name has special constructs in it, - call the corresponding file name handler. */ - handler = Ffind_file_name_handler (absname, Qfile_executable_p); - if (!NILP (handler)) - return call2 (handler, Qfile_executable_p, absname); - - absname = ENCODE_FILE (absname); - - return (check_executable (SSDATA (absname)) ? Qt : Qnil); + return check_file_access (filename, Qfile_executable_p, X_OK); } DEFUN ("file-readable-p", Ffile_readable_p, Sfile_readable_p, 1, 1, 0, @@ -2765,21 +2779,7 @@ DEFUN ("file-readable-p", Ffile_readable_p, Sfile_readable_p, 1, 1, 0, See also `file-exists-p' and `file-attributes'. */) (Lisp_Object filename) { - Lisp_Object absname; - Lisp_Object handler; - - CHECK_STRING (filename); - absname = Fexpand_file_name (filename, Qnil); - - /* If the file name has special constructs in it, - call the corresponding file name handler. */ - handler = Ffind_file_name_handler (absname, Qfile_readable_p); - if (!NILP (handler)) - return call2 (handler, Qfile_readable_p, absname); - - absname = ENCODE_FILE (absname); - return (faccessat (AT_FDCWD, SSDATA (absname), R_OK, AT_EACCESS) == 0 - ? Qt : Qnil); + return check_file_access (filename, Qfile_readable_p, R_OK); } DEFUN ("file-writable-p", Ffile_writable_p, Sfile_writable_p, 1, 1, 0, @@ -2789,7 +2789,6 @@ DEFUN ("file-writable-p", Ffile_writable_p, Sfile_writable_p, 1, 1, 0, Lisp_Object absname, dir, encoded; Lisp_Object handler; - CHECK_STRING (filename); absname = Fexpand_file_name (filename, Qnil); /* If the file name has special constructs in it, @@ -2799,7 +2798,7 @@ DEFUN ("file-writable-p", Ffile_writable_p, Sfile_writable_p, 1, 1, 0, return call2 (handler, Qfile_writable_p, absname); encoded = ENCODE_FILE (absname); - if (check_writable (SSDATA (encoded), W_OK)) + if (file_access_p (SSDATA (encoded), W_OK)) return Qt; if (errno != ENOENT) return Qnil; @@ -2810,14 +2809,23 @@ DEFUN ("file-writable-p", Ffile_writable_p, Sfile_writable_p, 1, 1, 0, dir = Fdirectory_file_name (dir); #endif /* MSDOS */ - dir = ENCODE_FILE (dir); + encoded = ENCODE_FILE (dir); #ifdef WINDOWSNT /* The read-only attribute of the parent directory doesn't affect whether a file or directory can be created within it. Some day we should check ACLs though, which do affect this. */ - return file_directory_p (dir) ? Qt : Qnil; + return file_directory_p (encoded) ? Qt : Qnil; #else - return check_writable (SSDATA (dir), W_OK | X_OK) ? Qt : Qnil; + if (file_access_p (SSDATA (encoded), W_OK | X_OK)) + return Qt; + int err = errno; + if (err == EROFS + || (err == EACCES && file_access_p (SSDATA (encoded), F_OK))) + { + errno = err; + return Qnil; + } + return file_test_errno (absname, err); #endif } @@ -2849,8 +2857,8 @@ DEFUN ("access-file", Faccess_file, Saccess_file, 2, 2, 0, } /* Relative to directory FD, return the symbolic link value of FILENAME. - On failure, return nil. */ -Lisp_Object + On failure, return nil (setting errno). */ +static Lisp_Object emacs_readlinkat (int fd, char const *filename) { static struct allocator const emacs_norealloc_allocator = @@ -2869,6 +2877,27 @@ emacs_readlinkat (int fd, char const *filename) return val; } +/* Relative to directory FD, return the symbolic link value of FILE. + If FILE is not a symbolic link, return nil (setting errno). + Signal an error if the result cannot be determined. */ +Lisp_Object +check_emacs_readlinkat (int fd, Lisp_Object file, char const *encoded_file) +{ + Lisp_Object val = emacs_readlinkat (fd, encoded_file); + if (NILP (val)) + { + if (errno == EINVAL) + return val; +#ifdef CYGWIN + /* Work around Cygwin bugs. */ + if (errno == EIO || errno == EACCES) + return val; +#endif + return file_metadata_errno ("Reading symbolic link", file, errno); + } + return val; +} + DEFUN ("file-symlink-p", Ffile_symlink_p, Sfile_symlink_p, 1, 1, 0, doc: /* Return non-nil if file FILENAME is the name of a symbolic link. The value is the link target, as a string. @@ -2888,9 +2917,8 @@ DEFUN ("file-symlink-p", Ffile_symlink_p, Sfile_symlink_p, 1, 1, 0, if (!NILP (handler)) return call2 (handler, Qfile_symlink_p, filename); - filename = ENCODE_FILE (filename); - - return emacs_readlinkat (AT_FDCWD, SSDATA (filename)); + return check_emacs_readlinkat (AT_FDCWD, filename, + SSDATA (ENCODE_FILE (filename))); } DEFUN ("file-directory-p", Ffile_directory_p, Sfile_directory_p, 1, 1, 0, @@ -2907,9 +2935,9 @@ DEFUN ("file-directory-p", Ffile_directory_p, Sfile_directory_p, 1, 1, 0, if (!NILP (handler)) return call2 (handler, Qfile_directory_p, absname); - absname = ENCODE_FILE (absname); - - return file_directory_p (absname) ? Qt : Qnil; + if (file_directory_p (absname)) + return Qt; + return file_test_errno (absname, errno); } /* Return true if FILE is a directory or a symlink to a directory. @@ -2934,7 +2962,7 @@ file_directory_p (Lisp_Object file) /* O_PATH is defined but evidently this Linux kernel predates 2.6.39. Fall back on generic POSIX code. */ # endif - /* Use file_accessible_directory, as it avoids stat EOVERFLOW + /* Use file_accessible_directory_p, as it avoids stat EOVERFLOW problems and could be cheaper. However, if it fails because FILE is inaccessible, fall back on stat; if the latter fails with EOVERFLOW then FILE must have been a directory unless a race @@ -2990,8 +3018,13 @@ DEFUN ("file-accessible-directory-p", Ffile_accessible_directory_p, return r; } - absname = ENCODE_FILE (absname); - return file_accessible_directory_p (absname) ? Qt : Qnil; + Lisp_Object encoded_absname = ENCODE_FILE (absname); + if (file_accessible_directory_p (encoded_absname)) + return Qt; + int err = errno; + if (err == EACCES && file_access_p (SSDATA (encoded_absname), F_OK)) + return Qnil; + return file_test_errno (absname, err); } /* If FILE is a searchable directory or a symlink to a @@ -3043,7 +3076,7 @@ file_accessible_directory_p (Lisp_Object file) dir = buf; } - ok = check_existing (dir); + ok = file_access_p (dir, F_OK); saved_errno = errno; SAFE_FREE (); errno = saved_errno; @@ -3067,27 +3100,21 @@ DEFUN ("file-regular-p", Ffile_regular_p, Sfile_regular_p, 1, 1, 0, if (!NILP (handler)) return call2 (handler, Qfile_regular_p, absname); - absname = ENCODE_FILE (absname); - #ifdef WINDOWSNT - { - int result; - Lisp_Object tem = Vw32_get_true_file_attributes; + /* Tell stat to use expensive method to get accurate info. */ + Lisp_Object true_attributes = Vw32_get_true_file_attributes; + Vw32_get_true_file_attributes = Qt; +#endif - /* Tell stat to use expensive method to get accurate info. */ - Vw32_get_true_file_attributes = Qt; - result = stat (SSDATA (absname), &st); - Vw32_get_true_file_attributes = tem; + int stat_result = stat (SSDATA (absname), &st); - if (result < 0) - return Qnil; - return S_ISREG (st.st_mode) ? Qt : Qnil; - } -#else - if (stat (SSDATA (absname), &st) < 0) - return Qnil; - return S_ISREG (st.st_mode) ? Qt : Qnil; +#ifdef WINDOWSNT + Vw32_get_true_file_attributes = true_attributes; #endif + + if (stat_result == 0) + return S_ISREG (st.st_mode) ? Qt : Qnil; + return file_test_errno (absname, errno); } DEFUN ("file-selinux-context", Ffile_selinux_context, @@ -3097,7 +3124,7 @@ DEFUN ("file-selinux-context", Ffile_selinux_context, elements are strings naming the user, role, type, and range of the file's SELinux security context. -Return (nil nil nil nil) if the file is nonexistent or inaccessible, +Return (nil nil nil nil) if the file is nonexistent, or if SELinux is disabled, or if Emacs lacks SELinux support. */) (Lisp_Object filename) { @@ -3111,13 +3138,11 @@ Return (nil nil nil nil) if the file is nonexistent or inaccessible, if (!NILP (handler)) return call2 (handler, Qfile_selinux_context, absname); - absname = ENCODE_FILE (absname); - #if HAVE_LIBSELINUX if (is_selinux_enabled ()) { security_context_t con; - int conlength = lgetfilecon (SSDATA (absname), &con); + int conlength = lgetfilecon (SSDATA (ENCODE_FILE (absname)), &con); if (conlength > 0) { context_t context = context_new (con); @@ -3132,6 +3157,9 @@ Return (nil nil nil nil) if the file is nonexistent or inaccessible, context_free (context); freecon (con); } + else if (! (errno == ENOENT || errno == ENOTDIR || errno == ENODATA + || errno == ENOTSUP)) + report_file_error ("getting SELinux context", absname); } #endif @@ -3227,8 +3255,7 @@ DEFUN ("file-acl", Ffile_acl, Sfile_acl, 1, 1, 0, doc: /* Return ACL entries of file named FILENAME. The entries are returned in a format suitable for use in `set-file-acl' but is otherwise undocumented and subject to change. -Return nil if file does not exist or is not accessible, or if Emacs -was unable to determine the ACL entries. */) +Return nil if file does not exist. */) (Lisp_Object filename) { Lisp_Object acl_string = Qnil; @@ -3243,20 +3270,22 @@ DEFUN ("file-acl", Ffile_acl, Sfile_acl, 1, 1, 0, return call2 (handler, Qfile_acl, absname); # ifdef HAVE_ACL_SET_FILE - absname = ENCODE_FILE (absname); - # ifndef HAVE_ACL_TYPE_EXTENDED acl_type_t ACL_TYPE_EXTENDED = ACL_TYPE_ACCESS; # endif - acl_t acl = acl_get_file (SSDATA (absname), ACL_TYPE_EXTENDED); + acl_t acl = acl_get_file (SSDATA (ENCODE_FILE (absname)), ACL_TYPE_EXTENDED); if (acl == NULL) - return Qnil; - + { + if (errno == ENOENT || errno == ENOTDIR || errno == ENOTSUP) + return Qnil; + report_file_error ("Getting ACLs", absname); + } char *str = acl_to_text (acl, NULL); if (str == NULL) { + int err = errno; acl_free (acl); - return Qnil; + report_file_errno ("Getting ACLs", absname, err); } acl_string = build_string (str); @@ -3327,7 +3356,7 @@ DEFUN ("set-file-acl", Fset_file_acl, Sset_file_acl, DEFUN ("file-modes", Ffile_modes, Sfile_modes, 1, 1, 0, doc: /* Return mode bits of file named FILENAME, as an integer. -Return nil, if file does not exist or is not accessible. */) +Return nil if FILENAME does not exist. */) (Lisp_Object filename) { struct stat st; @@ -3339,11 +3368,8 @@ DEFUN ("file-modes", Ffile_modes, Sfile_modes, 1, 1, 0, if (!NILP (handler)) return call2 (handler, Qfile_modes, absname); - absname = ENCODE_FILE (absname); - - if (stat (SSDATA (absname), &st) < 0) - return Qnil; - + if (stat (SSDATA (ENCODE_FILE (absname)), &st) != 0) + return file_attribute_errno (absname, errno); return make_fixnum (st.st_mode & 07777); } @@ -3487,14 +3513,27 @@ DEFUN ("file-newer-than-file-p", Ffile_newer_than_file_p, Sfile_newer_than_file_ if (!NILP (handler)) return call3 (handler, Qfile_newer_than_file_p, absname1, absname2); - absname1 = ENCODE_FILE (absname1); - absname2 = ENCODE_FILE (absname2); + int err1; + if (stat (SSDATA (ENCODE_FILE (absname1)), &st1) == 0) + err1 = 0; + else + { + err1 = errno; + if (err1 != EOVERFLOW) + return file_test_errno (absname1, err1); + } - if (stat (SSDATA (absname1), &st1) < 0) - return Qnil; + if (stat (SSDATA (ENCODE_FILE (absname2)), &st2) != 0) + { + file_test_errno (absname2, errno); + return Qt; + } - if (stat (SSDATA (absname2), &st2) < 0) - return Qt; + if (err1) + { + file_test_errno (absname1, err1); + eassume (false); + } return (timespec_cmp (get_stat_mtime (&st2), get_stat_mtime (&st1)) < 0 ? Qt : Qnil); @@ -5686,13 +5725,13 @@ DEFUN ("set-visited-file-modtime", Fset_visited_file_modtime, /* The handler can find the file name the same way we did. */ return call2 (handler, Qset_visited_file_modtime, Qnil); - filename = ENCODE_FILE (filename); - - if (stat (SSDATA (filename), &st) >= 0) + if (stat (SSDATA (ENCODE_FILE (filename)), &st) == 0) { current_buffer->modtime = get_stat_mtime (&st); current_buffer->modtime_size = st.st_size; } + else + file_attribute_errno (filename, errno); } return Qnil; @@ -6103,22 +6142,22 @@ DEFUN ("file-system-info", Ffile_system_info, Sfile_system_info, 1, 1, 0, If the underlying system call fails, value is nil. */) (Lisp_Object filename) { - Lisp_Object encoded = ENCODE_FILE (Fexpand_file_name (filename, Qnil)); + filename = Fexpand_file_name (filename, Qnil); /* If the file name has special constructs in it, call the corresponding file name handler. */ - Lisp_Object handler = Ffind_file_name_handler (encoded, Qfile_system_info); + Lisp_Object handler = Ffind_file_name_handler (filename, Qfile_system_info); if (!NILP (handler)) { - Lisp_Object result = call2 (handler, Qfile_system_info, encoded); + Lisp_Object result = call2 (handler, Qfile_system_info, filename); if (CONSP (result) || NILP (result)) return result; error ("Invalid handler in `file-name-handler-alist'"); } struct fs_usage u; - if (get_fs_usage (SSDATA (encoded), NULL, &u) != 0) - return Qnil; + if (get_fs_usage (SSDATA (ENCODE_FILE (filename)), NULL, &u) != 0) + return errno == ENOSYS ? Qnil : file_attribute_errno (filename, errno); return list3 (blocks_to_bytes (u.fsu_blocksize, u.fsu_blocks, false), blocks_to_bytes (u.fsu_blocksize, u.fsu_bfree, false), blocks_to_bytes (u.fsu_blocksize, u.fsu_bavail, diff --git a/src/filelock.c b/src/filelock.c index 46349a63e4..ff25d6475d 100644 --- a/src/filelock.c +++ b/src/filelock.c @@ -504,9 +504,9 @@ read_lock_data (char *lfname, char lfinfo[MAX_LFINFO + 1]) } /* Return 0 if nobody owns the lock file LFNAME or the lock is obsolete, - 1 if another process owns it (and set OWNER (if non-null) to info), - 2 if the current process owns it, - or -1 if something is wrong with the locking mechanism. */ + -1 if another process owns it (and set OWNER (if non-null) to info), + -2 if the current process owns it, + or an errno value if something is wrong with the locking mechanism. */ static int current_lock_owner (lock_info_type *owner, char *lfname) @@ -525,23 +525,23 @@ current_lock_owner (lock_info_type *owner, char *lfname) /* If nonexistent lock file, all is well; otherwise, got strange error. */ lfinfolen = read_lock_data (lfname, owner->user); if (lfinfolen < 0) - return errno == ENOENT ? 0 : -1; + return errno == ENOENT ? 0 : errno; if (MAX_LFINFO < lfinfolen) - return -1; + return ENAMETOOLONG; owner->user[lfinfolen] = 0; - /* Parse USER@HOST.PID:BOOT_TIME. If can't parse, return -1. */ + /* Parse USER@HOST.PID:BOOT_TIME. If can't parse, return EINVAL. */ /* The USER is everything before the last @. */ owner->at = at = memrchr (owner->user, '@', lfinfolen); if (!at) - return -1; + return EINVAL; owner->dot = dot = strrchr (at, '.'); if (!dot) - return -1; + return EINVAL; /* The PID is everything from the last '.' to the ':' or equivalent. */ if (! c_isdigit (dot[1])) - return -1; + return EINVAL; errno = 0; pid = strtoimax (dot + 1, &owner->colon, 10); if (errno == ERANGE) @@ -562,20 +562,20 @@ current_lock_owner (lock_info_type *owner, char *lfname) mistakenly transliterate ':' to U+F022 in symlink contents. See . */ if (! (boot[0] == '\200' && boot[1] == '\242')) - return -1; + return EINVAL; boot += 2; FALLTHROUGH; case ':': if (! c_isdigit (boot[0])) - return -1; + return EINVAL; boot_time = strtoimax (boot, &lfinfo_end, 10); break; default: - return -1; + return EINVAL; } if (lfinfo_end != owner->user + lfinfolen) - return -1; + return EINVAL; /* On current host? */ Lisp_Object system_name = Fsystem_name (); @@ -584,22 +584,22 @@ current_lock_owner (lock_info_type *owner, char *lfname) && memcmp (at + 1, SSDATA (system_name), SBYTES (system_name)) == 0) { if (pid == getpid ()) - ret = 2; /* We own it. */ + ret = -2; /* We own it. */ else if (0 < pid && pid <= TYPE_MAXIMUM (pid_t) && (kill (pid, 0) >= 0 || errno == EPERM) && (boot_time == 0 || (boot_time <= TYPE_MAXIMUM (time_t) && within_one_second (boot_time, get_boot_time ())))) - ret = 1; /* An existing process on this machine owns it. */ + ret = -1; /* An existing process on this machine owns it. */ /* The owner process is dead or has a strange pid, so try to zap the lockfile. */ else - return unlink (lfname); + return unlink (lfname) < 0 ? errno : 0; } else { /* If we wanted to support the check for stale locks on remote machines, here's where we'd do it. */ - ret = 1; + ret = -1; } return ret; @@ -608,9 +608,9 @@ current_lock_owner (lock_info_type *owner, char *lfname) /* Lock the lock named LFNAME if possible. Return 0 in that case. - Return positive if some other process owns the lock, and info about + Return negative if some other process owns the lock, and info about that process in CLASHER. - Return -1 if cannot lock for any other reason. */ + Return positive errno value if cannot lock for any other reason. */ static int lock_if_free (lock_info_type *clasher, char *lfname) @@ -618,20 +618,18 @@ lock_if_free (lock_info_type *clasher, char *lfname) int err; while ((err = lock_file_1 (lfname, 0)) == EEXIST) { - switch (current_lock_owner (clasher, lfname)) + err = current_lock_owner (clasher, lfname); + if (err != 0) { - case 2: - return 0; /* We ourselves locked it. */ - case 1: - return 1; /* Someone else has it. */ - case -1: - return -1; /* current_lock_owner returned strange error. */ + if (err < 0) + return -2 - err; /* We locked it, or someone else has it. */ + break; /* current_lock_owner returned strange error. */ } /* We deleted a stale lock; try again to lock the file. */ } - return err ? -1 : 0; + return err; } /* lock_file locks file FN, @@ -697,8 +695,9 @@ lock_file (Lisp_Object fn) /* Create the name of the lock-file for file fn */ MAKE_LOCK_NAME (lfname, encoded_fn); - /* Try to lock the lock. */ - if (0 < lock_if_free (&lock_info, lfname)) + /* Try to lock the lock. FIXME: This ignores errors when + lock_if_free returns a positive errno value. */ + if (lock_if_free (&lock_info, lfname) < 0) { /* Someone else has the lock. Consider breaking it. */ Lisp_Object attack; @@ -725,13 +724,16 @@ unlock_file (Lisp_Object fn) char *lfname; USE_SAFE_ALLOCA; - fn = Fexpand_file_name (fn, Qnil); - fn = ENCODE_FILE (fn); + Lisp_Object filename = Fexpand_file_name (fn, Qnil); + fn = ENCODE_FILE (filename); MAKE_LOCK_NAME (lfname, fn); - if (current_lock_owner (0, lfname) == 2) - unlink (lfname); + int err = current_lock_owner (0, lfname); + if (err == -2 && unlink (lfname) != 0 && errno != ENOENT) + err = errno; + if (0 < err) + report_file_errno ("Unlocking file", filename, err); SAFE_FREE (); } @@ -822,17 +824,17 @@ DEFUN ("file-locked-p", Ffile_locked_p, Sfile_locked_p, 1, 1, 0, USE_SAFE_ALLOCA; filename = Fexpand_file_name (filename, Qnil); - filename = ENCODE_FILE (filename); - - MAKE_LOCK_NAME (lfname, filename); + Lisp_Object encoded_filename = ENCODE_FILE (filename); + MAKE_LOCK_NAME (lfname, encoded_filename); owner = current_lock_owner (&locker, lfname); - if (owner <= 0) - ret = Qnil; - else if (owner == 2) - ret = Qt; - else - ret = make_string (locker.user, locker.at - locker.user); + switch (owner) + { + case -2: ret = Qt; break; + case -1: ret = make_string (locker.user, locker.at - locker.user); break; + case 0: ret = Qnil; break; + default: report_file_errno ("Testing file lock", filename, owner); + } SAFE_FREE (); return ret; diff --git a/src/lisp.h b/src/lisp.h index 02f8a7b668..e68d2732e2 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -4299,7 +4299,6 @@ XMODULE_FUNCTION (Lisp_Object o) /* Defined in fileio.c. */ -extern bool check_executable (char *); extern char *splice_dir_file (char *, char const *, char const *); extern bool file_name_absolute_p (const char *); extern char const *get_homedir (void); @@ -4310,12 +4309,14 @@ XMODULE_FUNCTION (Lisp_Object o) extern void close_file_unwind (int); extern void fclose_unwind (void *); extern void restore_point_unwind (Lisp_Object); +extern bool file_access_p (char const *, int); extern Lisp_Object get_file_errno_data (const char *, Lisp_Object, int); extern AVOID report_file_errno (const char *, Lisp_Object, int); extern AVOID report_file_error (const char *, Lisp_Object); extern AVOID report_file_notify_error (const char *, Lisp_Object); +extern Lisp_Object file_attribute_errno (Lisp_Object, int); extern bool internal_delete_file (Lisp_Object); -extern Lisp_Object emacs_readlinkat (int, const char *); +extern Lisp_Object check_emacs_readlinkat (int, Lisp_Object, char const *); extern bool file_directory_p (Lisp_Object); extern bool file_accessible_directory_p (Lisp_Object); extern void init_fileio (void); diff --git a/src/lread.c b/src/lread.c index 6ae7a0d8ba..d8883db46c 100644 --- a/src/lread.c +++ b/src/lread.c @@ -1346,15 +1346,22 @@ DEFUN ("load", Fload, Sload, 1, 5, 0, if (!load_prefer_newer && is_elc) { result = stat (SSDATA (efound), &s1); + int err = errno; if (result == 0) { SSET (efound, SBYTES (efound) - 1, 0); result = stat (SSDATA (efound), &s2); + err = errno; SSET (efound, SBYTES (efound) - 1, 'c'); + if (result != 0) + found = Fsubstring (found, make_fixnum (0), + make_fixnum (-1)); } - - if (result == 0 - && timespec_cmp (get_stat_mtime (&s1), get_stat_mtime (&s2)) < 0) + if (result != 0) + file_attribute_errno (found, err); + else if (timespec_cmp (get_stat_mtime (&s1), + get_stat_mtime (&s2)) + < 0) { /* Make the progress messages mention that source is newer. */ newer = 1; @@ -1748,16 +1755,20 @@ openp (Lisp_Object path, Lisp_Object str, Lisp_Object suffixes, { if (file_directory_p (encoded_fn)) last_errno = EISDIR; - else + else if (errno == ENOENT || errno == ENOTDIR) fd = 1; + else + last_errno = errno; } + else if (! (errno == ENOENT || errno == ENOTDIR)) + last_errno = errno; } else { fd = emacs_open (pfn, O_RDONLY, 0); if (fd < 0) { - if (errno != ENOENT) + if (! (errno == ENOENT || errno == ENOTDIR)) last_errno = errno; } else -- 2.21.0 --------------BC1322618985A5B453D8329F-- ------------=_1568773742-31139-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at submit) by debbugs.gnu.org; 12 Sep 2019 08:07:22 +0000 Received: from localhost ([127.0.0.1]:43006 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1i8K8P-0004dx-8U for submit@debbugs.gnu.org; Thu, 12 Sep 2019 04:07:22 -0400 Received: from lists.gnu.org ([209.51.188.17]:55936) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1i8K8M-0004dp-Hp for submit@debbugs.gnu.org; Thu, 12 Sep 2019 04:07:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57946) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i8K8I-0003GY-HI for bug-gnu-emacs@gnu.org; Thu, 12 Sep 2019 04:07:18 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_50,RCVD_IN_DNSWL_MED, URIBL_BLOCKED autolearn=disabled version=3.3.2 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i8K8E-0005Ny-Bg for bug-gnu-emacs@gnu.org; Thu, 12 Sep 2019 04:07:14 -0400 Received: from zimbra.cs.ucla.edu ([131.179.128.68]:59724) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i8K8D-0005Mh-UG for bug-gnu-emacs@gnu.org; Thu, 12 Sep 2019 04:07:10 -0400 Received: from localhost (localhost [127.0.0.1]) by zimbra.cs.ucla.edu (Postfix) with ESMTP id 005341601EE for ; Thu, 12 Sep 2019 01:07:02 -0700 (PDT) Received: from zimbra.cs.ucla.edu ([127.0.0.1]) by localhost (zimbra.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id naR6XyZDdHsg for ; Thu, 12 Sep 2019 01:06:59 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by zimbra.cs.ucla.edu (Postfix) with ESMTP id E418916022F for ; Thu, 12 Sep 2019 01:06:59 -0700 (PDT) X-Virus-Scanned: amavisd-new at zimbra.cs.ucla.edu Received: from zimbra.cs.ucla.edu ([127.0.0.1]) by localhost (zimbra.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id PlWNLAfloqnR for ; Thu, 12 Sep 2019 01:06:59 -0700 (PDT) Received: from [192.168.1.9] (cpe-23-242-74-103.socal.res.rr.com [23.242.74.103]) by zimbra.cs.ucla.edu (Postfix) with ESMTPSA id AD6E91601EE for ; Thu, 12 Sep 2019 01:06:59 -0700 (PDT) To: Emacs bug reports and feature requests From: Paul Eggert Subject: [PATCH] Improve reporting of I/O, access errors Organization: UCLA Computer Science Department Message-ID: <5d1cd1a5-9d1f-5a32-7a19-c7ffd0880489@cs.ucla.edu> Date: Thu, 12 Sep 2019 01:06:59 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------82F8A0A7664CCE7948FBE02E" Content-Language: en-US X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 131.179.128.68 X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) This is a multi-part message in MIME format. --------------82F8A0A7664CCE7948FBE02E Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Attached is a patch to fix some problems Emacs has with failing to report I/O and access errors. It affects MS-Windows which I don't use, so I'm filing it as a bug report to give people a chance to review it. The main idea is to signal an error for I/O errors that are not tame errors. Typically ENOENT and ENOTDIR are tame, whereas the rest are more serious. --------------82F8A0A7664CCE7948FBE02E Content-Type: text/plain; charset=UTF-8; name="0001-Improve-reporting-of-I-O-access-errors.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="0001-Improve-reporting-of-I-O-access-errors.txt" RnJvbSBiNjQxYWEwMDg1ZjNlZjRlNzllN2Q3MjE5OGM2N2MzYjYxZGI5ZTQxIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBQYXVsIEVnZ2VydCA8ZWdnZXJ0QGNzLnVjbGEuZWR1 PgpEYXRlOiBUaHUsIDEyIFNlcCAyMDE5IDAwOjU5OjAzIC0wNzAwClN1YmplY3Q6IFtQQVRD SF0gSW1wcm92ZSByZXBvcnRpbmcgb2YgSS9PLCBhY2Nlc3MgZXJyb3JzCk1JTUUtVmVyc2lv bjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOApDb250ZW50 LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CgpFbWFjcyB3YXMgaWdub3JpbmcgSS9PIGFuZCBh Y2Nlc3MgZXJyb3JzIGluIHNldmVyYWwgcGxhY2VzCndoZW4gYWNjZXNzaW5nIGZpbGVzLiAg Rm9yIGV4YW1wbGUsIGl0IHNpbGVudGx5IGlnbm9yZWQgSS9PIG9yCmFjY2VzcyBlcnJvcnMg d2hlbiByZWFkaW5nIHN5bWJvbGljIGxpbmtzLiAgVXBkYXRlIEVtYWNzIHNvCnRoYXQgaXQg c2lnbmFscyBzZXJpb3VzIEkvTyBhbmQgYWNjZXNzIGVycm9ycyBtb3JlIGNvbnNpc3RlbnRs eS4KKiBkb2MvbGlzcHJlZi9maWxlcy50ZXhpIChGaWxlIEF0dHJpYnV0ZXMpOgpmaWxlLWF0 dHJpYnV0ZXMgcmV0dXJucyBuaWwgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsCm5vdCBp ZiBpdCBjYW5ub3QgYmUgYWNjZXNzZWQgZm9yIG90aGVyIHJlYXNvbnMgKHdoZXJlCml0IG1p Z2h0IHNpZ25hbCBhbiBlcnJvcikuCiogc3JjL2RpcmVkLmMgKEZmaWxlX2F0dHJpYnV0ZXMp OiBGaXggZG9jLgooZmlsZV9hdHRyaWJ1dGVzKTogSWYgZnN0YXRhdCBmYWlscywgdXNlIGl0 cyBlcnJubyBpbiByZXBvcnQuClNpZ25hbCBhbiBlcnJvciBmb3Igc2VyaW91cyBwcm9ibGVt cy4KKiBzcmMvZW1hY3MuYyAobG9hZF9wZHVtcF9maW5kX2V4ZWN1dGFibGUpOgpVc2UgZmFj Y2Vzc2F0IHNpbmNlIGNoZWNrX2V4ZWN1dGFibGUgbm8gbG9uZ2VyIGV4aXN0cy4KKiBzcmMv ZmlsZWlvLmMgKGNoZWNrX2ZpbGVfYWNjZXNzKTogTmV3IGZ1bmN0aW9uLAp3aGljaCBzaWdu YWxzIGFuIGVycm9yIGZvciBzZXJpb3VzIHByb2JsZW1zLgooY2hlY2tfZXhpc3RpbmcsIGNo ZWNrX3dyaXRhYmxlKTogVXNlIGl0LgooY2hlY2tfZXhpc3RpbmcpOiBOb3cgYWNjZXB0cyBh bmQgcmV0dXJucyBMaXNwX09iamVjdCwgYW5kCnRha2VzIEVOQ09ERURfRklMRSBhcmcuICBB bGwgY2FsbGVycyBjaGFuZ2VkLgooY2hlY2tfd3JpdGFibGUpOiBOZXcgYWNjZXB0cyBhbmQg cmV0dXJucyBMaXNwX09iamVjdC4KQWxsIGNhbGxlcnMgY2hhbmdlZC4KKGZpbGVfbmFtZV9j YXNlX2luc2Vuc2l0aXZlX3ApOiBOb3cgYWNjZXB0cyBMaXNwX09iamVjdCBmaWxlCmluc3Rl YWQgb2YgY2hhciAqZGVjb2RlZCBmaWxlbmFtZS4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuClNp Z25hbCBhbiBlcnJvciBmb3Igc2VyaW91cyBwcm9ibGVtcy4gIERvbuKAmXQgc3F1aXNoIGEg bG9uZwppbnRvIGFuIGludC4KKGZpbGVfYWNjZXNzaWJsZV9wKTogTmV3IGZ1bmN0aW9uLCBm b3Igc2ltcGxpZnlpbmcgY2FsbGVycwphbmQgc2lnbmFsaW5nIGVycm9ycyBmb3Igc2VyaW91 cyBwcm9ibGVtcy4KKEZmaWxlX2V4ZWN1dGFibGVfcCwgRmZpbGVfcmVhZGFibGVfcCk6IFVz ZSBpdC4KKEZmaWxlX3dyaXRhYmxlX3ApOiBTaW1wbGlmeSBhIGJpdCBieSBleHBsb2l0aW5n IG5ldwpjaGVja193cml0YWJsZSBBUEkuCihlbWFjc19yZWFkbGlua2F0KTogQWNjZXB0IExp c3BfT2JqZWN0IGluc3RlYWQgb2YgY2hhciBjb25zdCAqLgpOZXcgRU5DT0RFRF9GSUxFIGFy Zy4gIEFsbCB1c2VzIGNoYW5nZWQuICBTaWduYWwgZXJyb3IgZm9yCnNlcmlvdXMgcHJvYmxl bXMuCihmaWxlX2RpcmVjdG9yeV9wKTogTmV3IGFyZyBFTkNPREVEX0ZJTEUsIGFuZCByZXR1 cm4gTGlzcF9PYmplY3QKaW5zdGVhZCBvZiBib29sLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4g IFNpZ25hbCBlcnJvciBmb3IKc2VyaW91cyBwcm9ibGVtcy4KKGZpbGVfYWNjZXNzaWJsZV9k aXJlY3RvcnlfcCk6IE5ldyBhcmcgRU5DT0RFRF9GSUxFLAphbmQgcmV0dXJuIExpc3BfT2Jq ZWN0IGluc3RlYWQgb2YgYm9vbC4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuClNpZ25hbCBlcnJv ciBmb3Igc2VyaW91cyBwcm9ibGVtcy4KKHRpbWVfZXJyb3JfdmFsdWUpOiBFQUNDRVMgbWVh bnMgdGhlIHRpbWUgdmFsdWUgaXMgdW5rbm93biwKbm90IG5vbmV4aXN0ZW50LgoqIHNyYy9m aWxlbG9jay5jIChjdXJyZW50X2xvY2tfb3duZXIpOiBVc2UgLTEgYW5kIC0yIGluc3RlYWQg b2YKMSBhbmQgMiBmb3Igc3BlY2lhbCBjYXNlcy4gIFJldHVybiBhIHBvc2l0aXZlIGVycm5v IHZhbHVlIG9uIGZhaWx1cmUuCkFsbCBjYWxsZXJzIGNoYW5nZWQuCihsb2NrX2lmX2ZyZWUp OiBOZWdhdGUgc2Vuc2Ugb2YgcmV0dXJuIHZhbHVlLiAgUmV0dXJuIGEgcG9zaXRpdmUKZXJy bm8gdmFsdWUgb24gZmFpbHVyZS4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCihsb2NrX2ZpbGUp OiBBZGQgYSBGSVhNRSBhYm91dCB0aGUgc2VyaW91cyBlcnJvcnMgdGhhdCBnbwp1bmRpYWdu b3NlZC4KKHVubG9ja19maWxlLCBGZmlsZV9sb2NrZWRfcCk6IFNpZ25hbCBzZXJpb3VzIGZh aWx1cmVzLgoqIHNyYy9scmVhZC5jIChvcGVucCk6IEJlIG1vcmUgY29uc2lzdGVudCBhYm91 dCB3aGljaAplcnJvcnMgYXJlIHNlcmlvdXMuICBFTk9FTlQgYW5kIEVOT1RESVIgYXJlIGJl bmlnbiBpbgphIHBhdGgtc2VhcmNoIGZ1bmN0aW9uOyB0aGUgb3RoZXIgZXJyb3JzIGFyZSBt b3JlIHNlcmlvdXMuCi0tLQogZG9jL2xpc3ByZWYvZmlsZXMudGV4aSB8ICAgMiArLQogc3Jj L2NhbGxwcm9jLmMgICAgICAgICB8ICAgOCArLQogc3JjL2NoYXJzZXQuYyAgICAgICAgICB8 ICAgMiArLQogc3JjL2RpcmVkLmMgICAgICAgICAgICB8ICAxMyArLQogc3JjL2VtYWNzLmMg ICAgICAgICAgICB8ICAgMiArLQogc3JjL2ZpbGVpby5jICAgICAgICAgICB8IDI4NCArKysr KysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLQogc3JjL2ZpbGVsb2NrLmMg ICAgICAgICB8ICA4OCArKysrKystLS0tLS0tCiBzcmMvbGlzcC5oICAgICAgICAgICAgIHwg ICA3ICstCiBzcmMvbHJlYWQuYyAgICAgICAgICAgIHwgICA4ICstCiA5IGZpbGVzIGNoYW5n ZWQsIDIxOSBpbnNlcnRpb25zKCspLCAxOTUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEv ZG9jL2xpc3ByZWYvZmlsZXMudGV4aSBiL2RvYy9saXNwcmVmL2ZpbGVzLnRleGkKaW5kZXgg MThhMWY0OTA4ZC4uZGEyZTFlOTBhZSAxMDA2NDQKLS0tIGEvZG9jL2xpc3ByZWYvZmlsZXMu dGV4aQorKysgYi9kb2MvbGlzcHJlZi9maWxlcy50ZXhpCkBAIC0xMjYyLDcgKzEyNjIsNyBA QCBGaWxlIEF0dHJpYnV0ZXMKIEBkZWZ1biBmaWxlLWF0dHJpYnV0ZXMgZmlsZW5hbWUgJm9w dGlvbmFsIGlkLWZvcm1hdAogQGFuY2hvcntEZWZpbml0aW9uIG9mIGZpbGUtYXR0cmlidXRl c30KIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGxpc3Qgb2YgYXR0cmlidXRlcyBvZiBmaWxl IEB2YXJ7ZmlsZW5hbWV9LiAgSWYKLXRoZSBzcGVjaWZpZWQgZmlsZSdzIGF0dHJpYnV0ZXMg Y2Fubm90IGJlIGFjY2Vzc2VkLCBpdCByZXR1cm5zIEBjb2Rle25pbH0uCit0aGUgc3BlY2lm aWVkIGZpbGUgZG9lcyBub3QgZXhpc3QsIGl0IHJldHVybnMgQGNvZGV7bmlsfS4KIFRoaXMg ZnVuY3Rpb24gZG9lcyBub3QgZm9sbG93IHN5bWJvbGljIGxpbmtzLgogVGhlIG9wdGlvbmFs IHBhcmFtZXRlciBAdmFye2lkLWZvcm1hdH0gc3BlY2lmaWVzIHRoZSBwcmVmZXJyZWQgZm9y bWF0CiBvZiBhdHRyaWJ1dGVzIEBhY3Jvbnlte1VJRH0gYW5kIEBhY3Jvbnlte0dJRH0gKHNl ZSBiZWxvdyktLS10aGUKZGlmZiAtLWdpdCBhL3NyYy9jYWxscHJvYy5jIGIvc3JjL2NhbGxw cm9jLmMKaW5kZXggNDQ3M2IxOWEyOS4uY2M5YmU1NjYxYSAxMDA2NDQKLS0tIGEvc3JjL2Nh bGxwcm9jLmMKKysrIGIvc3JjL2NhbGxwcm9jLmMKQEAgLTExOSw3ICsxMTksNyBAQCBlbmNv ZGVfY3VycmVudF9kaXJlY3RvcnkgKHZvaWQpCiAgIGRpciA9IGV4cGFuZF9hbmRfZGlyX3Rv X2ZpbGUgKGRpcik7CiAgIGRpciA9IEVOQ09ERV9GSUxFIChyZW1vdmVfc2xhc2hfY29sb24g KGRpcikpOwogCi0gIGlmICghIGZpbGVfYWNjZXNzaWJsZV9kaXJlY3RvcnlfcCAoZGlyKSkK KyAgaWYgKE5JTFAgKGZpbGVfYWNjZXNzaWJsZV9kaXJlY3RvcnlfcCAoY3VyZGlyLCBkaXIp KSkKICAgICByZXBvcnRfZmlsZV9lcnJvciAoIlNldHRpbmcgY3VycmVudCBkaXJlY3Rvcnki LCBjdXJkaXIpOwogCiAgIHJldHVybiBkaXI7CkBAIC0xNTgxLDEyICsxNTgxLDEyIEBAIGlu aXRfY2FsbHByb2MgKHZvaWQpCiAgIGlmICghd2lsbF9kdW1wX3AgKCkpCiAgICAgewogICAg ICAgdGVtcGRpciA9IEZkaXJlY3RvcnlfZmlsZV9uYW1lIChWZXhlY19kaXJlY3RvcnkpOwot ICAgICAgaWYgKCEgZmlsZV9hY2Nlc3NpYmxlX2RpcmVjdG9yeV9wICh0ZW1wZGlyKSkKKyAg ICAgIGlmIChOSUxQIChmaWxlX2FjY2Vzc2libGVfZGlyZWN0b3J5X3AgKHRlbXBkaXIsIHRl bXBkaXIpKSkKIAlkaXJfd2FybmluZyAoImFyY2gtZGVwZW5kZW50IGRhdGEgZGlyIiwgVmV4 ZWNfZGlyZWN0b3J5KTsKICAgICB9CiAKICAgdGVtcGRpciA9IEZkaXJlY3RvcnlfZmlsZV9u YW1lIChWZGF0YV9kaXJlY3RvcnkpOwotICBpZiAoISBmaWxlX2FjY2Vzc2libGVfZGlyZWN0 b3J5X3AgKHRlbXBkaXIpKQorICBpZiAoTklMUCAoZmlsZV9hY2Nlc3NpYmxlX2RpcmVjdG9y eV9wICh0ZW1wZGlyLCB0ZW1wZGlyKSkpCiAgICAgZGlyX3dhcm5pbmcgKCJhcmNoLWluZGVw ZW5kZW50IGRhdGEgZGlyIiwgVmRhdGFfZGlyZWN0b3J5KTsKIAogICBzaCA9IGdldGVudiAo IlNIRUxMIik7CkBAIC0xNTk2LDcgKzE1OTYsNyBAQCBpbml0X2NhbGxwcm9jICh2b2lkKQog ICBpZiAoUEFUSF9HQU1FKQogICAgIHsKICAgICAgIExpc3BfT2JqZWN0IHBhdGhfZ2FtZSA9 IGJ1aWxkX3VuaWJ5dGVfc3RyaW5nIChQQVRIX0dBTUUpOwotICAgICAgaWYgKGZpbGVfYWNj ZXNzaWJsZV9kaXJlY3RvcnlfcCAocGF0aF9nYW1lKSkKKyAgICAgIGlmICghTklMUCAoZmls ZV9hY2Nlc3NpYmxlX2RpcmVjdG9yeV9wIChwYXRoX2dhbWUsIHBhdGhfZ2FtZSkpKQogCWdh bWVkaXIgPSBwYXRoX2dhbWU7CiAgICAgfQogICBWc2hhcmVkX2dhbWVfc2NvcmVfZGlyZWN0 b3J5ID0gZ2FtZWRpcjsKZGlmZiAtLWdpdCBhL3NyYy9jaGFyc2V0LmMgYi9zcmMvY2hhcnNl dC5jCmluZGV4IDhjNTQzODFkYzQuLjkzNTM3ODZjY2EgMTAwNjQ0Ci0tLSBhL3NyYy9jaGFy c2V0LmMKKysrIGIvc3JjL2NoYXJzZXQuYwpAQCAtMjI4OCw3ICsyMjg4LDcgQEAgaW5pdF9j aGFyc2V0ICh2b2lkKQogewogICBMaXNwX09iamVjdCB0ZW1wZGlyOwogICB0ZW1wZGlyID0g RmV4cGFuZF9maWxlX25hbWUgKGJ1aWxkX3N0cmluZyAoImNoYXJzZXRzIiksIFZkYXRhX2Rp cmVjdG9yeSk7Ci0gIGlmICghIGZpbGVfYWNjZXNzaWJsZV9kaXJlY3RvcnlfcCAodGVtcGRp cikpCisgIGlmIChOSUxQIChmaWxlX2FjY2Vzc2libGVfZGlyZWN0b3J5X3AgKHRlbXBkaXIs IHRlbXBkaXIpKSkKICAgICB7CiAgICAgICAvKiBUaGlzIHVzZWQgdG8gYmUgbm9uLWZhdGFs IChkaXJfd2FybmluZyksIGJ1dCBpdCBzaG91bGQgbm90CiAgICAgICAgICBoYXBwZW4sIGFu ZCBpZiBpdCBkb2VzIHNvb25lciBvciBsYXRlciBpdCB3aWxsIGNhdXNlIHNvbWUKZGlmZiAt LWdpdCBhL3NyYy9kaXJlZC5jIGIvc3JjL2RpcmVkLmMKaW5kZXggY2VjNzlhYjQ2Yi4uMzc4 OWMyZDdlNSAxMDA2NDQKLS0tIGEvc3JjL2RpcmVkLmMKKysrIGIvc3JjL2RpcmVkLmMKQEAg LTg1MSw3ICs4NTEsNyBAQCBzdGF0X2duYW1lIChzdHJ1Y3Qgc3RhdCAqc3QpCiAKIERFRlVO ICgiZmlsZS1hdHRyaWJ1dGVzIiwgRmZpbGVfYXR0cmlidXRlcywgU2ZpbGVfYXR0cmlidXRl cywgMSwgMiwgMCwKICAgICAgICBkb2M6IC8qIFJldHVybiBhIGxpc3Qgb2YgYXR0cmlidXRl cyBvZiBmaWxlIEZJTEVOQU1FLgotVmFsdWUgaXMgbmlsIGlmIHNwZWNpZmllZCBmaWxlIGNh bm5vdCBiZSBvcGVuZWQuCitWYWx1ZSBpcyBuaWwgaWYgc3BlY2lmaWVkIGZpbGUgZG9lcyBu b3QgZXhpc3QuCiAKIElELUZPUk1BVCBzcGVjaWZpZXMgdGhlIHByZWZlcnJlZCBmb3JtYXQg b2YgYXR0cmlidXRlcyB1aWQgYW5kIGdpZCAoc2VlCiBiZWxvdykgLSB2YWxpZCB2YWx1ZXMg YXJlIGBzdHJpbmcnIGFuZCBgaW50ZWdlcicuICBUaGUgbGF0dGVyIGlzIHRoZQpAQCAtOTcx LDE1ICs5NzEsMTggQEAgZmlsZV9hdHRyaWJ1dGVzIChpbnQgZmQsIGNoYXIgY29uc3QgKm5h bWUsCiAJIGluZm9ybWF0aW9uIHRvIGJlIGFjY3VyYXRlLiAgKi8KICAgICAgIHczMl9zdGF0 X2dldF9vd25lcl9ncm91cCA9IDE7CiAjZW5kaWYKLSAgICAgIGlmIChmc3RhdGF0IChmZCwg bmFtZSwgJnMsIEFUX1NZTUxJTktfTk9GT0xMT1cpID09IDApCi0JZXJyID0gMDsKKyAgICAg IGVyciA9IGZzdGF0YXQgKGZkLCBuYW1lLCAmcywgQVRfU1lNTElOS19OT0ZPTExPVykgPT0g MCA/IDAgOiBlcnJubzsKICNpZmRlZiBXSU5ET1dTTlQKICAgICAgIHczMl9zdGF0X2dldF9v d25lcl9ncm91cCA9IDA7CiAjZW5kaWYKICAgICB9CiAKICAgaWYgKGVyciAhPSAwKQotICAg IHJldHVybiB1bmJpbmRfdG8gKGNvdW50LCBRbmlsKTsKKyAgICB7CisgICAgICBpZiAoZXJy ID09IEVOT0VOVCB8fCBlcnIgPT0gRU5PVERJUikKKwlyZXR1cm4gdW5iaW5kX3RvIChjb3Vu dCwgUW5pbCk7CisgICAgICByZXBvcnRfZmlsZV9lcnJubyAoIkdldHRpbmcgYXR0cmlidXRl cyIsIGZpbGVuYW1lLCBlcnIpOworICAgIH0KIAogICBMaXNwX09iamVjdCBmaWxlX3R5cGU7 CiAgIGlmIChTX0lTTE5LIChzLnN0X21vZGUpKQpAQCAtOTg4LDcgKzk5MSw3IEBAIGZpbGVf YXR0cmlidXRlcyAoaW50IGZkLCBjaGFyIGNvbnN0ICpuYW1lLAogCSBzeW1saW5rIGlzIHJl cGxhY2VkIGJldHdlZW4gdGhlIGNhbGwgdG8gZnN0YXRhdCBhbmQgdGhlIGNhbGwKIAkgdG8g ZW1hY3NfcmVhZGxpbmthdC4gIERldGVjdCB0aGlzIHJhY2UgdW5sZXNzIHRoZSByZXBsYWNl bWVudAogCSBpcyBhbHNvIGEgc3ltbGluay4gICovCi0gICAgICBmaWxlX3R5cGUgPSBlbWFj c19yZWFkbGlua2F0IChmZCwgbmFtZSk7CisgICAgICBmaWxlX3R5cGUgPSBlbWFjc19yZWFk bGlua2F0IChmZCwgZmlsZW5hbWUsIG5hbWUpOwogICAgICAgaWYgKE5JTFAgKGZpbGVfdHlw ZSkpCiAJcmV0dXJuIHVuYmluZF90byAoY291bnQsIFFuaWwpOwogICAgIH0KZGlmZiAtLWdp dCBhL3NyYy9lbWFjcy5jIGIvc3JjL2VtYWNzLmMKaW5kZXggNWE1MjY2ODdiMS4uMjYzMDZm N2NmZSAxMDA2NDQKLS0tIGEvc3JjL2VtYWNzLmMKKysrIGIvc3JjL2VtYWNzLmMKQEAgLTc0 Niw3ICs3NDYsNyBAQCBsb2FkX3BkdW1wX2ZpbmRfZXhlY3V0YWJsZSAoY2hhciBjb25zdCAq YXJndjAsIHB0cmRpZmZfdCAqY2FuZGlkYXRlX3NpemUpCiAgICAgICBjYW5kaWRhdGVbcGF0 aF9wYXJ0X2xlbmd0aF0gPSBESVJFQ1RPUllfU0VQOwogICAgICAgbWVtY3B5IChjYW5kaWRh dGUgKyBwYXRoX3BhcnRfbGVuZ3RoICsgMSwgYXJndjAsIGFyZ3YwX2xlbmd0aCArIDEpOwog ICAgICAgc3RydWN0IHN0YXQgc3Q7Ci0gICAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZSAoY2Fu ZGlkYXRlKQorICAgICAgaWYgKGZhY2Nlc3NhdCAoQVRfRkRDV0QsIGNhbmRpZGF0ZSwgWF9P SywgQVRfRUFDQ0VTUykgPT0gMAogCSAgJiYgc3RhdCAoY2FuZGlkYXRlLCAmc3QpID09IDAg JiYgU19JU1JFRyAoc3Quc3RfbW9kZSkpCiAJcmV0dXJuIGNhbmRpZGF0ZTsKICAgICAgICpj YW5kaWRhdGUgPSAnXDAnOwpkaWZmIC0tZ2l0IGEvc3JjL2ZpbGVpby5jIGIvc3JjL2ZpbGVp by5jCmluZGV4IGNiYzBjODljZjMuLjMyNjdiYTg1MDUgMTAwNjQ0Ci0tLSBhL3NyYy9maWxl aW8uYworKysgYi9zcmMvZmlsZWlvLmMKQEAgLTE0MCw1MyArMTQwLDY0IEBAICNkZWZpbmUg RFJJVkVfTEVUVEVSKHgpIGNfdG9sb3dlciAoeCkKIAkJICAgICBzdHJ1Y3QgY29kaW5nX3N5 c3RlbSAqKTsKIAogDAotLyogUmV0dXJuIHRydWUgaWYgRklMRU5BTUUgZXhpc3RzLCBvdGhl cndpc2UgcmV0dXJuIGZhbHNlIGFuZCBzZXQgZXJybm8uICAqLworLyogVGVzdCB3aGV0aGVy IEZJTEUgaXMgYWNjZXNzaWJsZSBmb3IgQU1PREUuCisgICBFTkNPREVEX0ZJTEUgaXMgRklM RSwgZW5jb2RlZCBmb3IgdGhlIHN5c3RlbS4KKyAgIFJldHVybiB0IGlmIGFjY2Vzc2libGUs IG5pbCAoc2V0dGluZyBlcnJubykgaWYgYWNjZXNzIGlzIGRlbmllZC4KKyAgIFNpZ25hbCBh biBlcnJvciBpZiBhY2Nlc3NpYmlsaXR5IGNhbm5vdCBiZSBkZXRlcm1pbmVkLiAgKi8KIAot c3RhdGljIGJvb2wKLWNoZWNrX2V4aXN0aW5nIChjb25zdCBjaGFyICpmaWxlbmFtZSkKK3N0 YXRpYyBMaXNwX09iamVjdAorY2hlY2tfZmlsZV9hY2Nlc3MgKExpc3BfT2JqZWN0IGZpbGUs IGNoYXIgY29uc3QgKmVuY29kZWRfZmlsZSwgaW50IGFtb2RlKQogewotICByZXR1cm4gZmFj Y2Vzc2F0IChBVF9GRENXRCwgZmlsZW5hbWUsIEZfT0ssIEFUX0VBQ0NFU1MpID09IDA7Cisg IGlmIChmYWNjZXNzYXQgKEFUX0ZEQ1dELCBlbmNvZGVkX2ZpbGUsIGFtb2RlLCBBVF9FQUND RVNTKSA9PSAwKQorICAgIHJldHVybiBRdDsKKyAgaW50IGVyciA9IGVycm5vOworCisjaWZk ZWYgQ1lHV0lOCisgIC8qIFJldHVybiBzdWNjZXNzIGlmIGZhY2Nlc3NhdCBmYWlsZWQgYmVj YXVzZSBDeWd3aW4gY291bGRuJ3QKKyAgICAgZGV0ZXJtaW5lIHRoZSBmaWxlJ3MgVUlEIG9y IEdJRC4gICovCisgIHN0cnVjdCBzdGF0IHN0OworICBpZiAoc3RhdCAoZW5jb2RlZF9maWxl LCAmc3QpID09IDAgJiYgKHN0LnN0X3VpZCA9PSAtMSB8fCBzdC5zdF9naWQgPT0gLTEpKQor ICAgIHJldHVybiBRdDsKKyNlbmRpZgorCisgIGlmIChlcnIgPT0gRU5PRU5UIHx8IGVyciA9 PSBFTk9URElSIHx8IGVyciA9PSBFUk9GUyB8fCBlcnIgPT0gRVRYVEJTWQorICAgICAgfHwg KGVyciA9PSBFQUNDRVMgJiYgYW1vZGUgIT0gRl9PSworCSAgJiYgZmFjY2Vzc2F0IChBVF9G RENXRCwgZW5jb2RlZF9maWxlLCBGX09LLCBBVF9FQUNDRVNTKSA9PSAwKSkKKyAgICB7Cisg ICAgICBlcnJubyA9IGVycjsKKyAgICAgIHJldHVybiBRbmlsOworICAgIH0KKyAgcmVwb3J0 X2ZpbGVfZXJybm8gKCJUZXN0aW5nIGZpbGUiLCBmaWxlLCBlcnIpOwogfQogCi0vKiBSZXR1 cm4gdHJ1ZSBpZiBmaWxlIEZJTEVOQU1FIGV4aXN0cyBhbmQgY2FuIGJlIGV4ZWN1dGVkLiAg Ki8KKy8qIFJldHVybiB0IGlmIEZJTEUgZXhpc3RzLCBuaWwgKHNldHRpbmcgZXJybm8pIGlm IG5vdC4gIEVOQ09ERURfRklMRQorICAgaXMgRklMRSwgZW5jb2RlZCBmb3IgdGhlIHN5c3Rl bS4gIFNpZ25hbCBhbiBlcnJvciBpZiB0aGUgcmVzdWx0CisgICBjYW5ub3QgYmUgZGV0ZXJt aW5lZC4gICovCiAKLWJvb2wKLWNoZWNrX2V4ZWN1dGFibGUgKGNoYXIgKmZpbGVuYW1lKQor c3RhdGljIExpc3BfT2JqZWN0CitjaGVja19leGlzdGluZyAoTGlzcF9PYmplY3QgZmlsZSwg Y2hhciBjb25zdCAqZW5jb2RlZF9maWxlKQogewotICByZXR1cm4gZmFjY2Vzc2F0IChBVF9G RENXRCwgZmlsZW5hbWUsIFhfT0ssIEFUX0VBQ0NFU1MpID09IDA7CisgIHJldHVybiBjaGVj a19maWxlX2FjY2VzcyAoZmlsZSwgZW5jb2RlZF9maWxlLCBGX09LKTsKIH0KIAotLyogUmV0 dXJuIHRydWUgaWYgZmlsZSBGSUxFTkFNRSBleGlzdHMgYW5kIGNhbiBiZSBhY2Nlc3NlZAot ICAgYWNjb3JkaW5nIHRvIEFNT0RFLCB3aGljaCBzaG91bGQgaW5jbHVkZSBXX09LLgotICAg T24gZmFpbHVyZSwgcmV0dXJuIGZhbHNlIGFuZCBzZXQgZXJybm8uICAqLworLyogUmV0dXJu IHQgaWYgRklMRSBleGlzdHMgYW5kIGNhbiBiZSBhY2Nlc3NlZCwgbmlsIChzZXR0aW5nIGVy cm5vKSBpZiBub3QuCisgICBUaGUgYWNjZXNzIG1vZGUgaXMgQU1PREUsIHdoaWNoIHNob3Vs ZCBpbmNsdWRlIFdfT0suCisgICBTaWduYWwgYW4gZXJyb3IgaWYgdGhlIHJlc3VsdCBjYW5u b3QgYmUgZGV0ZXJtaW5lZC4gICovCiAKLXN0YXRpYyBib29sCi1jaGVja193cml0YWJsZSAo Y29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBhbW9kZSkKK3N0YXRpYyBMaXNwX09iamVjdAor Y2hlY2tfd3JpdGFibGUgKExpc3BfT2JqZWN0IGZpbGUsIGludCBhbW9kZSkKIHsKKyAgY2hh ciAqZmlsZW5hbWUgPSBTU0RBVEEgKEVOQ09ERV9GSUxFIChmaWxlKSk7CiAjaWZkZWYgTVNE T1MKICAgLyogRklYTUU6IGFuIGZhY2Nlc3NhdCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUg YWRkZWQgdG8gdGhlCiAgICAgIERPUy9XaW5kb3dzIHBvcnRzIGFuZCB0aGlzICNpZmRlZiBi cmFuY2ggc2hvdWxkIGJlIHJlbW92ZWQuICAqLwogICBzdHJ1Y3Qgc3RhdCBzdDsKICAgaWYg KHN0YXQgKGZpbGVuYW1lLCAmc3QpIDwgMCkKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4g UW5pbDsKICAgZXJybm8gPSBFUEVSTTsKLSAgcmV0dXJuIChzdC5zdF9tb2RlICYgU19JV1JJ VEUgfHwgU19JU0RJUiAoc3Quc3RfbW9kZSkpOworICByZXR1cm4gc3Quc3RfbW9kZSAmIFNf SVdSSVRFIHx8IFNfSVNESVIgKHN0LnN0X21vZGUpID8gUXQgOiBRbmlsOwogI2Vsc2UgLyog bm90IE1TRE9TICovCi0gIGJvb2wgcmVzID0gZmFjY2Vzc2F0IChBVF9GRENXRCwgZmlsZW5h bWUsIGFtb2RlLCBBVF9FQUNDRVNTKSA9PSAwOwotI2lmZGVmIENZR1dJTgotICAvKiBmYWNj ZXNzYXQgbWF5IGhhdmUgcmV0dXJuZWQgZmFpbHVyZSBiZWNhdXNlIEN5Z3dpbiBjb3VsZG4n dAotICAgICBkZXRlcm1pbmUgdGhlIGZpbGUncyBVSUQgb3IgR0lEOyBpZiBzbywgd2UgcmV0 dXJuIHN1Y2Nlc3MuICAqLwotICBpZiAoIXJlcykKLSAgICB7Ci0gICAgICBpbnQgZmFjY2Vz c2F0X2Vycm5vID0gZXJybm87Ci0gICAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICAgIGlmIChz dGF0IChmaWxlbmFtZSwgJnN0KSA8IDApCi0gICAgICAgIHJldHVybiAwOwotICAgICAgcmVz ID0gKHN0LnN0X3VpZCA9PSAtMSB8fCBzdC5zdF9naWQgPT0gLTEpOwotICAgICAgZXJybm8g PSBmYWNjZXNzYXRfZXJybm87Ci0gICAgfQotI2VuZGlmIC8qIENZR1dJTiAqLwotICByZXR1 cm4gcmVzOworICByZXR1cm4gY2hlY2tfZmlsZV9hY2Nlc3MgKGZpbGUsIGZpbGVuYW1lLCBh bW9kZSk7CiAjZW5kaWYgLyogbm90IE1TRE9TICovCiB9CiAMCkBAIC0yMzgyLDcgKzIzOTMs NyBAQCBpbnRlcm5hbF9kZWxldGVfZmlsZSAoTGlzcF9PYmplY3QgZmlsZW5hbWUpCiAgICBk ZXRlY3QgdGhpcz8gICovCiAKIHN0YXRpYyBib29sCi1maWxlX25hbWVfY2FzZV9pbnNlbnNp dGl2ZV9wIChjb25zdCBjaGFyICpmaWxlbmFtZSkKK2ZpbGVfbmFtZV9jYXNlX2luc2Vuc2l0 aXZlX3AgKExpc3BfT2JqZWN0IGZpbGUpCiB7CiAgIC8qIFVzZSBwYXRoY29uZiB3aXRoIF9Q Q19DQVNFX0lOU0VOU0lUSVZFIG9yIF9QQ19DQVNFX1NFTlNJVElWRSBpZgogICAgICB0aG9z ZSBmbGFncyBhcmUgYXZhaWxhYmxlLiAgQXMgb2YgdGhpcyB3cml0aW5nICgyMDE3LTA1LTIw KSwKQEAgLTIzOTAsMTQgKzI0MDEsMTkgQEAgZmlsZV9uYW1lX2Nhc2VfaW5zZW5zaXRpdmVf cCAoY29uc3QgY2hhciAqZmlsZW5hbWUpCiAgICAgIHdpdGggQ3lnd2luLTIuNi4xKSwgYW5k IG1hY09TIGlzIHRoZSBvbmx5IHBsYXRmb3JtIGtub3duIHRvCiAgICAgIHN1cHBvcnQgdGhl IGxhdHRlci4gICovCiAKLSNpZmRlZiBfUENfQ0FTRV9JTlNFTlNJVElWRQotICBpbnQgcmVz ID0gcGF0aGNvbmYgKGZpbGVuYW1lLCBfUENfQ0FTRV9JTlNFTlNJVElWRSk7CisjaWYgZGVm aW5lZCBfUENfQ0FTRV9JTlNFTlNJVElWRSB8fCBkZWZpbmVkIF9QQ19DQVNFX1NFTlNJVElW RQorICBjaGFyICpmaWxlbmFtZSA9IFNTREFUQSAoRU5DT0RFX0ZJTEUgKGZpbGUpKTsKKyMg aWZkZWYgX1BDX0NBU0VfSU5TRU5TSVRJVkUKKyAgbG9uZyBpbnQgcmVzID0gcGF0aGNvbmYg KGZpbGVuYW1lLCBfUENfQ0FTRV9JTlNFTlNJVElWRSk7CiAgIGlmIChyZXMgPj0gMCkKICAg ICByZXR1cm4gcmVzID4gMDsKLSNlbGlmIGRlZmluZWQgX1BDX0NBU0VfU0VOU0lUSVZFCi0g IGludCByZXMgPSBwYXRoY29uZiAoZmlsZW5hbWUsIF9QQ19DQVNFX1NFTlNJVElWRSk7Cisj IGVsc2UKKyAgbG9uZyBpbnQgcmVzID0gcGF0aGNvbmYgKGZpbGVuYW1lLCBfUENfQ0FTRV9T RU5TSVRJVkUpOwogICBpZiAocmVzID49IDApCiAgICAgcmV0dXJuIHJlcyA9PSAwOworIyBl bmRpZgorICBpZiAoZXJybm8gIT0gRUlOVkFMKQorICAgIHJlcG9ydF9maWxlX2Vycm9yICgi VGVzdGluZyBmaWxlIiwgZmlsZSk7CiAjZW5kaWYKIAogI2lmIGRlZmluZWQgQ1lHV0lOIHx8 IGRlZmluZWQgRE9TX05UCkBAIC0yNDM5LDggKzI0NTUsNyBAQCBERUZVTiAoImZpbGUtbmFt ZS1jYXNlLWluc2Vuc2l0aXZlLXAiLCBGZmlsZV9uYW1lX2Nhc2VfaW5zZW5zaXRpdmVfcCwK IAkgIGZpbGVuYW1lID0gbmV3bmFtZTsKIAl9CiAgICAgfQotICBmaWxlbmFtZSA9IEVOQ09E RV9GSUxFIChmaWxlbmFtZSk7Ci0gIHJldHVybiBmaWxlX25hbWVfY2FzZV9pbnNlbnNpdGl2 ZV9wIChTU0RBVEEgKGZpbGVuYW1lKSkgPyBRdCA6IFFuaWw7CisgIHJldHVybiBmaWxlX25h bWVfY2FzZV9pbnNlbnNpdGl2ZV9wIChmaWxlbmFtZSkgPyBRdCA6IFFuaWw7CiB9CiAKIERF RlVOICgicmVuYW1lLWZpbGUiLCBGcmVuYW1lX2ZpbGUsIFNyZW5hbWVfZmlsZSwgMiwgMywK QEAgLTI1NDYsNyArMjU2MSw3IEBAIERFRlVOICgicmVuYW1lLWZpbGUiLCBGcmVuYW1lX2Zp bGUsIFNyZW5hbWVfZmlsZSwgMiwgMywKICAgICB7CiAgICAgICBMaXNwX09iamVjdCBzeW1s aW5rX3RhcmdldAogCT0gKFNfSVNMTksgKGZpbGVfc3Quc3RfbW9kZSkKLQkgICA/IGVtYWNz X3JlYWRsaW5rYXQgKEFUX0ZEQ1dELCBTU0RBVEEgKGVuY29kZWRfZmlsZSkpCisJICAgPyBl bWFjc19yZWFkbGlua2F0IChBVF9GRENXRCwgZmlsZSwgU1NEQVRBIChlbmNvZGVkX2ZpbGUp KQogCSAgIDogUW5pbCk7CiAgICAgICBpZiAoIU5JTFAgKHN5bWxpbmtfdGFyZ2V0KSkKIAlG bWFrZV9zeW1ib2xpY19saW5rIChzeW1saW5rX3RhcmdldCwgbmV3bmFtZSwgb2tfaWZfYWxy ZWFkeV9leGlzdHMpOwpAQCAtMjcxNyw5ICsyNzMyLDIwIEBAIERFRlVOICgiZmlsZS1leGlz dHMtcCIsIEZmaWxlX2V4aXN0c19wLCBTZmlsZV9leGlzdHNfcCwgMSwgMSwgMCwKICAgICAg IHJldHVybiByZXN1bHQ7CiAgICAgfQogCi0gIGFic25hbWUgPSBFTkNPREVfRklMRSAoYWJz bmFtZSk7CisgIHJldHVybiBjaGVja19leGlzdGluZyAoYWJzbmFtZSwgU1NEQVRBIChFTkNP REVfRklMRSAoYWJzbmFtZSkpKTsKK30KKworLyogUmV0dXJuIHQgaWYgRklMRSBleGlzdHMg YW5kIGlzIGFjY2Vzc2libGUgdmlhIE9QRVJBVElPTiBhbmQgQU1PREUsCisgICBuaWwgaWYg bm90LiAgU2lnbmFsIGFuIGVycm9yIGlmIHRoZSByZXN1bHQgY2Fubm90IGJlIGRldGVybWlu ZWQuICAqLwogCi0gIHJldHVybiBjaGVja19leGlzdGluZyAoU1NEQVRBIChhYnNuYW1lKSkg PyBRdCA6IFFuaWw7CitzdGF0aWMgTGlzcF9PYmplY3QKK2ZpbGVfYWNjZXNzaWJsZV9wIChM aXNwX09iamVjdCBmaWxlLCBMaXNwX09iamVjdCBvcGVyYXRpb24sIGludCBhbW9kZSkKK3sK KyAgTGlzcF9PYmplY3QgYWJzbmFtZSA9IEZleHBhbmRfZmlsZV9uYW1lIChmaWxlLCBRbmls KTsKKyAgTGlzcF9PYmplY3QgaGFuZGxlciA9IEZmaW5kX2ZpbGVfbmFtZV9oYW5kbGVyIChh YnNuYW1lLCBvcGVyYXRpb24pOworICBpZiAoIU5JTFAgKGhhbmRsZXIpKQorICAgIHJldHVy biBjYWxsMiAoaGFuZGxlciwgb3BlcmF0aW9uLCBhYnNuYW1lKTsKKyAgcmV0dXJuIGNoZWNr X2ZpbGVfYWNjZXNzIChhYnNuYW1lLCBTU0RBVEEgKEVOQ09ERV9GSUxFIChhYnNuYW1lKSks IGFtb2RlKTsKIH0KIAogREVGVU4gKCJmaWxlLWV4ZWN1dGFibGUtcCIsIEZmaWxlX2V4ZWN1 dGFibGVfcCwgU2ZpbGVfZXhlY3V0YWJsZV9wLCAxLCAxLCAwLApAQCAtMjcyOSwyMSArMjc1 NSw3IEBAIERFRlVOICgiZmlsZS1leGVjdXRhYmxlLXAiLCBGZmlsZV9leGVjdXRhYmxlX3As IFNmaWxlX2V4ZWN1dGFibGVfcCwgMSwgMSwgMCwKIHB1cnBvc2UsIHRob3VnaC4pICAqLykK ICAgKExpc3BfT2JqZWN0IGZpbGVuYW1lKQogewotICBMaXNwX09iamVjdCBhYnNuYW1lOwot ICBMaXNwX09iamVjdCBoYW5kbGVyOwotCi0gIENIRUNLX1NUUklORyAoZmlsZW5hbWUpOwot ICBhYnNuYW1lID0gRmV4cGFuZF9maWxlX25hbWUgKGZpbGVuYW1lLCBRbmlsKTsKLQotICAv KiBJZiB0aGUgZmlsZSBuYW1lIGhhcyBzcGVjaWFsIGNvbnN0cnVjdHMgaW4gaXQsCi0gICAg IGNhbGwgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZSBuYW1lIGhhbmRsZXIuICAqLwotICBoYW5k bGVyID0gRmZpbmRfZmlsZV9uYW1lX2hhbmRsZXIgKGFic25hbWUsIFFmaWxlX2V4ZWN1dGFi bGVfcCk7Ci0gIGlmICghTklMUCAoaGFuZGxlcikpCi0gICAgcmV0dXJuIGNhbGwyIChoYW5k bGVyLCBRZmlsZV9leGVjdXRhYmxlX3AsIGFic25hbWUpOwotCi0gIGFic25hbWUgPSBFTkNP REVfRklMRSAoYWJzbmFtZSk7Ci0KLSAgcmV0dXJuIChjaGVja19leGVjdXRhYmxlIChTU0RB VEEgKGFic25hbWUpKSA/IFF0IDogUW5pbCk7CisgIHJldHVybiBmaWxlX2FjY2Vzc2libGVf cCAoZmlsZW5hbWUsIFFmaWxlX2V4ZWN1dGFibGVfcCwgWF9PSyk7CiB9CiAKIERFRlVOICgi ZmlsZS1yZWFkYWJsZS1wIiwgRmZpbGVfcmVhZGFibGVfcCwgU2ZpbGVfcmVhZGFibGVfcCwg MSwgMSwgMCwKQEAgLTI3NTEsMjggKzI3NjMsMTQgQEAgREVGVU4gKCJmaWxlLXJlYWRhYmxl LXAiLCBGZmlsZV9yZWFkYWJsZV9wLCBTZmlsZV9yZWFkYWJsZV9wLCAxLCAxLCAwLAogU2Vl IGFsc28gYGZpbGUtZXhpc3RzLXAnIGFuZCBgZmlsZS1hdHRyaWJ1dGVzJy4gICovKQogICAo TGlzcF9PYmplY3QgZmlsZW5hbWUpCiB7Ci0gIExpc3BfT2JqZWN0IGFic25hbWU7Ci0gIExp c3BfT2JqZWN0IGhhbmRsZXI7Ci0KLSAgQ0hFQ0tfU1RSSU5HIChmaWxlbmFtZSk7Ci0gIGFi c25hbWUgPSBGZXhwYW5kX2ZpbGVfbmFtZSAoZmlsZW5hbWUsIFFuaWwpOwotCi0gIC8qIElm IHRoZSBmaWxlIG5hbWUgaGFzIHNwZWNpYWwgY29uc3RydWN0cyBpbiBpdCwKLSAgICAgY2Fs bCB0aGUgY29ycmVzcG9uZGluZyBmaWxlIG5hbWUgaGFuZGxlci4gICovCi0gIGhhbmRsZXIg PSBGZmluZF9maWxlX25hbWVfaGFuZGxlciAoYWJzbmFtZSwgUWZpbGVfcmVhZGFibGVfcCk7 Ci0gIGlmICghTklMUCAoaGFuZGxlcikpCi0gICAgcmV0dXJuIGNhbGwyIChoYW5kbGVyLCBR ZmlsZV9yZWFkYWJsZV9wLCBhYnNuYW1lKTsKLQotICBhYnNuYW1lID0gRU5DT0RFX0ZJTEUg KGFic25hbWUpOwotICByZXR1cm4gKGZhY2Nlc3NhdCAoQVRfRkRDV0QsIFNTREFUQSAoYWJz bmFtZSksIFJfT0ssIEFUX0VBQ0NFU1MpID09IDAKLQkgID8gUXQgOiBRbmlsKTsKKyAgcmV0 dXJuIGZpbGVfYWNjZXNzaWJsZV9wIChmaWxlbmFtZSwgUWZpbGVfcmVhZGFibGVfcCwgUl9P Syk7CiB9CiAKIERFRlVOICgiZmlsZS13cml0YWJsZS1wIiwgRmZpbGVfd3JpdGFibGVfcCwg U2ZpbGVfd3JpdGFibGVfcCwgMSwgMSwgMCwKICAgICAgICBkb2M6IC8qIFJldHVybiB0IGlm IGZpbGUgRklMRU5BTUUgY2FuIGJlIHdyaXR0ZW4gb3IgY3JlYXRlZCBieSB5b3UuICAqLykK ICAgKExpc3BfT2JqZWN0IGZpbGVuYW1lKQogewotICBMaXNwX09iamVjdCBhYnNuYW1lLCBk aXIsIGVuY29kZWQ7CisgIExpc3BfT2JqZWN0IGFic25hbWUsIGRpcjsKICAgTGlzcF9PYmpl Y3QgaGFuZGxlcjsKIAogICBDSEVDS19TVFJJTkcgKGZpbGVuYW1lKTsKQEAgLTI3ODQsMTEg KzI3ODIsOSBAQCBERUZVTiAoImZpbGUtd3JpdGFibGUtcCIsIEZmaWxlX3dyaXRhYmxlX3As IFNmaWxlX3dyaXRhYmxlX3AsIDEsIDEsIDAsCiAgIGlmICghTklMUCAoaGFuZGxlcikpCiAg ICAgcmV0dXJuIGNhbGwyIChoYW5kbGVyLCBRZmlsZV93cml0YWJsZV9wLCBhYnNuYW1lKTsK IAotICBlbmNvZGVkID0gRU5DT0RFX0ZJTEUgKGFic25hbWUpOwotICBpZiAoY2hlY2tfd3Jp dGFibGUgKFNTREFUQSAoZW5jb2RlZCksIFdfT0spKQotICAgIHJldHVybiBRdDsKLSAgaWYg KGVycm5vICE9IEVOT0VOVCkKLSAgICByZXR1cm4gUW5pbDsKKyAgTGlzcF9PYmplY3Qgd3Jp dGFibGUgPSBjaGVja193cml0YWJsZSAoYWJzbmFtZSwgV19PSyk7CisgIGlmICghTklMUCAo d3JpdGFibGUpIHx8IGVycm5vICE9IEVOT0VOVCkKKyAgICByZXR1cm4gd3JpdGFibGU7CiAK ICAgZGlyID0gRmZpbGVfbmFtZV9kaXJlY3RvcnkgKGFic25hbWUpOwogICBlYXNzZXJ0ICgh TklMUCAoZGlyKSk7CkBAIC0yNzk2LDE0ICsyNzkyLDEzIEBAIERFRlVOICgiZmlsZS13cml0 YWJsZS1wIiwgRmZpbGVfd3JpdGFibGVfcCwgU2ZpbGVfd3JpdGFibGVfcCwgMSwgMSwgMCwK ICAgZGlyID0gRmRpcmVjdG9yeV9maWxlX25hbWUgKGRpcik7CiAjZW5kaWYgLyogTVNET1Mg Ki8KIAotICBkaXIgPSBFTkNPREVfRklMRSAoZGlyKTsKICNpZmRlZiBXSU5ET1dTTlQKICAg LyogVGhlIHJlYWQtb25seSBhdHRyaWJ1dGUgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkgZG9l c24ndCBhZmZlY3QKICAgICAgd2hldGhlciBhIGZpbGUgb3IgZGlyZWN0b3J5IGNhbiBiZSBj cmVhdGVkIHdpdGhpbiBpdC4gIFNvbWUgZGF5IHdlCiAgICAgIHNob3VsZCBjaGVjayBBQ0xz IHRob3VnaCwgd2hpY2ggZG8gYWZmZWN0IHRoaXMuICAqLwotICByZXR1cm4gZmlsZV9kaXJl Y3RvcnlfcCAoZGlyKSA/IFF0IDogUW5pbDsKKyAgcmV0dXJuIGZpbGVfZGlyZWN0b3J5X3Ag KGRpciwgRU5DT0RFX0ZJTEUgKGRpcikpOwogI2Vsc2UKLSAgcmV0dXJuIGNoZWNrX3dyaXRh YmxlIChTU0RBVEEgKGRpciksIFdfT0sgfCBYX09LKSA/IFF0IDogUW5pbDsKKyAgcmV0dXJu IGNoZWNrX3dyaXRhYmxlIChkaXIsIFdfT0sgfCBYX09LKTsKICNlbmRpZgogfQogDApAQCAt MjgzNCwxOSArMjgyOSwzMSBAQCBERUZVTiAoImFjY2Vzcy1maWxlIiwgRmFjY2Vzc19maWxl LCBTYWNjZXNzX2ZpbGUsIDIsIDIsIDAsCiAgIHJldHVybiBRbmlsOwogfQogDAotLyogUmVs YXRpdmUgdG8gZGlyZWN0b3J5IEZELCByZXR1cm4gdGhlIHN5bWJvbGljIGxpbmsgdmFsdWUg b2YgRklMRU5BTUUuCi0gICBPbiBmYWlsdXJlLCByZXR1cm4gbmlsLiAgKi8KKy8qIFJlbGF0 aXZlIHRvIGRpcmVjdG9yeSBGRCwgcmV0dXJuIHRoZSBzeW1ib2xpYyBsaW5rIHZhbHVlIG9m IEZJTEUuCisgICBJZiBGSUxFIGlzIG5vdCBhIHN5bWJvbGljIGxpbmssIHJldHVybiBuaWwu CisgICBFTkNPREVEX0ZJTEUgaXMgRklMRSwgZW5jb2RlZCBmb3IgdGhlIHN5c3RlbS4KKyAg IFNpZ25hbCBhbiBlcnJvciBvbiBmYWlsdXJlLiAgKi8KIExpc3BfT2JqZWN0Ci1lbWFjc19y ZWFkbGlua2F0IChpbnQgZmQsIGNoYXIgY29uc3QgKmZpbGVuYW1lKQorZW1hY3NfcmVhZGxp bmthdCAoaW50IGZkLCBMaXNwX09iamVjdCBmaWxlLCBjaGFyIGNvbnN0ICplbmNvZGVkX2Zp bGUpCiB7CiAgIHN0YXRpYyBzdHJ1Y3QgYWxsb2NhdG9yIGNvbnN0IGVtYWNzX25vcmVhbGxv Y19hbGxvY2F0b3IgPQogICAgIHsgeG1hbGxvYywgTlVMTCwgeGZyZWUsIG1lbW9yeV9mdWxs IH07CiAgIExpc3BfT2JqZWN0IHZhbDsKICAgY2hhciByZWFkbGlua19idWZbMTAyNF07Ci0g IGNoYXIgKmJ1ZiA9IGNhcmVhZGxpbmthdCAoZmQsIGZpbGVuYW1lLCByZWFkbGlua19idWYs IHNpemVvZiByZWFkbGlua19idWYsCisgIGNoYXIgKmJ1ZiA9IGNhcmVhZGxpbmthdCAoZmQs IGVuY29kZWRfZmlsZSwKKwkJCSAgICByZWFkbGlua19idWYsIHNpemVvZiByZWFkbGlua19i dWYsCiAJCQkgICAgJmVtYWNzX25vcmVhbGxvY19hbGxvY2F0b3IsIHJlYWRsaW5rYXQpOwog ICBpZiAoIWJ1ZikKLSAgICByZXR1cm4gUW5pbDsKKyAgICB7CisgICAgICBpZiAoZXJybm8g PT0gRUlOVkFMIHx8IGVycm5vID09IEVOT0VOVCB8fCBlcnJubyA9PSBFTk9URElSKQorCXJl dHVybiBRbmlsOworI2lmZGVmIENZR1dJTgorICAgICAgLyogV29yayBhcm91bmQgQ3lnd2lu IGJ1Z3MuICAqLworICAgICAgaWYgKGVycm5vID09IEVJTyB8fCBlcnJubyA9PSBFQUNDRVMp CisJcmV0dXJuIFFuaWw7CisjZW5kaWYKKyAgICAgIHJlcG9ydF9maWxlX2Vycm9yICgiUmVh ZGluZyBzeW1ib2xpYyBsaW5rIiwgZmlsZSk7CisgICAgfQogCiAgIHZhbCA9IGJ1aWxkX3Vu aWJ5dGVfc3RyaW5nIChidWYpOwogICBpZiAoYnVmICE9IHJlYWRsaW5rX2J1ZikKQEAgLTI4 NzQsOSArMjg4MSw4IEBAIERFRlVOICgiZmlsZS1zeW1saW5rLXAiLCBGZmlsZV9zeW1saW5r X3AsIFNmaWxlX3N5bWxpbmtfcCwgMSwgMSwgMCwKICAgaWYgKCFOSUxQIChoYW5kbGVyKSkK ICAgICByZXR1cm4gY2FsbDIgKGhhbmRsZXIsIFFmaWxlX3N5bWxpbmtfcCwgZmlsZW5hbWUp OwogCi0gIGZpbGVuYW1lID0gRU5DT0RFX0ZJTEUgKGZpbGVuYW1lKTsKLQotICByZXR1cm4g ZW1hY3NfcmVhZGxpbmthdCAoQVRfRkRDV0QsIFNTREFUQSAoZmlsZW5hbWUpKTsKKyAgY2hh ciAqZW5jb2RlZF9maWxlbmFtZSA9IFNTREFUQSAoRU5DT0RFX0ZJTEUgKGZpbGVuYW1lKSk7 CisgIHJldHVybiBlbWFjc19yZWFkbGlua2F0IChBVF9GRENXRCwgZmlsZW5hbWUsIGVuY29k ZWRfZmlsZW5hbWUpOwogfQogCiBERUZVTiAoImZpbGUtZGlyZWN0b3J5LXAiLCBGZmlsZV9k aXJlY3RvcnlfcCwgU2ZpbGVfZGlyZWN0b3J5X3AsIDEsIDEsIDAsCkBAIC0yODkzLDQ5ICsy ODk5LDYwIEBAIERFRlVOICgiZmlsZS1kaXJlY3RvcnktcCIsIEZmaWxlX2RpcmVjdG9yeV9w LCBTZmlsZV9kaXJlY3RvcnlfcCwgMSwgMSwgMCwKICAgaWYgKCFOSUxQIChoYW5kbGVyKSkK ICAgICByZXR1cm4gY2FsbDIgKGhhbmRsZXIsIFFmaWxlX2RpcmVjdG9yeV9wLCBhYnNuYW1l KTsKIAotICBhYnNuYW1lID0gRU5DT0RFX0ZJTEUgKGFic25hbWUpOwotCi0gIHJldHVybiBm aWxlX2RpcmVjdG9yeV9wIChhYnNuYW1lKSA/IFF0IDogUW5pbDsKKyAgcmV0dXJuIGZpbGVf ZGlyZWN0b3J5X3AgKGFic25hbWUsIEVOQ09ERV9GSUxFIChhYnNuYW1lKSk7CiB9CiAKLS8q IFJldHVybiB0cnVlIGlmIEZJTEUgaXMgYSBkaXJlY3Rvcnkgb3IgYSBzeW1saW5rIHRvIGEg ZGlyZWN0b3J5LgotICAgT3RoZXJ3aXNlIHJldHVybiBmYWxzZSBhbmQgc2V0IGVycm5vLiAg Ki8KLWJvb2wKLWZpbGVfZGlyZWN0b3J5X3AgKExpc3BfT2JqZWN0IGZpbGUpCisvKiBSZXR1 cm4gdCBpZiBGSUxFIGlzIGEgZGlyZWN0b3J5IG9yIGEgc3ltbGluayB0byBhIGRpcmVjdG9y eSwgbmlsCisgICAoc2V0dGluZyBlcnJubykgaWYgbm90LiAgRU5DT0RFRF9GSUxFIGlzIEZJ TEUsIGVuY29kZWQgZm9yIHRoZSBzeXN0ZW0uCisgICBTaWduYWwgYW4gZXJyb3IgaWYgdGhl IHJlc3VsdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4gICovCitMaXNwX09iamVjdAorZmlsZV9k aXJlY3RvcnlfcCAoTGlzcF9PYmplY3QgZmlsZSwgTGlzcF9PYmplY3QgZW5jb2RlZF9maWxl KQogeworICBjaGFyICpmaWxlbmFtZSA9IFNTREFUQSAoZW5jb2RlZF9maWxlKTsKICNpZmRl ZiBET1NfTlQKICAgLyogVGhpcyBpcyBjaGVhcGVyIHRoYW4gJ3N0YXQnLiAgKi8KLSAgcmV0 dXJuIGZhY2Nlc3NhdCAoQVRfRkRDV0QsIFNTREFUQSAoZmlsZSksIERfT0ssIEFUX0VBQ0NF U1MpID09IDA7CisgIHJldHVybiAoZmFjY2Vzc2F0IChBVF9GRENXRCwgZmlsZW5hbWUsIERf T0ssIEFUX0VBQ0NFU1MpID09IDAKKwkgID8gUXQgOiBRbmlsKTsKICNlbHNlCisKKyAgYm9v bCB1c2VfZ2VuZXJpY19jb2RlID0gdHJ1ZTsKKwogIyBpZmRlZiBPX1BBVEgKICAgLyogVXNl IE9fUEFUSCBpZiBhdmFpbGFibGUsIGFzIGl0IGF2b2lkcyByYWNlcyBhbmQgRU9WRVJGTE9X IGlzc3Vlcy4gICovCi0gIGludCBmZCA9IG9wZW5hdCAoQVRfRkRDV0QsIFNTREFUQSAoZmls ZSksIE9fUEFUSCB8IE9fQ0xPRVhFQyB8IE9fRElSRUNUT1JZKTsKKyAgaW50IGZkID0gb3Bl bmF0IChBVF9GRENXRCwgZmlsZW5hbWUsIE9fUEFUSCB8IE9fQ0xPRVhFQyB8IE9fRElSRUNU T1JZKTsKICAgaWYgKDAgPD0gZmQpCiAgICAgewogICAgICAgZW1hY3NfY2xvc2UgKGZkKTsK LSAgICAgIHJldHVybiB0cnVlOworICAgICAgcmV0dXJuIFF0OwogICAgIH0KLSAgaWYgKGVy cm5vICE9IEVJTlZBTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIC8qIE9fUEFUSCBpcyBkZWZp bmVkIGJ1dCBldmlkZW50bHkgdGhpcyBMaW51eCBrZXJuZWwgcHJlZGF0ZXMgMi42LjM5Lgot ICAgICBGYWxsIGJhY2sgb24gZ2VuZXJpYyBQT1NJWCBjb2RlLiAgKi8KKyAgLyogSWYgZXJy bm8gPT0gRUlOVkFMLCBPX1BBVEggaXMgZGVmaW5lZCBidXQgZXZpZGVudGx5IHRoaXMgTGlu dXgKKyAgICAga2VybmVsIHByZWRhdGVzIDIuNi4zOSwgc28gZmFsbCBiYWNrIG9uIGdlbmVy aWMgUE9TSVggY29kZS4gICovCisgIHVzZV9nZW5lcmljX2NvZGUgPSBlcnJubyA9PSBFSU5W QUw7CiAjIGVuZGlmCi0gIC8qIFVzZSBmaWxlX2FjY2Vzc2libGVfZGlyZWN0b3J5LCBhcyBp dCBhdm9pZHMgc3RhdCBFT1ZFUkZMT1cKLSAgICAgcHJvYmxlbXMgYW5kIGNvdWxkIGJlIGNo ZWFwZXIuICBIb3dldmVyLCBpZiBpdCBmYWlscyBiZWNhdXNlIEZJTEUKLSAgICAgaXMgaW5h Y2Nlc3NpYmxlLCBmYWxsIGJhY2sgb24gc3RhdDsgaWYgdGhlIGxhdHRlciBmYWlscyB3aXRo Ci0gICAgIEVPVkVSRkxPVyB0aGVuIEZJTEUgbXVzdCBoYXZlIGJlZW4gYSBkaXJlY3Rvcnkg dW5sZXNzIGEgcmFjZQotICAgICBjb25kaXRpb24gb2NjdXJyZWQgKGEgcHJvYmxlbSBoYXJk IHRvIHdvcmsgYXJvdW5kIHBvcnRhYmx5KS4gICovCi0gIGlmIChmaWxlX2FjY2Vzc2libGVf ZGlyZWN0b3J5X3AgKGZpbGUpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoZXJybm8gIT0g RUFDQ0VTKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0gIGlmIChz dGF0IChTU0RBVEEgKGZpbGUpLCAmc3QpICE9IDApCi0gICAgcmV0dXJuIGVycm5vID09IEVP VkVSRkxPVzsKLSAgaWYgKFNfSVNESVIgKHN0LnN0X21vZGUpKQotICAgIHJldHVybiB0cnVl OwotICBlcnJubyA9IEVOT1RESVI7Ci0gIHJldHVybiBmYWxzZTsKKworICBpZiAodXNlX2dl bmVyaWNfY29kZSkKKyAgICB7CisgICAgICAvKiBVc2UgZmlsZV9hY2Nlc3NpYmxlX2RpcmVj dG9yeV9wLCBhcyBpdCBhdm9pZHMgc3RhdCBFT1ZFUkZMT1cKKwkgcHJvYmxlbXMgYW5kIGNv dWxkIGJlIGNoZWFwZXIuICBIb3dldmVyLCBpZiBpdCBmYWlscyBiZWNhdXNlIEZJTEUKKwkg aXMgaW5hY2Nlc3NpYmxlLCBmYWxsIGJhY2sgb24gc3RhdDsgaWYgdGhlIGxhdHRlciBmYWls cyB3aXRoCisJIEVPVkVSRkxPVyB0aGVuIEZJTEUgbXVzdCBoYXZlIGJlZW4gYSBkaXJlY3Rv cnkgdW5sZXNzIGEgcmFjZQorCSBjb25kaXRpb24gb2NjdXJyZWQgKGEgcHJvYmxlbSBoYXJk IHRvIHdvcmsgYXJvdW5kIHBvcnRhYmx5KS4gICovCisgICAgICBMaXNwX09iamVjdCBhY2Nl c3NpYmxlID0gZmlsZV9hY2Nlc3NpYmxlX2RpcmVjdG9yeV9wIChmaWxlLCBlbmNvZGVkX2Zp bGUpOworICAgICAgaWYgKCEgKE5JTFAgKGFjY2Vzc2libGUpICYmIGVycm5vID09IEVBQ0NF UykpCisJcmV0dXJuIGFjY2Vzc2libGU7CisgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICAg IGlmIChzdGF0IChmaWxlbmFtZSwgJnN0KSA9PSAwKQorCXsKKwkgIGVycm5vID0gRU5PVERJ UjsKKwkgIHJldHVybiBTX0lTRElSIChzdC5zdF9tb2RlKSA/IFF0IDogUW5pbDsKKwl9Cisg ICAgICBpZiAoZXJybm8gPT0gRU9WRVJGTE9XKQorCXJldHVybiBRdDsKKyAgICB9CisKKyAg aWYgKGVycm5vID09IEVOT0VOVCB8fCBlcnJubyA9PSBFTk9URElSKQorICAgIHJldHVybiBR bmlsOworICByZXBvcnRfZmlsZV9lcnJvciAoIlRlc3RpbmcgZmlsZSIsIGZpbGUpOwogI2Vu ZGlmCiB9CiAKQEAgLTI5NzYsMTUgKzI5OTMsMTUgQEAgREVGVU4gKCJmaWxlLWFjY2Vzc2li bGUtZGlyZWN0b3J5LXAiLCBGZmlsZV9hY2Nlc3NpYmxlX2RpcmVjdG9yeV9wLAogICAgICAg cmV0dXJuIHI7CiAgICAgfQogCi0gIGFic25hbWUgPSBFTkNPREVfRklMRSAoYWJzbmFtZSk7 Ci0gIHJldHVybiBmaWxlX2FjY2Vzc2libGVfZGlyZWN0b3J5X3AgKGFic25hbWUpID8gUXQg OiBRbmlsOworICByZXR1cm4gZmlsZV9hY2Nlc3NpYmxlX2RpcmVjdG9yeV9wIChhYnNuYW1l LCBFTkNPREVfRklMRSAoYWJzbmFtZSkpOwogfQogCi0vKiBJZiBGSUxFIGlzIGEgc2VhcmNo YWJsZSBkaXJlY3Rvcnkgb3IgYSBzeW1saW5rIHRvIGEKLSAgIHNlYXJjaGFibGUgZGlyZWN0 b3J5LCByZXR1cm4gdHJ1ZS4gIE90aGVyd2lzZSByZXR1cm4KLSAgIGZhbHNlIGFuZCBzZXQg ZXJybm8gdG8gYW4gZXJyb3IgbnVtYmVyLiAgKi8KLWJvb2wKLWZpbGVfYWNjZXNzaWJsZV9k aXJlY3RvcnlfcCAoTGlzcF9PYmplY3QgZmlsZSkKKy8qIElmIEZJTEUgaXMgYSBzZWFyY2hh YmxlIGRpcmVjdG9yeSBvciBhIHN5bWxpbmsgdG8gYSBzZWFyY2hhYmxlCisgICBkaXJlY3Rv cnksIHJldHVybiB0LiAgSWYgbm90LCByZXR1cm4gbmlsIGFuZCBzZXQgZXJybm8gdG8gYW4g ZXJyb3IKKyAgIG51bWJlci4gIEVOQ09ERURfRklMRSBpcyBGSUxFLCBlbmNvZGVkIGZvciB0 aGUgc3lzdGVtLiAgU2lnbmFsIGFuCisgICBlcnJvciBpZiB0aGUgcmVzdWx0IGNhbm5vdCBi ZSBkZXRlcm1pbmVkLiAgKi8KK0xpc3BfT2JqZWN0CitmaWxlX2FjY2Vzc2libGVfZGlyZWN0 b3J5X3AgKExpc3BfT2JqZWN0IGZpbGUsIExpc3BfT2JqZWN0IGVuY29kZWRfZmlsZSkKIHsK ICNpZmRlZiBET1NfTlQKICMgaWZkZWYgV0lORE9XU05UCkBAIC0yOTkzLDE4ICszMDEwLDE5 IEBAIGZpbGVfYWNjZXNzaWJsZV9kaXJlY3RvcnlfcCAoTGlzcF9PYmplY3QgZmlsZSkKICAg ICAgYWNjZXNzaW5nICJESVIvLiIsIHVzZWQgYmVsb3cgb24gUG9zaXggaG9zdHMsIGRvZXNu J3Qgd29yayBvbgogICAgICBXaW5kb3dzLCBiZWNhdXNlICJESVIvLiIgaXMgbm9ybWFsaXpl ZCB0byBqdXN0ICJESVIiIGJlZm9yZQogICAgICBoaXR0aW5nIHRoZSBkaXNrLiAgKi8KLSAg cmV0dXJuIChTQllURVMgKGZpbGUpID09IDAKLQkgIHx8IHczMl9hY2Nlc3NpYmxlX2RpcmVj dG9yeV9wIChTU0RBVEEgKGZpbGUpLCBTQllURVMgKGZpbGUpKSk7CisgIHJldHVybiAoKFNC WVRFUyAoZW5jb2RlZF9maWxlKSA9PSAwCisJICAgfHwgdzMyX2FjY2Vzc2libGVfZGlyZWN0 b3J5X3AgKFNTREFUQSAoZW5jb2RlZF9maWxlKSwKKwkJCQkJICBTQllURVMgKGVuY29kZWRf ZmlsZSkpKQorCSAgPyBRdCA6IFFuaWwpOwogIyBlbHNlCS8qIE1TRE9TICovCi0gIHJldHVy biBmaWxlX2RpcmVjdG9yeV9wIChmaWxlKTsKKyAgcmV0dXJuIGZpbGVfZGlyZWN0b3J5X3Ag KGZpbGUsIGVuY29kZWRfZmlsZSk7CiAjIGVuZGlmCSAvKiBNU0RPUyAqLwogI2Vsc2UJIC8q ICFET1NfTlQgKi8KICAgLyogT24gUE9TSVhpc2ggcGxhdGZvcm1zLCB1c2UganVzdCBvbmUg c3lzdGVtIGNhbGw7IHRoaXMgYXZvaWRzIGEKICAgICAgcmFjZSBhbmQgaXMgdHlwaWNhbGx5 IGZhc3Rlci4gICovCi0gIGNvbnN0IGNoYXIgKmRhdGEgPSBTU0RBVEEgKGZpbGUpOwotICBw dHJkaWZmX3QgbGVuID0gU0JZVEVTIChmaWxlKTsKKyAgY29uc3QgY2hhciAqZGF0YSA9IFNT REFUQSAoZW5jb2RlZF9maWxlKTsKKyAgcHRyZGlmZl90IGxlbiA9IFNCWVRFUyAoZW5jb2Rl ZF9maWxlKTsKICAgY2hhciBjb25zdCAqZGlyOwotICBib29sIG9rOwogICBpbnQgc2F2ZWRf ZXJybm87CiAgIFVTRV9TQUZFX0FMTE9DQTsKIApAQCAtMzAyOSw3ICszMDQ3LDcgQEAgZmls ZV9hY2Nlc3NpYmxlX2RpcmVjdG9yeV9wIChMaXNwX09iamVjdCBmaWxlKQogICAgICAgZGly ID0gYnVmOwogICAgIH0KIAotICBvayA9IGNoZWNrX2V4aXN0aW5nIChkaXIpOworICBMaXNw X09iamVjdCBvayA9IGNoZWNrX2V4aXN0aW5nIChmaWxlLCBkaXIpOwogICBzYXZlZF9lcnJu byA9IGVycm5vOwogICBTQUZFX0ZSRUUgKCk7CiAgIGVycm5vID0gc2F2ZWRfZXJybm87CkBA IC0zNDI5LDcgKzM0NDcsNyBAQCBERUZVTiAoInNldC1maWxlLXRpbWVzIiwgRnNldF9maWxl X3RpbWVzLCBTc2V0X2ZpbGVfdGltZXMsIDEsIDIsIDAsCiAgICAgICB7CiAjaWZkZWYgTVNE T1MKICAgICAgICAgLyogU2V0dGluZyB0aW1lcyBvbiBhIGRpcmVjdG9yeSBhbHdheXMgZmFp bHMuICAqLwotICAgICAgICBpZiAoZmlsZV9kaXJlY3RvcnlfcCAoZW5jb2RlZF9hYnNuYW1l KSkKKyAgICAgICAgaWYgKCFOSUxQIChmaWxlX2RpcmVjdG9yeV9wIChhYnNuYW1lLCBlbmNv ZGVkX2Fic25hbWUpKSkKICAgICAgICAgICByZXR1cm4gUW5pbDsKICNlbmRpZgogICAgICAg ICByZXBvcnRfZmlsZV9lcnJvciAoIlNldHRpbmcgZmlsZSB0aW1lcyIsIGFic25hbWUpOwpA QCAtMzYxMiw3ICszNjMwLDcgQEAgZmlsZV9vZmZzZXQgKExpc3BfT2JqZWN0IHZhbCkKIHN0 YXRpYyBzdHJ1Y3QgdGltZXNwZWMKIHRpbWVfZXJyb3JfdmFsdWUgKGludCBlcnJudW0pCiB7 Ci0gIGludCBucyA9IChlcnJudW0gPT0gRU5PRU5UIHx8IGVycm51bSA9PSBFQUNDRVMgfHwg ZXJybnVtID09IEVOT1RESVIKKyAgaW50IG5zID0gKGVycm51bSA9PSBFTk9FTlQgfHwgZXJy bnVtID09IEVOT1RESVIKIAkgICAgPyBOT05FWElTVEVOVF9NT0RUSU1FX05TRUNTCiAJICAg IDogVU5LTk9XTl9NT0RUSU1FX05TRUNTKTsKICAgcmV0dXJuIG1ha2VfdGltZXNwZWMgKDAs IG5zKTsKZGlmZiAtLWdpdCBhL3NyYy9maWxlbG9jay5jIGIvc3JjL2ZpbGVsb2NrLmMKaW5k ZXggNDYzNDlhNjNlNC4uZGIwZjg3MDEwZCAxMDA2NDQKLS0tIGEvc3JjL2ZpbGVsb2NrLmMK KysrIGIvc3JjL2ZpbGVsb2NrLmMKQEAgLTUwNCw5ICs1MDQsOSBAQCByZWFkX2xvY2tfZGF0 YSAoY2hhciAqbGZuYW1lLCBjaGFyIGxmaW5mb1tNQVhfTEZJTkZPICsgMV0pCiB9CiAKIC8q IFJldHVybiAwIGlmIG5vYm9keSBvd25zIHRoZSBsb2NrIGZpbGUgTEZOQU1FIG9yIHRoZSBs b2NrIGlzIG9ic29sZXRlLAotICAgMSBpZiBhbm90aGVyIHByb2Nlc3Mgb3ducyBpdCAoYW5k IHNldCBPV05FUiAoaWYgbm9uLW51bGwpIHRvIGluZm8pLAotICAgMiBpZiB0aGUgY3VycmVu dCBwcm9jZXNzIG93bnMgaXQsCi0gICBvciAtMSBpZiBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0 aCB0aGUgbG9ja2luZyBtZWNoYW5pc20uICAqLworICAgLTEgaWYgYW5vdGhlciBwcm9jZXNz IG93bnMgaXQgKGFuZCBzZXQgT1dORVIgKGlmIG5vbi1udWxsKSB0byBpbmZvKSwKKyAgIC0y IGlmIHRoZSBjdXJyZW50IHByb2Nlc3Mgb3ducyBpdCwKKyAgIG9yIGFuIGVycm5vIHZhbHVl IGlmIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBsb2NraW5nIG1lY2hhbmlzbS4gICov CiAKIHN0YXRpYyBpbnQKIGN1cnJlbnRfbG9ja19vd25lciAobG9ja19pbmZvX3R5cGUgKm93 bmVyLCBjaGFyICpsZm5hbWUpCkBAIC01MjUsMjMgKzUyNSwyMyBAQCBjdXJyZW50X2xvY2tf b3duZXIgKGxvY2tfaW5mb190eXBlICpvd25lciwgY2hhciAqbGZuYW1lKQogICAvKiBJZiBu b25leGlzdGVudCBsb2NrIGZpbGUsIGFsbCBpcyB3ZWxsOyBvdGhlcndpc2UsIGdvdCBzdHJh bmdlIGVycm9yLiAqLwogICBsZmluZm9sZW4gPSByZWFkX2xvY2tfZGF0YSAobGZuYW1lLCBv d25lci0+dXNlcik7CiAgIGlmIChsZmluZm9sZW4gPCAwKQotICAgIHJldHVybiBlcnJubyA9 PSBFTk9FTlQgPyAwIDogLTE7CisgICAgcmV0dXJuIGVycm5vID09IEVOT0VOVCA/IDAgOiBl cnJubzsKICAgaWYgKE1BWF9MRklORk8gPCBsZmluZm9sZW4pCi0gICAgcmV0dXJuIC0xOwor ICAgIHJldHVybiBFTkFNRVRPT0xPTkc7CiAgIG93bmVyLT51c2VyW2xmaW5mb2xlbl0gPSAw OwogCi0gIC8qIFBhcnNlIFVTRVJASE9TVC5QSUQ6Qk9PVF9USU1FLiAgSWYgY2FuJ3QgcGFy c2UsIHJldHVybiAtMS4gICovCisgIC8qIFBhcnNlIFVTRVJASE9TVC5QSUQ6Qk9PVF9USU1F LiAgSWYgY2FuJ3QgcGFyc2UsIHJldHVybiBFSU5WQUwuICAqLwogICAvKiBUaGUgVVNFUiBp cyBldmVyeXRoaW5nIGJlZm9yZSB0aGUgbGFzdCBALiAgKi8KICAgb3duZXItPmF0ID0gYXQg PSBtZW1yY2hyIChvd25lci0+dXNlciwgJ0AnLCBsZmluZm9sZW4pOwogICBpZiAoIWF0KQot ICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gRUlOVkFMOwogICBvd25lci0+ZG90ID0gZG90 ID0gc3RycmNociAoYXQsICcuJyk7CiAgIGlmICghZG90KQotICAgIHJldHVybiAtMTsKKyAg ICByZXR1cm4gRUlOVkFMOwogCiAgIC8qIFRoZSBQSUQgaXMgZXZlcnl0aGluZyBmcm9tIHRo ZSBsYXN0ICcuJyB0byB0aGUgJzonIG9yIGVxdWl2YWxlbnQuICAqLwogICBpZiAoISBjX2lz ZGlnaXQgKGRvdFsxXSkpCi0gICAgcmV0dXJuIC0xOworICAgIHJldHVybiBFSU5WQUw7CiAg IGVycm5vID0gMDsKICAgcGlkID0gc3RydG9pbWF4IChkb3QgKyAxLCAmb3duZXItPmNvbG9u LCAxMCk7CiAgIGlmIChlcnJubyA9PSBFUkFOR0UpCkBAIC01NjIsMjAgKzU2MiwyMCBAQCBj dXJyZW50X2xvY2tfb3duZXIgKGxvY2tfaW5mb190eXBlICpvd25lciwgY2hhciAqbGZuYW1l KQogCSBtaXN0YWtlbmx5IHRyYW5zbGl0ZXJhdGUgJzonIHRvIFUrRjAyMiBpbiBzeW1saW5r IGNvbnRlbnRzLgogCSBTZWUgPGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1 Zy5jZ2k/aWQ9MTM4NDE1Mz4uICAqLwogICAgICAgaWYgKCEgKGJvb3RbMF0gPT0gJ1wyMDAn ICYmIGJvb3RbMV0gPT0gJ1wyNDInKSkKLQlyZXR1cm4gLTE7CisJcmV0dXJuIEVJTlZBTDsK ICAgICAgIGJvb3QgKz0gMjsKICAgICAgIEZBTExUSFJPVUdIOwogICAgIGNhc2UgJzonOgog ICAgICAgaWYgKCEgY19pc2RpZ2l0IChib290WzBdKSkKLQlyZXR1cm4gLTE7CisJcmV0dXJu IEVJTlZBTDsKICAgICAgIGJvb3RfdGltZSA9IHN0cnRvaW1heCAoYm9vdCwgJmxmaW5mb19l bmQsIDEwKTsKICAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAt MTsKKyAgICAgIHJldHVybiBFSU5WQUw7CiAgICAgfQogICBpZiAobGZpbmZvX2VuZCAhPSBv d25lci0+dXNlciArIGxmaW5mb2xlbikKLSAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIEVJ TlZBTDsKIAogICAvKiBPbiBjdXJyZW50IGhvc3Q/ICAqLwogICBMaXNwX09iamVjdCBzeXN0 ZW1fbmFtZSA9IEZzeXN0ZW1fbmFtZSAoKTsKQEAgLTU4NCwyMiArNTg0LDIyIEBAIGN1cnJl bnRfbG9ja19vd25lciAobG9ja19pbmZvX3R5cGUgKm93bmVyLCBjaGFyICpsZm5hbWUpCiAg ICAgICAmJiBtZW1jbXAgKGF0ICsgMSwgU1NEQVRBIChzeXN0ZW1fbmFtZSksIFNCWVRFUyAo c3lzdGVtX25hbWUpKSA9PSAwKQogICAgIHsKICAgICAgIGlmIChwaWQgPT0gZ2V0cGlkICgp KQotICAgICAgICByZXQgPSAyOyAvKiBXZSBvd24gaXQuICAqLworICAgICAgICByZXQgPSAt MjsgLyogV2Ugb3duIGl0LiAgKi8KICAgICAgIGVsc2UgaWYgKDAgPCBwaWQgJiYgcGlkIDw9 IFRZUEVfTUFYSU1VTSAocGlkX3QpCiAgICAgICAgICAgICAgICAmJiAoa2lsbCAocGlkLCAw KSA+PSAwIHx8IGVycm5vID09IEVQRVJNKQogCSAgICAgICAmJiAoYm9vdF90aW1lID09IDAK IAkJICAgfHwgKGJvb3RfdGltZSA8PSBUWVBFX01BWElNVU0gKHRpbWVfdCkKIAkJICAgICAg ICYmIHdpdGhpbl9vbmVfc2Vjb25kIChib290X3RpbWUsIGdldF9ib290X3RpbWUgKCkpKSkp Ci0gICAgICAgIHJldCA9IDE7IC8qIEFuIGV4aXN0aW5nIHByb2Nlc3Mgb24gdGhpcyBtYWNo aW5lIG93bnMgaXQuICAqLworICAgICAgICByZXQgPSAtMTsgLyogQW4gZXhpc3RpbmcgcHJv Y2VzcyBvbiB0aGlzIG1hY2hpbmUgb3ducyBpdC4gICovCiAgICAgICAvKiBUaGUgb3duZXIg cHJvY2VzcyBpcyBkZWFkIG9yIGhhcyBhIHN0cmFuZ2UgcGlkLCBzbyB0cnkgdG8KICAgICAg ICAgIHphcCB0aGUgbG9ja2ZpbGUuICAqLwogICAgICAgZWxzZQotICAgICAgICByZXR1cm4g dW5saW5rIChsZm5hbWUpOworICAgICAgICByZXR1cm4gdW5saW5rIChsZm5hbWUpIDwgMCA/ IGVycm5vIDogMDsKICAgICB9CiAgIGVsc2UKICAgICB7IC8qIElmIHdlIHdhbnRlZCB0byBz dXBwb3J0IHRoZSBjaGVjayBmb3Igc3RhbGUgbG9ja3Mgb24gcmVtb3RlIG1hY2hpbmVzLAog ICAgICAgICAgaGVyZSdzIHdoZXJlIHdlJ2QgZG8gaXQuICAqLwotICAgICAgcmV0ID0gMTsK KyAgICAgIHJldCA9IC0xOwogICAgIH0KIAogICByZXR1cm4gcmV0OwpAQCAtNjA4LDMwICs2 MDgsMjggQEAgY3VycmVudF9sb2NrX293bmVyIChsb2NrX2luZm9fdHlwZSAqb3duZXIsIGNo YXIgKmxmbmFtZSkKIAwKIC8qIExvY2sgdGhlIGxvY2sgbmFtZWQgTEZOQU1FIGlmIHBvc3Np YmxlLgogICAgUmV0dXJuIDAgaW4gdGhhdCBjYXNlLgotICAgUmV0dXJuIHBvc2l0aXZlIGlm IHNvbWUgb3RoZXIgcHJvY2VzcyBvd25zIHRoZSBsb2NrLCBhbmQgaW5mbyBhYm91dAorICAg UmV0dXJuIG5lZ2F0aXZlIGlmIHNvbWUgb3RoZXIgcHJvY2VzcyBvd25zIHRoZSBsb2NrLCBh bmQgaW5mbyBhYm91dAogICAgICB0aGF0IHByb2Nlc3MgaW4gQ0xBU0hFUi4KLSAgIFJldHVy biAtMSBpZiBjYW5ub3QgbG9jayBmb3IgYW55IG90aGVyIHJlYXNvbi4gICovCisgICBSZXR1 cm4gcG9zaXRpdmUgZXJybm8gdmFsdWUgaWYgY2Fubm90IGxvY2sgZm9yIGFueSBvdGhlciBy ZWFzb24uICAqLwogCiBzdGF0aWMgaW50Ci1sb2NrX2lmX2ZyZWUgKGxvY2tfaW5mb190eXBl ICpjbGFzaGVyLCBjaGFyICpsZm5hbWUpCitsb2NrX2lmX2ZyZWUgKGxvY2tfaW5mb190eXBl ICpjbGFzaGVyLCBjaGFyICpsZm5hbWUsIExpc3BfT2JqZWN0IGZuKQogewogICBpbnQgZXJy OwogICB3aGlsZSAoKGVyciA9IGxvY2tfZmlsZV8xIChsZm5hbWUsIDApKSA9PSBFRVhJU1Qp CiAgICAgewotICAgICAgc3dpdGNoIChjdXJyZW50X2xvY2tfb3duZXIgKGNsYXNoZXIsIGxm bmFtZSkpCisgICAgICBlcnIgPSBjdXJyZW50X2xvY2tfb3duZXIgKGNsYXNoZXIsIGxmbmFt ZSk7CisgICAgICBpZiAoZXJyICE9IDApCiAJewotCWNhc2UgMjoKLQkgIHJldHVybiAwOyAg IC8qIFdlIG91cnNlbHZlcyBsb2NrZWQgaXQuICAqLwotCWNhc2UgMToKLQkgIHJldHVybiAx OyAgIC8qIFNvbWVvbmUgZWxzZSBoYXMgaXQuICAqLwotCWNhc2UgLTE6Ci0JICByZXR1cm4g LTE7ICAvKiBjdXJyZW50X2xvY2tfb3duZXIgcmV0dXJuZWQgc3RyYW5nZSBlcnJvci4gICov CisJICBpZiAoZXJyIDwgMCkKKwkgICAgcmV0dXJuIC0yIC0gZXJyOyAvKiBXZSBsb2NrZWQg aXQsIG9yIHNvbWVvbmUgZWxzZSBoYXMgaXQuICAqLworCSAgYnJlYWs7IC8qIGN1cnJlbnRf bG9ja19vd25lciByZXR1cm5lZCBzdHJhbmdlIGVycm9yLiAgKi8KIAl9CiAKICAgICAgIC8q IFdlIGRlbGV0ZWQgYSBzdGFsZSBsb2NrOyB0cnkgYWdhaW4gdG8gbG9jayB0aGUgZmlsZS4g ICovCiAgICAgfQogCi0gIHJldHVybiBlcnIgPyAtMSA6IDA7CisgIHJldHVybiBlcnI7CiB9 CiAKIC8qIGxvY2tfZmlsZSBsb2NrcyBmaWxlIEZOLApAQCAtNjk3LDggKzY5NSw5IEBAIGxv Y2tfZmlsZSAoTGlzcF9PYmplY3QgZm4pCiAgICAgICAvKiBDcmVhdGUgdGhlIG5hbWUgb2Yg dGhlIGxvY2stZmlsZSBmb3IgZmlsZSBmbiAqLwogICAgICAgTUFLRV9MT0NLX05BTUUgKGxm bmFtZSwgZW5jb2RlZF9mbik7CiAKLSAgICAgIC8qIFRyeSB0byBsb2NrIHRoZSBsb2NrLiAg Ki8KLSAgICAgIGlmICgwIDwgbG9ja19pZl9mcmVlICgmbG9ja19pbmZvLCBsZm5hbWUpKQor ICAgICAgLyogVHJ5IHRvIGxvY2sgdGhlIGxvY2suICBGSVhNRTogVGhpcyBpZ25vcmVzIGVy cm9ycyB3aGVuCisJIGxvY2tfaWZfZnJlZSByZXR1cm5zIGEgcG9zaXRpdmUgZXJybm8gdmFs dWUuICAqLworICAgICAgaWYgKGxvY2tfaWZfZnJlZSAoJmxvY2tfaW5mbywgbGZuYW1lLCBm bikgPCAwKQogCXsKIAkgIC8qIFNvbWVvbmUgZWxzZSBoYXMgdGhlIGxvY2suICBDb25zaWRl ciBicmVha2luZyBpdC4gICovCiAJICBMaXNwX09iamVjdCBhdHRhY2s7CkBAIC03MjUsMTMg KzcyNCwxNiBAQCB1bmxvY2tfZmlsZSAoTGlzcF9PYmplY3QgZm4pCiAgIGNoYXIgKmxmbmFt ZTsKICAgVVNFX1NBRkVfQUxMT0NBOwogCi0gIGZuID0gRmV4cGFuZF9maWxlX25hbWUgKGZu LCBRbmlsKTsKLSAgZm4gPSBFTkNPREVfRklMRSAoZm4pOworICBMaXNwX09iamVjdCBmaWxl bmFtZSA9IEZleHBhbmRfZmlsZV9uYW1lIChmbiwgUW5pbCk7CisgIGZuID0gRU5DT0RFX0ZJ TEUgKGZpbGVuYW1lKTsKIAogICBNQUtFX0xPQ0tfTkFNRSAobGZuYW1lLCBmbik7CiAKLSAg aWYgKGN1cnJlbnRfbG9ja19vd25lciAoMCwgbGZuYW1lKSA9PSAyKQotICAgIHVubGluayAo bGZuYW1lKTsKKyAgaW50IGVyciA9IGN1cnJlbnRfbG9ja19vd25lciAoMCwgbGZuYW1lKTsK KyAgaWYgKGVyciA9PSAtMiAmJiB1bmxpbmsgKGxmbmFtZSkgIT0gMCAmJiBlcnJubyAhPSBF Tk9FTlQpCisgICAgZXJyID0gZXJybm87CisgIGlmICgwIDwgZXJyKQorICAgIHJlcG9ydF9m aWxlX2Vycm5vICgiVW5sb2NraW5nIGZpbGUiLCBmaWxlbmFtZSwgZXJyKTsKIAogICBTQUZF X0ZSRUUgKCk7CiB9CkBAIC04MjIsMTcgKzgyNCwxNyBAQCBERUZVTiAoImZpbGUtbG9ja2Vk LXAiLCBGZmlsZV9sb2NrZWRfcCwgU2ZpbGVfbG9ja2VkX3AsIDEsIDEsIDAsCiAgIFVTRV9T QUZFX0FMTE9DQTsKIAogICBmaWxlbmFtZSA9IEZleHBhbmRfZmlsZV9uYW1lIChmaWxlbmFt ZSwgUW5pbCk7Ci0gIGZpbGVuYW1lID0gRU5DT0RFX0ZJTEUgKGZpbGVuYW1lKTsKLQotICBN QUtFX0xPQ0tfTkFNRSAobGZuYW1lLCBmaWxlbmFtZSk7CisgIExpc3BfT2JqZWN0IGVuY29k ZWRfZmlsZW5hbWUgPSBFTkNPREVfRklMRSAoZmlsZW5hbWUpOworICBNQUtFX0xPQ0tfTkFN RSAobGZuYW1lLCBlbmNvZGVkX2ZpbGVuYW1lKTsKIAogICBvd25lciA9IGN1cnJlbnRfbG9j a19vd25lciAoJmxvY2tlciwgbGZuYW1lKTsKLSAgaWYgKG93bmVyIDw9IDApCi0gICAgcmV0 ID0gUW5pbDsKLSAgZWxzZSBpZiAob3duZXIgPT0gMikKLSAgICByZXQgPSBRdDsKLSAgZWxz ZQotICAgIHJldCA9IG1ha2Vfc3RyaW5nIChsb2NrZXIudXNlciwgbG9ja2VyLmF0IC0gbG9j a2VyLnVzZXIpOworICBzd2l0Y2ggKG93bmVyKQorICAgIHsKKyAgICBjYXNlIC0yOiByZXQg PSBRdDsgYnJlYWs7CisgICAgY2FzZSAtMTogcmV0ID0gbWFrZV9zdHJpbmcgKGxvY2tlci51 c2VyLCBsb2NrZXIuYXQgLSBsb2NrZXIudXNlcik7IGJyZWFrOworICAgIGNhc2UgIDA6IHJl dCA9IFFuaWw7IGJyZWFrOworICAgIGRlZmF1bHQ6IHJlcG9ydF9maWxlX2Vycm5vICgiVGVz dGluZyBmaWxlIGxvY2siLCBmaWxlbmFtZSwgb3duZXIpOworICAgIH0KIAogICBTQUZFX0ZS RUUgKCk7CiAgIHJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9zcmMvbGlzcC5oIGIvc3JjL2xp c3AuaAppbmRleCAwMjRlNWVkYjI2Li5jYjI4NDI5MTMxIDEwMDY0NAotLS0gYS9zcmMvbGlz cC5oCisrKyBiL3NyYy9saXNwLmgKQEAgLTQyOTgsNyArNDI5OCw2IEBAIFhNT0RVTEVfRlVO Q1RJT04gKExpc3BfT2JqZWN0IG8pCiAKIC8qIERlZmluZWQgaW4gZmlsZWlvLmMuICAqLwog Ci1leHRlcm4gYm9vbCBjaGVja19leGVjdXRhYmxlIChjaGFyICopOwogZXh0ZXJuIGNoYXIg KnNwbGljZV9kaXJfZmlsZSAoY2hhciAqLCBjaGFyIGNvbnN0ICosIGNoYXIgY29uc3QgKik7 CiBleHRlcm4gYm9vbCBmaWxlX25hbWVfYWJzb2x1dGVfcCAoY29uc3QgY2hhciAqKTsKIGV4 dGVybiBjaGFyIGNvbnN0ICpnZXRfaG9tZWRpciAodm9pZCk7CkBAIC00MzE0LDkgKzQzMTMs OSBAQCBYTU9EVUxFX0ZVTkNUSU9OIChMaXNwX09iamVjdCBvKQogZXh0ZXJuIEFWT0lEIHJl cG9ydF9maWxlX2Vycm9yIChjb25zdCBjaGFyICosIExpc3BfT2JqZWN0KTsKIGV4dGVybiBB Vk9JRCByZXBvcnRfZmlsZV9ub3RpZnlfZXJyb3IgKGNvbnN0IGNoYXIgKiwgTGlzcF9PYmpl Y3QpOwogZXh0ZXJuIGJvb2wgaW50ZXJuYWxfZGVsZXRlX2ZpbGUgKExpc3BfT2JqZWN0KTsK LWV4dGVybiBMaXNwX09iamVjdCBlbWFjc19yZWFkbGlua2F0IChpbnQsIGNvbnN0IGNoYXIg Kik7Ci1leHRlcm4gYm9vbCBmaWxlX2RpcmVjdG9yeV9wIChMaXNwX09iamVjdCk7Ci1leHRl cm4gYm9vbCBmaWxlX2FjY2Vzc2libGVfZGlyZWN0b3J5X3AgKExpc3BfT2JqZWN0KTsKK2V4 dGVybiBMaXNwX09iamVjdCBlbWFjc19yZWFkbGlua2F0IChpbnQsIExpc3BfT2JqZWN0LCBj aGFyIGNvbnN0ICopOworZXh0ZXJuIExpc3BfT2JqZWN0IGZpbGVfZGlyZWN0b3J5X3AgKExp c3BfT2JqZWN0LCBMaXNwX09iamVjdCk7CitleHRlcm4gTGlzcF9PYmplY3QgZmlsZV9hY2Nl c3NpYmxlX2RpcmVjdG9yeV9wIChMaXNwX09iamVjdCwgTGlzcF9PYmplY3QpOwogZXh0ZXJu IHZvaWQgaW5pdF9maWxlaW8gKHZvaWQpOwogZXh0ZXJuIHZvaWQgc3ltc19vZl9maWxlaW8g KHZvaWQpOwogCmRpZmYgLS1naXQgYS9zcmMvbHJlYWQuYyBiL3NyYy9scmVhZC5jCmluZGV4 IDZhZTdhMGQ4YmEuLmJmMDMyMWIwM2EgMTAwNjQ0Ci0tLSBhL3NyYy9scmVhZC5jCisrKyBi L3NyYy9scmVhZC5jCkBAIC0xNzQ2LDE4ICsxNzQ2LDIwIEBAIG9wZW5wIChMaXNwX09iamVj dCBwYXRoLCBMaXNwX09iamVjdCBzdHIsIExpc3BfT2JqZWN0IHN1ZmZpeGVzLAogCQkJCSAg ICBBVF9FQUNDRVNTKQogCQkJID09IDApCiAJCSAgewotCQkgICAgaWYgKGZpbGVfZGlyZWN0 b3J5X3AgKGVuY29kZWRfZm4pKQorCQkgICAgaWYgKCFOSUxQIChmaWxlX2RpcmVjdG9yeV9w IChzdHJpbmcsIGVuY29kZWRfZm4pKSkKIAkJICAgICAgbGFzdF9lcnJubyA9IEVJU0RJUjsK IAkJICAgIGVsc2UKIAkJICAgICAgZmQgPSAxOwogCQkgIH0KKwkJZWxzZSBpZiAoZXJybm8g IT0gRU5PRU5UICYmIGVycm5vICE9IEVOT1RESVIpCisJCSAgbGFzdF9lcnJubyA9IGVycm5v OwogCSAgICAgIH0KIAkgICAgZWxzZQogCSAgICAgIHsKIAkJZmQgPSBlbWFjc19vcGVuIChw Zm4sIE9fUkRPTkxZLCAwKTsKIAkJaWYgKGZkIDwgMCkKIAkJICB7Ci0JCSAgICBpZiAoZXJy bm8gIT0gRU5PRU5UKQorCQkgICAgaWYgKGVycm5vICE9IEVOT0VOVCAmJiBlcnJubyAhPSBF Tk9URElSKQogCQkgICAgICBsYXN0X2Vycm5vID0gZXJybm87CiAJCSAgfQogCQllbHNlCkBA IC00NTE3LDcgKzQ1MTksNyBAQCBsb2FkX3BhdGhfY2hlY2sgKExpc3BfT2JqZWN0IGxwYXRo KQogICAgICAgaWYgKFNUUklOR1AgKGRpcmZpbGUpKQogICAgICAgICB7CiAgICAgICAgICAg ZGlyZmlsZSA9IEZkaXJlY3RvcnlfZmlsZV9uYW1lIChkaXJmaWxlKTsKLSAgICAgICAgICBp ZiAoISBmaWxlX2FjY2Vzc2libGVfZGlyZWN0b3J5X3AgKGRpcmZpbGUpKQorICAgICAgICAg IGlmIChOSUxQIChmaWxlX2FjY2Vzc2libGVfZGlyZWN0b3J5X3AgKGRpcmZpbGUsIGRpcmZp bGUpKSkKICAgICAgICAgICAgIGRpcl93YXJuaW5nICgiTGlzcCBkaXJlY3RvcnkiLCBYQ0FS IChwYXRoX3RhaWwpKTsKICAgICAgICAgfQogICAgIH0KLS0gCjIuMjEuMAoK --------------82F8A0A7664CCE7948FBE02E-- ------------=_1568773742-31139-1--