Path: csiph.com!goblin1!goblin.stu.neva.ru!usenet.stanford.edu!not-for-mail From: Koichi Murase Newsgroups: gnu.bash.bug Subject: [PATCH] Bash 5.0+: Fix a problem that interactive sessions close with `eval {' Date: Fri, 28 Aug 2020 09:33:10 +0900 Lines: 231 Approved: bug-bash@gnu.org Message-ID: References: NNTP-Posting-Host: lists.gnu.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="0000000000004ba73405ade533f9" X-Trace: usenet.stanford.edu 1598574809 3503 209.51.188.17 (28 Aug 2020 00:33:29 GMT) X-Complaints-To: action@cs.stanford.edu To: bug-bash@gnu.org Envelope-to: bug-bash@gnu.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=mRV7+dVIO3CY8XDDEbHRk3bVbRmfiU/fLYQOGnAhagE=; b=ZQMtWyMBuGdW5mmCUrz99aeZovIxMannxTDwC14YrkiGgsfcIGL1tu6DDVPrBinW1R yz2Qr0VNRE2/SdnhHXB9FcBZttg6bUO+nKcxpPzgTThBIn5jmB31Lh7ngSscxaNLSmXo LYfhPu1kZFWlDmCjkeXbRu1SQEmxolLuXTmfN3E9e30IxbRY7tDAYqtuLwPmfH6mgRg2 MZqkqqg+CcfrX0Y9VeeL43n/it5mBe0E6mFPucSkLJhLC0XfY7cBtQhzmZVaOmRDI4BX 61GigMeSzKiJFfyk9atAY77V4yNUAp7dmpqoIopKOxXQP3bVlwlW/xwRmixR/ebV9Us3 l6AA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=mRV7+dVIO3CY8XDDEbHRk3bVbRmfiU/fLYQOGnAhagE=; b=oHQ6993887aGI/pQF+TlMixYq1OevsLI1ER7ZpeMIr0MSl3oio8mRqSFJ/nNr7HDN1 Xw55VC6f3AtOmFSk9HzCnQhTJfhAiLyFjeDkZ3wEmNqmdncALKotdcuMELkgeDvGKD8F 7WCMceoS+ZJZE81M+95gGVPszIuG0kBJu3NJXaay+IQxl86kQBpeWet28E9O83yIB6W1 pOqJQUOSAOFFm+DtLbVdBuuSX36rKgqb0nm/ocR74qQsnIXoznYeNOl8RwEQlN0KRZgK z3uI9kE/9UHSzYTK9DkrtKKLz4w08VIdMlU7MQj2LzHao1IFhtxeD0tOvONy8/WZaz7R D/Pw== X-Gm-Message-State: AOAM53381XBxDTSwuFw0lAdNBb9fCL0Nb5CYye/Jzz4T+plzW9zYNYNV fbJHAwuHAHyc4kT5ZoIdqsHT5owyvtDsHZakgGTwUmyfNlqr4A== X-Google-Smtp-Source: ABdhPJxtKW0iolHU/RfZEh3y/bwlLkdh34aap+IMFzEKXYYk4X2WMJ3CTKOvGo6qF9gEiwkttTC7lzHtF02gKd/G03M= X-Received: by 2002:a17:906:40e:: with SMTP id d14mr19484995eja.455.1598574803255; Thu, 27 Aug 2020 17:33:23 -0700 (PDT) Received-SPF: pass client-ip=2a00:1450:4864:20::644; envelope-from=myoga.murase@gmail.com; helo=mail-ej1-x644.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: bug-bash@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Bug reports for the GNU Bourne Again SHell List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: Xref: csiph.com gnu.bash.bug:16822 --0000000000004ba73405ade533f9 Content-Type: text/plain; charset="UTF-8" Configuration Information [Automatically generated, do not change]: Machine: x86_64 OS: linux-gnu Compiler: gcc Compilation CFLAGS: -march=native -O3 uname output: Linux chatoyancy 5.6.13-100.fc30.x86_64 #1 SMP Fri May 15 00:36:06 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux Machine Type: x86_64-pc-linux-gnu Bash Version: 5.1 Patch Level: 0 Release Status: release Description: When a command string with an incomplete construct is supplied to the `eval' builtin in interactive sessions, the process will be terminated. This does not happen before Bash 5.0. This does not happen in non-interactive modes. Repeat-By: The entire interactive session ends with `eval {'. bash-5.0$ eval { bash-5.0: syntax error: unexpected end of file exit This does not happen in bash-4.4 and before. The session will not close, and one can enter and execute the next command. bash-4.4$ eval { bash-4.4: syntax error: unexpected end of file bash-4.4$ echo $? 1 bash-4.4$ This also happens when `eval {' is executed in a function. The session closes. bash-5.0$ function fun { eval {; } bash-5.0$ fun bash-5.0: syntax error: unexpected end of file exit This does not happen when `eval {' is executed in the non-interactive mode. The commands following `eval {' will be executed as normal. bash-5.0$ cat test18.sh echo Begin eval eval { echo End eval bash-5.0$ bash-5.0 test18.sh Begin eval test18.sh: eval: line 2: syntax error: unexpected end of file End eval bash-5.0$ . test18.sh Begin eval test18.sh: eval: line 2: syntax error: unexpected end of file End eval Fix: * This behavior has been introduced in `parse.y' in commit 8a10051 (commit bash-20170511 snapshot) to solve the infinite loop found by fuzzing reported at https://lists.gnu.org/archive/html/bug-bash/2017-05/msg00076.html. I extracted the related section of the commit change: > From 8a100514480a55ad73966e516e38778509f6ace6 Mon Sep 17 00:00:00 2001 > From: Chet Ramey > Date: Thu, 11 May 2017 14:45:50 -0400 > Subject: [PATCH] commit bash-20170511 snapshot > > diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog > index 7892ce94..8ea60a39 100644 > --- a/CWRU/CWRU.chlog > +++ b/CWRU/CWRU.chlog > @@ -13840,3 +13840,18 @@ builtins/read.def > a CTLESC the last time through the loop (skip_ctlesc == 0), > especially if i == 0. Another fuzzing bug from Eduardo Bustamante > > + > + 5/9 > + --- > +parse.y > + - GRAMMAR: add 'error yacc_EOF' production to handle a syntax error > + that's immediately followed by an EOF after resynchronization. > + Fixes another fuzzing bug > diff --git a/parse.y b/parse.y > index 7ca4a64e..dcc628e7 100644 > --- a/parse.y > +++ b/parse.y > @@ -411,7 +411,14 @@ inputunit: simple_list simple_list_terminator > YYABORT; > } > } > + | error yacc_EOF > + { > + /* EOF after an error. Do ignoreeof or not. Really > + only interesting in non-interactive shells */ > + global_command = (COMMAND *)NULL; > + handle_eof_input_unit (); > + YYACCEPT; > + } > | yacc_EOF > { > /* Case of EOF seen by itself. Do ignoreeof or > -- > 2.21.3 The problem here is that `handle_eof_input_unit' terminates the entire shell when it is in the interactive mode even when the shell is processing the string passed to `eval' command. The special treatment of EOF for exiting shell should be processed only when the shell processes the top-level commands (i.e., not the command strings executed through `eval', etc.) I attach a patch for the devel branch (see 0001-Fix-a-bug-that-syntax-errors-in-eval-causes-the-inte.patch). I moved the position of the line `handle_eof_input_unit ();' so that it is only executed when `parse_and_execute_level == 0'. [ Note: The current code in `parse.y' has additional fixes after 2017-05-09, so the code looks slightly different from that in the commit 2017-05-09 [for details, see Appendix A below], but the `eval {' problem is still present. ] -- Koichi ---------------------------------------------------------------------- Appendix A: One of the fix has been made to solve another problem introduced by 2017-05-09 fix: Even in non-interactive modes, the exit status of `eval {' becomes 0 althogh it prints the error messages of syntax errors. This second problem has been already reported by Martijn at https://lists.gnu.org/archive/html/bug-bash/2017-06/msg00236.html The fix to this second problem has been made in the commit d7d836dfc (commit bash-snap-20170620 snapshot). I extract the corresponding section: > From d7d836dfc55b937f463f601ba5117d6442053089 Mon Sep 17 00:00:00 2001 > From: Chet Ramey > Date: Tue, 20 Jun 2017 10:38:13 -0400 > Subject: [PATCH] commit bash-snap-20170620 snapshot > > diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog > index 31724be0..7dd09a3f 100644 > --- a/CWRU/CWRU.chlog > +++ b/CWRU/CWRU.chlog > @@ -14102,3 +14102,11 @@ parse.y > lib/readline/display.c > - update_line: when wrapping multibyte characters, make sure we deal > with WCWIDTH returning -1. Fixes a fuzzing bug > + > + 6/17 > + ---- > +parse.y > + - augment `error yacc_EOF' production to call YYABORT in non-interactive > + shells or calls to parse_and_execute (eval, command substitution, > + etc.) Fixes bug reported by Martijn Dekker > + > diff --git a/parse.y b/parse.y > index d8d8e885..92da96b9 100644 > --- a/parse.y > +++ b/parse.y > @@ -416,9 +416,16 @@ inputunit: simple_list simple_list_terminator > /* EOF after an error. Do ignoreeof or not. Really > only interesting in non-interactive shells */ > global_command = (COMMAND *)NULL; > + last_command_exit_value = 1; > handle_eof_input_unit (); > - YYACCEPT; > + if (interactive && parse_and_execute_level == 0) > + { > + YYACCEPT; > + } > + else > + { > + YYABORT; > + } > } > | yacc_EOF > { > -- > 2.21.3 Further lines are added in the commit ab8ded9c3 (commit bash-20181214 snapshot), but this change is not relevant for now, so I skip the details of the commit. ---------------------------------------------------------------------- --0000000000004ba73405ade533f9 Content-Type: application/octet-stream; name="0001-Fix-a-bug-that-syntax-errors-in-eval-causes-the-inte.patch" Content-Disposition: attachment; filename="0001-Fix-a-bug-that-syntax-errors-in-eval-causes-the-inte.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kedi4q190 RnJvbSAyY2I2MWNhNTQ2ZDZhOWY0ZWJkZDBiZmVjODNkMDg3NGIzNTAyMTllIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBLb2ljaGkgTXVyYXNlIDxteW9nYS5tdXJhc2VAZ21haWwuY29t PgpEYXRlOiBGcmksIDI4IEF1ZyAyMDIwIDA5OjA5OjE5ICswOTAwClN1YmplY3Q6IFtQQVRDSF0g Rml4IGEgYnVnIHRoYXQgc3ludGF4IGVycm9ycyBpbiAiZXZhbCIgY2F1c2VzIHRoZSBpbnRlcmFj dGl2ZQogc2hlbGwgdGVybWluYXRpb24KCi0tLQogcGFyc2UueSB8IDIgKy0KIDEgZmlsZSBjaGFu Z2VkLCAxIGluc2VydGlvbigrKSwgMSBkZWxldGlvbigtKQoKZGlmZiAtLWdpdCBhL3BhcnNlLnkg Yi9wYXJzZS55CmluZGV4IDRiNzM2M2Q2Li40NzE2NjljOSAxMDA2NDQKLS0tIGEvcGFyc2UueQor KysgYi9wYXJzZS55CkBAIC00MjAsOSArNDIwLDkgQEAgaW5wdXR1bml0OglzaW1wbGVfbGlzdCBz aW1wbGVfbGlzdF90ZXJtaW5hdG9yCiAJCQkgIGdsb2JhbF9jb21tYW5kID0gKENPTU1BTkQgKilO VUxMOwogCQkJICBpZiAobGFzdF9jb21tYW5kX2V4aXRfdmFsdWUgPT0gMCkKIAkJCSAgICBsYXN0 X2NvbW1hbmRfZXhpdF92YWx1ZSA9IEVYX0JBRFVTQUdFOwkvKiBmb3JjZSBlcnJvciByZXR1cm4g Ki8KLQkJCSAgaGFuZGxlX2VvZl9pbnB1dF91bml0ICgpOwogCQkJICBpZiAoaW50ZXJhY3RpdmUg JiYgcGFyc2VfYW5kX2V4ZWN1dGVfbGV2ZWwgPT0gMCkKIAkJCSAgICB7CisJCQkgICAgICBoYW5k bGVfZW9mX2lucHV0X3VuaXQgKCk7CiAJCQkgICAgICBZWUFDQ0VQVDsKIAkJCSAgICB9CiAJCQkg IGVsc2UKLS0gCjIuMjEuMwoK --0000000000004ba73405ade533f9--