From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.1 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from primenet.com.au (ns1.primenet.com.au [203.24.36.2]) by inbox.vuxu.org (OpenSMTPD) with ESMTP id 58ca4a16 for ; Fri, 3 May 2019 19:10:34 +0000 (UTC) Received: (qmail 26662 invoked by alias); 3 May 2019 19:10:20 -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: 44271 Received: (qmail 10145 invoked by uid 1010); 3 May 2019 19:10:20 -0000 X-Qmail-Scanner-Diagnostics: from know-smtprelay-omc-5.server.virginmedia.net by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.101.2/25434. spamassassin: 3.4.2. Clear:RC:0(80.0.253.69):SA:0(-2.0/5.0):. Processed in 2.473298 secs); 03 May 2019 19:10:20 -0000 X-Envelope-From: p.w.stephenson@ntlworld.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: pass (ns1.primenet.com.au: SPF record at _smtprelay.virginmedia.com designates 80.0.253.69 as permitted sender) X-Originating-IP: [86.16.88.158] X-Authenticated-User: p.w.stephenson@ntlworld.com X-Spam: 0 X-Authority: v=2.3 cv=PLwhB8iC c=1 sm=1 tr=0 a=MiHCjVqLJ44lE3bxSlffFQ==:117 a=MiHCjVqLJ44lE3bxSlffFQ==:17 a=jpOVt7BSZ2e4Z31A5e1TngXxSK0=:19 a=IkcTkHD0fZMA:10 a=S2y8YhSTKg_vC47xFRcA:9 a=h8UebD3h5lAQW3pS:21 a=DsrltO5aBketjVYj:21 a=QEXdDO2ut3YA:10 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ntlworld.com; s=meg.feb2017; t=1556910580; bh=hPIglMHkjC0qRBnKEAwIZmUpnUnEC2GtmWxsnrLXzqw=; h=Subject:From:To:Date:In-Reply-To:References; b=SXE/59nkzq9XRpgr/UxRxo8+0ITvdul3xUdxYb2VPcdx4Y9YpPohfcbq/+W5I2rgO XBcR15zZaLYqp2EjdCFqoL+Bzh3RZJJgB+oEs6jMwcT6w5BMw7VNBf1foKV5sQGg76 r+9kY8STxGLIkZyM0ddTWssa+qg3s4tZVX0f5pbFsAEunEWvYgDw1bjXK/myL1zxVk aIH6byvMeHdvQKbR+aL2ZC0gh+qaM3B75Zyy1PCqOchoBoisNRTgMho3OfJo3OP38Q LdhVcoS5JaPf0/2K2wtDYm6OjHn8MJ94Mdc5HU1AeYh0qn3TlqJnAOA5EqgRFCXqd8 J3GSjtISJBftA== Message-ID: Subject: Re: [BUG] program flow corruption involving dot script and 'until' loop From: Peter Stephenson To: zsh-workers@zsh.org Date: Fri, 03 May 2019 20:09:40 +0100 In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.28.5-0ubuntu0.18.04.1 Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-CMAE-Envelope: MS4wfO/rgSv0wCpA13D6mrOg/3W5pFVHTnp70sVj4QLRIAeGR7HBukCOxxOSAkahTM1ZUVauhytC7JzbfT5vRWp4vXPJaWtPQWgso23dMaLQypQf0ntkbf0H TUghUOpPR7+dCkR7AtdqXBgfaV8QAa/394e8C/XP1+1BkvhOBuSC7R4b On Fri, 2019-05-03 at 18:20 +0100, Martijn Dekker wrote: > Looks like the 'return' in the dot script causes zsh to just give up on > the program altogether. diff --git a/Src/loop.c b/Src/loop.c index 1013aeb50..3fa7006aa 100644 --- a/Src/loop.c +++ b/Src/loop.c @@ -425,7 +425,7 @@ execwhile(Estate state, UNUSED(int do_exec)) breaks--; simple_pline = old_simple_pline; - } else + } else { for (;;) { state->pc = loop; noerrexit = NOERREXIT_EXIT | NOERREXIT_RETURN; @@ -445,8 +445,11 @@ execwhile(Estate state, UNUSED(int do_exec)) lastval = oldval; break; } - if (retflag) + if (retflag) { + if (breaks) + breaks--; break; + } /* In case the loop body is also a functional no-op, * make sure signal handlers recognize ^C as above. */ @@ -470,6 +473,7 @@ execwhile(Estate state, UNUSED(int do_exec)) freeheap(); oldval = lastval; } + } cmdpop(); popheap(); loops--; diff --git a/Test/A01grammar.ztst b/Test/A01grammar.ztst index 339ce7494..1ed3cb6b7 100644 --- a/Test/A01grammar.ztst +++ b/Test/A01grammar.ztst @@ -640,6 +640,16 @@ >1 >0 + echo 'echo dot + until return 42; do + : + done' >until_dot + . ./until_dot + echo After dot +0:return in positive until test in dot file does not cause excess breaks +>dot +>After dot + echo 'echo $?' >dot_status false . ./dot_status