* Incorrect detection of EOF with interactive editline @ 2025-09-18 0:33 Abdullah 2025-09-18 0:33 ` [PATCH] histedit: fix dash exiting when receiving a signal interactively Abdullah 0 siblings, 1 reply; 4+ messages in thread From: Abdullah @ 2025-09-18 0:33 UTC (permalink / raw) To: dash When an interactive shell (with editline) has a trap signal set (e.g., [1]) and the signal is caught AND there's nothing on the input line, the shell (or at least editline), after executing the trap handler, treats the empty line as EOF. Try [1] with interactive editline, have a clean line input line, and change the size of your term, then your shell would die. Also, we should call el_resize on WINCH, because we have not set the EL_SIGNAL option (and we shouldn't set EL_SIGNAL, that would mixup with trap handlers). [1] $ trap 'echo "WINDOW CHANGED! New size:"; stty size' WINCH ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH] histedit: fix dash exiting when receiving a signal interactively 2025-09-18 0:33 Incorrect detection of EOF with interactive editline Abdullah @ 2025-09-18 0:33 ` Abdullah 2025-09-18 3:20 ` Herbert Xu 0 siblings, 1 reply; 4+ messages in thread From: Abdullah @ 2025-09-18 0:33 UTC (permalink / raw) To: dash; +Cc: Abdullah --- src/input.c | 32 ++++++++++++++++++++++++++++---- src/trap.c | 16 +++++++++++++++- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/input.c b/src/input.c index c36d120..f775c9f 100644 --- a/src/input.c +++ b/src/input.c @@ -39,6 +39,7 @@ #include <string.h> #include <termios.h> #include <unistd.h> +#include <wchar.h> /* * This file implements the input routines used by the parser. @@ -276,6 +277,11 @@ preadfd(void) int unget; int pnr; int nr; +#ifndef SMALL + const LineInfoW *liw; + wchar_t wbuf[2]; + const wchar_t *wc; +#endif nr = input_get_lleft(parsefile); @@ -306,9 +312,8 @@ retry: rl_cp = el_gets(el, &el_len); popstackmark(&smark); } - if (rl_cp == NULL) - nr = 0; - else { + + if (rl_cp) { if (nr > el_len) nr = el_len; memcpy(buf, rl_cp, nr); @@ -317,9 +322,28 @@ retry: rl_cp += nr; } else rl_cp = 0; + return nr; } - return nr; + /* Got a signal while reading. */ + if (el_len < 0 && errno == EINTR && pending_sig) { + out2c('\r'); + liw = el_wline(el); + /* Don't lose the current line. + * el_wpush() takes a L'\0' terminated string. + * el_wline() gives us a string with N elements. + * Simple solution: el_wpush() it wchar-by-wchar. + */ + wbuf[1] = L'\0'; + wc = liw->buffer; + while (wc < liw->lastchar) { + wbuf[0] = *wc++; + el_wpush(el, wbuf); + } + dotrap(); + goto retry; + } + return 0; } #endif diff --git a/src/trap.c b/src/trap.c index 23829a5..c045257 100644 --- a/src/trap.c +++ b/src/trap.c @@ -53,6 +53,7 @@ #include "error.h" #include "trap.h" #include "mystring.h" +#include "myhistedit.h" /* * Sigmode records the current value of the signal handlers for the various @@ -243,7 +244,12 @@ setsignal(int signo) } } - if (signo == SIGCHLD) + if ( + signo == SIGCHLD +#if defined(WINCH) && !defined(SMALL) + || signo == WINCH +#endif + ) action = S_CATCH; t = &sigmode[signo - 1]; @@ -321,6 +327,11 @@ onsig(int signo) return; } +#if defined(SIGWINCH) && !defined(SMALL) + if (signo == SIGWINCH && el) + el_resize(el); +#endif + gotsig[signo - 1] = 1; pending_sig = signo; @@ -397,6 +408,9 @@ setinteractive(int on) setsignal(SIGINT); setsignal(SIGQUIT); setsignal(SIGTERM); +#if defined(WINCH) && !defined(SMALL) + setsignal(WINCH); +#endif } -- 2.51.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] histedit: fix dash exiting when receiving a signal interactively 2025-09-18 0:33 ` [PATCH] histedit: fix dash exiting when receiving a signal interactively Abdullah @ 2025-09-18 3:20 ` Herbert Xu [not found] ` <DCW6NI4KVK3I.1ALXRKL5V6UCM@gmail.com> 0 siblings, 1 reply; 4+ messages in thread From: Herbert Xu @ 2025-09-18 3:20 UTC (permalink / raw) To: Abdullah; +Cc: dash Abdullah <3bd3bdr@gmail.com> wrote: > > + /* Got a signal while reading. */ > + if (el_len < 0 && errno == EINTR && pending_sig) { > + out2c('\r'); > + liw = el_wline(el); > + /* Don't lose the current line. > + * el_wpush() takes a L'\0' terminated string. > + * el_wline() gives us a string with N elements. > + * Simple solution: el_wpush() it wchar-by-wchar. > + */ > + wbuf[1] = L'\0'; > + wc = liw->buffer; > + while (wc < liw->lastchar) { > + wbuf[0] = *wc++; > + el_wpush(el, wbuf); > + } > + dotrap(); > + goto retry; > + } > + return 0; Can you please explain why this is necessary and why el_gets can't handle it? > - if (signo == SIGCHLD) > + if ( > + signo == SIGCHLD > +#if defined(WINCH) && !defined(SMALL) > + || signo == WINCH > +#endif Please use SIGWINCH consistently. Thanks, -- Email: Herbert Xu <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt ^ permalink raw reply [flat|nested] 4+ messages in thread
[parent not found: <DCW6NI4KVK3I.1ALXRKL5V6UCM@gmail.com>]
* Re: [PATCH] histedit: fix dash exiting when receiving a signal interactively [not found] ` <DCW6NI4KVK3I.1ALXRKL5V6UCM@gmail.com> @ 2025-09-22 3:43 ` Herbert Xu 0 siblings, 0 replies; 4+ messages in thread From: Herbert Xu @ 2025-09-22 3:43 UTC (permalink / raw) To: 3bd; +Cc: DASH Mailing List On Thu, Sep 18, 2025 at 10:45:38PM +0300, 3bd wrote: > > EditLine has no "restore the current line to XYZ". > No el_restore_line() or something similar. > > We could avoid this if we set the SA_RESTART flag in sa_flags, > then EditLine's internal call to read(2) won't fail. > But I'm not sure about this. This could play with dash's internal > handling of signals. I think that's a defiency in libedit and should be addressed there. > >> - if (signo == SIGCHLD) > >> + if ( > >> + signo == SIGCHLD > >> +#if defined(WINCH) && !defined(SMALL) > >> + || signo == WINCH > >> +#endif > > > > Please use SIGWINCH consistently. > > Oh, sorry, I just noticed the mistake. I'm happy to take the SIGWINCH change though. Thanks, -- Email: Herbert Xu <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-09-22 3:43 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-18 0:33 Incorrect detection of EOF with interactive editline Abdullah
2025-09-18 0:33 ` [PATCH] histedit: fix dash exiting when receiving a signal interactively Abdullah
2025-09-18 3:20 ` Herbert Xu
[not found] ` <DCW6NI4KVK3I.1ALXRKL5V6UCM@gmail.com>
2025-09-22 3:43 ` Herbert Xu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox