From 553d6bb272f26400d6d4d1cac7c1df84c447449b Mon Sep 17 00:00:00 2001 From: Chet Ramey Date: Wed, 10 Dec 2025 11:36:18 -0500 Subject: [PATCH] Readline-8.3 patch 3: fix crash when interrupting reverse i-search with ^C --- input.c | 6 +++--- isearch.c | 8 +++++--- patchlevel | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/input.c b/input.c index 3383edb..838692a 100644 --- a/input.c +++ b/input.c @@ -975,11 +975,11 @@ postproc_signal: call the application's signal event hook. */ if (rl_signal_event_hook) (*rl_signal_event_hook) (); -#if defined (READLINE_CALLBACKS) - else if (osig == SIGINT && (ostate & RL_STATE_CALLBACK) && (ostate & (RL_STATE_ISEARCH|RL_STATE_NSEARCH|RL_STATE_NUMERICARG))) + /* If the application's SIGINT handler returns, make sure we abort out of + searches and numeric arguments because we've freed necessary state. */ + if (osig == SIGINT && (ostate & (RL_STATE_ISEARCH|RL_STATE_NSEARCH|RL_STATE_NUMERICARG))) /* just these cases for now */ _rl_abort_internal (); -#endif } } diff --git a/isearch.c b/isearch.c index 7b845c2..6cb1879 100644 --- a/isearch.c +++ b/isearch.c @@ -889,12 +889,14 @@ opcode_dispatch: int _rl_isearch_cleanup (_rl_search_cxt *cxt, int r) { + RL_UNSETSTATE(RL_STATE_ISEARCH); + if (cxt == 0) + return (r != 0); + + _rl_iscxt = 0; if (r >= 0) _rl_isearch_fini (cxt); _rl_scxt_dispose (cxt, 0); - _rl_iscxt = 0; - - RL_UNSETSTATE(RL_STATE_ISEARCH); return (r != 0); } diff --git a/patchlevel b/patchlevel index 7cbda82..ce3e355 100644 --- a/patchlevel +++ b/patchlevel @@ -1,3 +1,3 @@ # Do not edit -- exists only for use by patch -2 +3 -- 2.47.3