From unknown Mon Jun 16 23:47:56 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#37389 <37389@debbugs.gnu.org> To: bug#37389 <37389@debbugs.gnu.org> Subject: Status: [PATCH] Improve reporting of I/O, access errors Reply-To: bug#37389 <37389@debbugs.gnu.org> Date: Tue, 17 Jun 2025 06:47:56 +0000 retitle 37389 [PATCH] Improve reporting of I/O, access errors reassign 37389 emacs submitter 37389 Paul Eggert severity 37389 normal tag 37389 patch thanks From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 12 04:07:22 2019 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-- From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 17 22:28:38 2019 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-- From unknown Mon Jun 16 23:47:56 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Wed, 16 Oct 2019 11:24:04 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator