Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Zsh spins in endless loop with SIGHUP + read in zshexit



On Thu, May 13, 2021 at 3:18 AM Jörg Sommer <joerg@xxxxxxxx> wrote:
>
> I'm using `read` in `zshexit` and when my terminal crashes (e.g. XTerm gets
> killed or ssh connection dies) Zsh spins in an endless loop until I kill it
> with SIGKILL (SIGTERM doesn't work).
> [...]
>
> So, if `raw_getbyte` returns `0` `zexit` gets called again. I think this
> causes the loop.

Yep.  zexit() is a no-op there because it doesn't allow itself to
execute recursively.

There might be other places where similar loops can be triggered.  I
see just now PWS has also produced a different patch, which requires
that zexit() return a value; I have no opinion on whether that's
actually preferable.

diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index 0561c3b3b..9edf30e01 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -906,6 +906,8 @@ getbyte(long do_keytmout, int *timeout, int full)
             continue;
         stopmsg = 1;
         zexit(1, ZEXIT_NORMAL);
+        /* If called from an exit hook, zexit() returns, so: */
+        break;
         }
         icnt = 0;
         if (errno == EINTR) {
@@ -929,6 +931,8 @@ getbyte(long do_keytmout, int *timeout, int full)
         zerr("error on TTY read: %e", errno);
         stopmsg = 1;
         zexit(1, ZEXIT_NORMAL);
+        /* If called from an exit hook, zexit() returns, so: */
+        break;
         }
     }
     if (cc == '\r')        /* undo the exchange of \n and \r determined by */




Messages sorted by: Reverse Date, Date, Thread, Author