From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FROM,HTML_MESSAGE,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 16965 invoked from network); 25 Nov 2022 17:45:29 -0000 Received: from zero.zsh.org (2a02:898:31:0:48:4558:7a:7368) by inbox.vuxu.org with ESMTPUTF8; 25 Nov 2022 17:45:29 -0000 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20210803; t=1669398329; b=nhgbudsoofr5wDrkaSmJU3uCr3En5bM9nuKPpkSPqsXeGFHTBrytK7vc5IJMgYUXrs8yb3y+nI 0fso3wVbNN17JIKbitJ8NfQQSSQWtAzk9KUDeCM685ghFneklDdc1vRidPdWsNsDGnwQGd20dH Fj+P7wQYFU/iwj4T4p/2L5C90kDf4R6ojTp2sbvs2O8hIKAfmEKkmXFEfpLNoKYJcm6pyUqe4M 0jFuSLFLBS3nRz3BHV+pqStdQHEAnpEqWa6gkN8KE/opY3aazC0Dl3NJglZlrhZ+MAM/Q1xDv2 gm3aEl+EVCIp0ThnlEJm3ZXm2yC50bqnaRi9eCUaey7ekQ==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (mail-vs1-f46.google.com) smtp.remote-ip=209.85.217.46; dkim=pass header.d=gmail.com header.s=20210112 header.a=rsa-sha256; dmarc=pass header.from=gmail.com; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=zsh.org; s=rsa-20210803; t=1669398329; bh=rpNOZlnjUGW3UDcWMWJ6YEaOlcgGZFV7/cvHqaILKfQ=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:Content-Type:Cc:To:Subject:Message-ID:Date:From:MIME-Version: DKIM-Signature:DKIM-Signature; b=DLQtNrm64VBAuKXNyLpu2wmjQcyJx54da6mfBlA5yaBf0zRIOADHxN4tPWj4y55uQwlIeAHg0O pIzJmT0hM/nOZ5/3Cxigmsi+LJ5qNc6IR7LO6DLQ0A5ebr4xxS/MLmowItLcB+dwABGBG6+Srl F3IWShNx9OLuAaB3c3UOhwtUxHXnSqOLnE8e/W85ZEdtngYMcFaYMh4ZJMdLIaihYNZbhuj0Aw h/a6Rj1yO0Uzau238/BC4NfW+Pje2pFDZTFhd/xVcjkR76TM6eCv32lZbFFO7UHTbpWqE0fJzb 2GptNVSLoVWNAASHZxUzhDVxJNnzD/lxfGvCTnwzjv/+tA==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=zsh.org; s=rsa-20210803; h=List-Archive:List-Owner:List-Post:List-Unsubscribe: List-Subscribe:List-Help:List-Id:Sender:Content-Type:Cc:To:Subject:Message-ID :Date:From:MIME-Version:Reply-To:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References; bh=p46w8YB7OkrJw0+0Me2h+GOr/Ke4SvdR3bkMhshhD1A=; b=bniATxnZeGyj3CwCtO55A3yjek c7r+6DFF0VwoJU084fx+Jxv318EtyQfyKnxTsLiwbX6BAo0eonVgpYKMXwr/i1cblumRkXzr0R+pB w0zX4ZLKLWYEpMafOGCyYxVqkc+ItUZwBQdGarvUA1bdPURTL8o54PN58hxi72VZTyE2xokYi8M72 MOYBUCyz+HibBemaQvQZo4PUvb3cFBtM6v4ud8HRD4HjAcOrONdlyvxNMMlZ1ZXEiZ0EcmKKR7XUV tx/dv8ucFAW6KrMGwvv0kbjwhPYte7KDFwXq/vBGh3dm4fBN6/aMhT0dZF0KDv1LiIgG4pLdFnTNn /BNNLf/A==; Received: by zero.zsh.org with local id 1oyclU-0003TB-09; Fri, 25 Nov 2022 17:45:28 +0000 Authentication-Results: zsh.org; iprev=pass (mail-vs1-f46.google.com) smtp.remote-ip=209.85.217.46; dkim=pass header.d=gmail.com header.s=20210112 header.a=rsa-sha256; dmarc=pass header.from=gmail.com; arc=none Received: from mail-vs1-f46.google.com ([209.85.217.46]:38541) by zero.zsh.org with esmtps (TLS1.3:TLS_AES_128_GCM_SHA256:128) id 1oyclC-00038I-0N; Fri, 25 Nov 2022 17:45:11 +0000 Received: by mail-vs1-f46.google.com with SMTP id u124so4835262vsb.5; Fri, 25 Nov 2022 09:45:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=p46w8YB7OkrJw0+0Me2h+GOr/Ke4SvdR3bkMhshhD1A=; b=pd/gaOYu5riKv6ykOmDyEUNUbxTLkD42MChjAKKZ7t3k/xK1MPy/AcLH3e2QjfTMlq /nciNoiAkn0Rz59utrUIhRWoTYg/f4q1xI71pzFRtpqTGlLb0H7D0a3f6g/LtipB65rb A+evba2Xyrr6u6tbHDhf3MsxXWagMdfTjsT19TZJCZOclQKbNls48BV/kDkNfxg8EoRB x23eZ+0cEIYnkWwITaPr7YteMfL7FjhQZqnIXJ7CFual+T06SjIkcV5ljptLDipONvfQ 09l6X0VRxQ6Ft/F5dXdHRgdrol71pOpxg3jUhJPKw0Pi4EJx2otm6bb5cBMef00o8t2e Lkmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=p46w8YB7OkrJw0+0Me2h+GOr/Ke4SvdR3bkMhshhD1A=; b=EySvEdg85XwOE/rOHQ1yH9BXXux3xd6/GIgtdaMQ9QXWWRuv9m5uKmA4+jp0uYaesB H8zqXzc4iC+6iYu+3/76xcFyaI9hya0bs8JYYb4l1N60wplDn9lQ70R6BzgYn1KnFAWD iSnFELO/6rCzEbBMMDLDt783ZYTczL5fXmwgs4/xz2jnXngQLjyPSHh7PCJZQ112inQs 6ROd2tl1R5f5iHyx8hfPolBEeLmipuIt0tUUWM8aEjLA5nx9qpMRzBUhQS9ugfbl4LII km0atbfKvec8Ygl603tmlvBC9O90B8lmi+ITdNuXbQldM0p1LhE3ATJKs5B2UB6Ajv3u nnYw== X-Gm-Message-State: ANoB5pmKMEUt2IU+5K6xV82K+gKh2+WJSVKS5Ry6CZnCu9G7EzLB/wQN Pvj1SJHNLlBwtQMXOVARSVP4z2wBTnK3mFhqhHXWfbVvpEA= X-Google-Smtp-Source: AA0mqf6jGQsq94RG5NCV9azC/lnC010VmQbVitkTX8t0vBNp9HyRWN3V59VU68n22/V84rdR6uQZhPvksLFL2Dj41os= X-Received: by 2002:a05:6102:3e1c:b0:3af:2ddf:32a1 with SMTP id j28-20020a0561023e1c00b003af2ddf32a1mr12456885vsv.81.1669398307685; Fri, 25 Nov 2022 09:45:07 -0800 (PST) MIME-Version: 1.0 From: Philippe Altherr Date: Fri, 25 Nov 2022 18:44:56 +0100 Message-ID: Subject: [Patch] Fix ERR_RETURN behavior in and/or statements To: Zsh hackers list Cc: Bart Schaefer , =?UTF-8?Q?Lawrence_Vel=C3=A1zquez?= Content-Type: multipart/mixed; boundary="0000000000001e9ee705ee4f1527" X-Seq: 51071 Archived-At: X-Loop: zsh-workers@zsh.org Errors-To: zsh-workers-owner@zsh.org Precedence: list Precedence: bulk Sender: zsh-workers-request@zsh.org X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: --0000000000001e9ee705ee4f1527 Content-Type: multipart/alternative; boundary="0000000000001e9ee605ee4f1525" --0000000000001e9ee605ee4f1525 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable ATTENTION: This patch depends on the following patches described here : - patch-01-revert-mistaken-errexit-patches.txt - patch-03-fix-negation-statement.txt I have found another issue in execlist, which affects the behavior of ERR_RETURN in convoluted cases that involve at least two &&/|| commands and a function call. The following example exhibits the issue. set -o err_return > fn() { { false; echo fn1 } && echo fn2 } > fn; echo done > fn && echo done The execution of "fn; echo done" prints "fn1", "fn2", and "done". The execution of "fn && echo done" should print the same but currently prints nothing. The problem is that this test in "execlist" is too conservative. Inside "fn", "oldnoerrexit" is equal to "NOERREXIT_EXIT". Indeed the "&&" in "fn && echo done" first sets "noerrexit" to "NOERREXIT_EXIT | NOERREXIT_RETURN". The call to "fn" then removes "NOERREXIT_RETURN". Thus, at the beginning of "execlist" in the call to "fn", "noerrexit" is equal to "NOERREXIT_EXIT" and "oldnoerrexit" is initialized to the same value. Since "oldnoerrexit" is non-zero, the tes= t fails to readd "NOERREXIT_RETURN" for the evaluation of "{ false; echo fn1 }". Therefore the evaluation of "false" triggers an early return of "fn" w=C3= =AEth exit status 1, which in turn triggers an early return of the toplevel and thus nothing is printed. The solution is to unconditionally set "noerrexit" to "NOERREXIT_EXIT | NOERREXIT_RETURN" for any command on the left of "&&" and "||" (and for any command on the right of "!"). The patch does exactly that (and adds a regression test). Philippe --0000000000001e9ee605ee4f1525 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
ATTENTION: This patch depends on the following patches des= cribed here:
-=C2=A0patch-0= 1-revert-mistaken-errexit-patches.txt
-=C2=A0patch-03-fix-negatio= n-statement.txt

I have found another issue in exec= list, which affects the behavior of ERR_RETURN in convoluted cases that inv= olve at least two &&/|| commands and a function call. The following= example=C2=A0exhibits the issue.

set -o err_return
fn() { { false; echo fn1 = } && echo fn2 }
fn; echo done
fn && echo done

The execution of "fn; echo done" prints = "fn1", "fn2", and "done". The execution of &q= uot;fn && echo done" should print the same but currently print= s nothing.

The problem is that this test in "execlist" is too conservative. In= side "fn", "oldnoerrexit" is equal to "NOERREXIT_E= XIT". Indeed the "&&" in "fn && echo do= ne"=C2=A0 first sets "noerrexit" to=C2=A0 "NOERREXIT_EX= IT | NOERREXIT_RETURN". The call to "fn" then removes "= NOERREXIT_RETURN". Thus, at the beginning of "execlist" in t= he call to "fn", "noerrexit" is equal to "NOERREXI= T_EXIT" and "oldnoerrexit" is initialized to the same value.= Since=C2=A0"oldnoerrexit" is non-zero,=C2=A0the test=C2=A0fails to readd=C2=A0"NOERREXIT_RETURN&q= uot; for the evaluation of "{ false; echo fn1 }". Therefore the e= valuation of "false" triggers an early return of "fn" w= =C3=AEth exit status 1, which in turn triggers an early return of the tople= vel and thus nothing is printed.

The solution is t= o unconditionally set=C2=A0"noerrexit" to "NOERREXIT_EXIT | = NOERREXIT_RETURN" for any command on the left of "&&"= ; and "||" (and for any command on the right of "!"). T= he patch does exactly that (and adds a regression test).

Philippe

--0000000000001e9ee605ee4f1525-- --0000000000001e9ee705ee4f1527 Content-Type: text/plain; charset="US-ASCII"; name="patch-05-fix-and-or-statement.txt" Content-Disposition: attachment; filename="patch-05-fix-and-or-statement.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lawr01f60 ZGlmZiAtLWdpdCBhL1NyYy9leGVjLmMgYi9TcmMvZXhlYy5jCmluZGV4IDQzZGY4MjExYS4uNzEx ZDhmMzc0IDEwMDY0NAotLS0gYS9TcmMvZXhlYy5jCisrKyBiL1NyYy9leGVjLmMKQEAgLTE0Mjcs MTQgKzE0MjcsMTIgQEAgZXhlY2xpc3QoRXN0YXRlIHN0YXRlLCBpbnQgZG9udF9jaGFuZ2Vfam9i LCBpbnQgZXhpdGluZykKIAkgICAgZ290byBzdWJsaXN0X2RvbmU7CiAJfQogCXdoaWxlICh3Y19j b2RlKGNvZGUpID09IFdDX1NVQkxJU1QpIHsKLQkgICAgaW50IGlzZW5kID0gKFdDX1NVQkxJU1Rf VFlQRShjb2RlKSA9PSBXQ19TVUJMSVNUX0VORCk7CisJICAgIGludCBpc2FuZG9yID0gV0NfU1VC TElTVF9UWVBFKGNvZGUpICE9IFdDX1NVQkxJU1RfRU5EOworCSAgICBpbnQgaXNub3QgPSBXQ19T VUJMSVNUX0ZMQUdTKGNvZGUpICYgV0NfU1VCTElTVF9OT1Q7CiAJICAgIG5leHQgPSBzdGF0ZS0+ cGMgKyBXQ19TVUJMSVNUX1NLSVAoY29kZSk7Ci0JICAgIGlmICghb2xkbm9lcnJleGl0KQotCQlu b2VycmV4aXQgPSBpc2VuZCA/IDAgOiBOT0VSUkVYSVRfRVhJVCB8IE5PRVJSRVhJVF9SRVRVUk47 Ci0JICAgIGlmIChXQ19TVUJMSVNUX0ZMQUdTKGNvZGUpICYgV0NfU1VCTElTVF9OT1QpIHsKLQkJ Lyogc3VwcHJlc3MgZXJyZXhpdCBmb3IgdGhlIGNvbW1hbmRzIGluICEgPGxpc3Qtb2YtY29tbWFu ZHM+ICovCisJICAgIC8qIHN1cHByZXNzIGVycmV4aXQgZm9yIGNvbW1hbmRzIGJlZm9yZSAmJiBh bmQgfHwgYW5kIGFmdGVyICEgKi8KKwkgICAgaWYgKGlzYW5kb3IgfHwgaXNub3QpCiAJCW5vZXJy ZXhpdCA9IE5PRVJSRVhJVF9FWElUIHwgTk9FUlJFWElUX1JFVFVSTjsKLQkgICAgfQogCSAgICBz d2l0Y2ggKFdDX1NVQkxJU1RfVFlQRShjb2RlKSkgewogCSAgICBjYXNlIFdDX1NVQkxJU1RfRU5E OgogCQkvKiBFbmQgb2Ygc3VibGlzdDsganVzdCBleGVjdXRlLCBpZ25vcmluZyBzdGF0dXMuICov CkBAIC0xNDQ0LDcgKzE0NDIsNyBAQCBleGVjbGlzdChFc3RhdGUgc3RhdGUsIGludCBkb250X2No YW5nZV9qb2IsIGludCBleGl0aW5nKQogCQkgICAgZXhlY3BsaW5lKHN0YXRlLCBjb2RlLCBsdHlw ZSwgKGx0eXBlICYgWl9FTkQpICYmIGV4aXRpbmcpOwogCQlzdGF0ZS0+cGMgPSBuZXh0OwogCQkv KiBzdXBwcmVzcyBlcnJleGl0IGZvciB0aGUgY29tbWFuZCAiISAuLi4iICovCi0JCWlmIChXQ19T VUJMSVNUX0ZMQUdTKGNvZGUpICYgV0NfU1VCTElTVF9OT1QpCisJCWlmIChpc25vdCkKIAkJICB0 aGlzX25vZXJyZXhpdCA9IDE7CiAJCWdvdG8gc3VibGlzdF9kb25lOwogCQlicmVhazsKZGlmZiAt LWdpdCBhL1Rlc3QvQzAzdHJhcHMuenRzdCBiL1Rlc3QvQzAzdHJhcHMuenRzdAppbmRleCBhODg4 MDY3M2YuLmI3MTMyZGE4MSAxMDA2NDQKLS0tIGEvVGVzdC9DMDN0cmFwcy56dHN0CisrKyBiL1Rl c3QvQzAzdHJhcHMuenRzdApAQCAtNjcwLDYgKzY3MCwyMiBAQCBGOk11c3QgYmUgdGVzdGVkIHdp dGggYSB0b3AtbGV2ZWwgc2NyaXB0IHJhdGhlciB0aGFuIHNvdXJjZSBvciBmdW5jdGlvbgogPmJl Zm9yZS1vdXQKID5iZWZvcmUtaW4KIAorICAoc2V0IC1vIGVycl9yZXR1cm4KKyAgICBmbigpIHsK KyAgICAgIHByaW50IGJlZm9yZS1pbgorICAgICAgeyBmYWxzZTsgdHJ1ZSB9ICYmIHRydWUKKyAg ICAgIHByaW50IGFmdGVyLWluCisgICAgfQorICAgIHByaW50IGJlZm9yZS1vdXQKKyAgICBmbiAm JiB0cnVlCisgICAgcHJpbnQgYWZ0ZXItb3V0CisgICkKKzA6RVJSX1JFVFVSTiBub3QgdHJpZ2dl cmVkIG9uIExIUyBvZiAiJiYiIGluIGZ1bmN0aW9uIG9uIExIUyBvZiAiJiYiIChyZWdyZXNzaW9u IHRlc3QpCis+YmVmb3JlLW91dAorPmJlZm9yZS1pbgorPmFmdGVyLWluCis+YWZ0ZXItb3V0CisK ICAgbWtkaXIgLXAgemRvdGRpcgogICBwcmludCA+emRvdGRpci8uenNoZW52ICcKICAgc2V0b3B0 IG5vcmNzIGVycnJldHVybgo= --0000000000001e9ee705ee4f1527--