From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 Received: (qmail 4610 invoked from network); 8 May 2020 20:37:41 -0000 Received-SPF: pass (primenet.com.au: domain of zsh.org designates 203.24.36.2 as permitted sender) receiver=inbox.vuxu.org; client-ip=203.24.36.2 envelope-from= Received: from ns1.primenet.com.au (HELO primenet.com.au) (203.24.36.2) by inbox.vuxu.org with ESMTPUTF8; 8 May 2020 20:37:41 -0000 Received: (qmail 11128 invoked by alias); 8 May 2020 20:37:35 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: List-Unsubscribe: X-Seq: 45794 Received: (qmail 19310 invoked by uid 1010); 8 May 2020 20:37:35 -0000 X-Qmail-Scanner-Diagnostics: from freekahlil.inlv.org by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.102.2/25801. spamassassin: 3.4.4. Clear:RC:0(46.19.33.18):SA:0(-1.9/5.0):. Processed in 3.85279 secs); 08 May 2020 20:37:35 -0000 X-Envelope-From: martijn@inlv.org X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: none (ns1.primenet.com.au: domain at inlv.org does not designate permitted sender hosts) From: Martijn Dekker To: Zsh hackers list Subject: [PATCH] return status 126 for execution failures other than 'not found' Message-ID: Date: Fri, 8 May 2020 21:36:54 +0100 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:68.0) Gecko/20100101 Thunderbird/68.8.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------10A744BD91121CCC987EED1B" Content-Language: en-GB --------------10A744BD91121CCC987EED1B Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit When the argument list to an external command is too long (exceeds ARG_MAX), zsh returns exit status 127. This is incorrect because status 127 means the command was not found. POSIX says in "2.8.2 Exit Status for Commands": https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_08_02 | If a command is not found, the exit status shall be 127. If the | command name is found, but it is not an executable utility, the exit | status shall be 126. Now, the phrasing "it is not an executable utility" is a little vague, but the current versions of all other shells return 126 upon any failure to execute a utility that was found, so they seem to interpret that phrase as meaning "it could not be executed for whatever reason (other than 'not found')". In any case, 126 is better than any alternative, as all other exit codes potentially conflict with other meanings. Currently, the execute() function in Src/exec.c only returns status 126 if the error code is EACCES (permission denied) or ENOEXEC (exec format error). In all other cases, 127 is returned. That logic is not right, because 127 is the specific case: it is only to be used if the command was not found. Any failure to execute after the command is found should yield status 126. The attached patch changes that logic to return status 127 if there is no error number (which happens if a PATH search does not find a command) or if the error number is ENOENT (no such file or directory). In all other cases it now returns 126. I've also added a test for the "argument list too long" case. - Martijn -- modernish -- harness the shell https://github.com/modernish/modernish --------------10A744BD91121CCC987EED1B Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="status126.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="status126.patch" ZGlmZiAtLWdpdCBhL1NyYy9leGVjLmMgYi9TcmMvZXhlYy5jCmluZGV4IDJiOGUyMTY3Zi4u YmU5NDkwNDlmIDEwMDY0NAotLS0gYS9TcmMvZXhlYy5jCisrKyBiL1NyYy9leGVjLmMKQEAg LTcyNiw3ICs3MjYsNyBAQCBleGVjdXRlKExpbmtMaXN0IGFyZ3MsIGludCBmbGFncywgaW50 IGRlZnBhdGgpCiAJCShhcmcwWzBdID09ICcuJyAmJiAoYXJnMCArIDEgPT0gcyB8fAogCQkJ CSAgICAoYXJnMFsxXSA9PSAnLicgJiYgYXJnMCArIDIgPT0gcykpKSkgewogCQl6ZXJyKCIl ZTogJXMiLCBsZXJybm8sIGFyZzApOwotCQlfZXhpdCgobGVycm5vID09IEVBQ0NFUyB8fCBs ZXJybm8gPT0gRU5PRVhFQykgPyAxMjYgOiAxMjcpOworCQlfZXhpdCgobGVycm5vID09IDAg fHwgbGVycm5vID09IEVOT0VOVCkgPyAxMjcgOiAxMjYpOwogCSAgICB9CiAJICAgIGJyZWFr OwogCX0KQEAgLTgwNSw3ICs4MDUsNyBAQCBleGVjdXRlKExpbmtMaXN0IGFyZ3MsIGludCBm bGFncywgaW50IGRlZnBhdGgpCiAJX3JlYWxleGl0KCk7CiAgICAgZWxzZQogCXplcnIoImNv bW1hbmQgbm90IGZvdW5kOiAlcyIsIGFyZzApOwotICAgIF9leGl0KChlbm8gPT0gRUFDQ0VT IHx8IGVubyA9PSBFTk9FWEVDKSA/IDEyNiA6IDEyNyk7CisgICAgX2V4aXQoKGVubyA9PSAw IHx8IGVubyA9PSBFTk9FTlQpID8gMTI3IDogMTI2KTsKIH0KIAogI2RlZmluZSBSRVRfSUZf Q09NKFgpIHsgaWYgKGlzY29tKFgpKSByZXR1cm4gZG9jb3B5ID8gZHVwc3RyaW5nKFgpIDog YXJnMDsgfQpkaWZmIC0tZ2l0IGEvVGVzdC9BMDVleGVjdXRpb24uenRzdCBiL1Rlc3QvQTA1 ZXhlY3V0aW9uLnp0c3QKaW5kZXggZWRjNTYxNTgyLi42NGZkZDgyODggMTAwNjQ0Ci0tLSBh L1Rlc3QvQTA1ZXhlY3V0aW9uLnp0c3QKKysrIGIvVGVzdC9BMDVleGVjdXRpb24uenRzdApA QCAtMzk0LDMgKzM5NCwxMyBAQCBGOmFub255bW91cyBmdW5jdGlvbiwgYW5kIGEgZGVzY3Jp cHRvciBsZWFrIHdoZW4gYmFja2dyb3VuZGluZyBhIHBpcGVsaW5lCiA+MTI3CiAjIFRCRDog dGhlIDAgYWJvdmUgaXMgYmVsaWV2ZWQgdG8gYmUgYm9ndXMgYW5kIHNob3VsZCBhbHNvIGJl IHR1cm5lZAogIyBpbnRvIDEyNyB3aGVuIHRoZSBjY29ycmVzcG9uZGluZyBidWcgaXMgZml4 ZWQgaW4gdGhlIG1haW4gc2hlbGwuCisKKyMgVGVzdCBmb3IgZXhpdCBzdGF0dXMgMTI2IHdo ZW4gYW4gZXh0ZXJuYWwgY29tbWFuZCdzIGFyZ3VtZW50IGxpc3QgaXMgdG9vIGxvbmcuCisg IHY9Zm9vX2Jhcl9iYXpfcXV1eF9sb3JlbV9pcHN1bV9kb2xvcl9zaXRfYW1ldAorICB3aGls ZSA6OyBkbworICAgIHY9JHYkdiR2JHYkdiR2JHYkdgorICAgIGVudiB0cnVlICR2IHx8IHsg cHJpbnQgJD87IGJyZWFrOyB9CisgIGRvbmUKKzA6ZXhpdCBzdGF0dXMgd2hlbiBhcmd1bWVu dCBsaXN0IHRvbyBsb25nCis+MTI2Cis/KGV2YWwpOjQ6IGFyZ3VtZW50IGxpc3QgdG9vIGxv bmc6IGVudgo= --------------10A744BD91121CCC987EED1B--