about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBarton E. Schaefer <schaefer@zsh.org>2016-01-27 21:57:45 -0800
committerBarton E. Schaefer <schaefer@zsh.org>2016-01-27 22:10:38 -0800
commitd18476ce5c0a76831192df8ba2006536206c6646 (patch)
tree4b92ab901bf75c8682970788f49d6d44013cdcf5
parent572f8c85ab40c2adf389a33ea6f2f91c4a4fbb30 (diff)
downloadzsh-d18476ce5c0a76831192df8ba2006536206c6646.tar.gz
zsh-d18476ce5c0a76831192df8ba2006536206c6646.tar.xz
zsh-d18476ce5c0a76831192df8ba2006536206c6646.zip
37819: zshaddhistory hook works for any history file write, even upon keyboard interrupt
-rw-r--r--ChangeLog3
-rw-r--r--Src/hist.c15
2 files changed, 14 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index e70ed9d80..a5fce1d79 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2016-01-27  Barton E. Schaefer  <schaefer@zsh.org>
 
+	* 37819: Src/hist.c: zshaddhistory hook is intended to work for
+	any history file write, even upon keyboard interrupt
+
 	* 37810: Src/Modules/zutil.c: repair handling of backslashes and
 	of names starting with "+"/":"/"=" in zparseopts option specs
 
diff --git a/Src/hist.c b/Src/hist.c
index 007366a49..7f9e4dbbb 100644
--- a/Src/hist.c
+++ b/Src/hist.c
@@ -1378,7 +1378,6 @@ should_ignore_line(Eprog prog)
 mod_export int
 hend(Eprog prog)
 {
-    LinkList hookargs = newlinklist();
     int flag, hookret, stack_pos = histsave_stack_pos;
     /*
      * save:
@@ -1418,9 +1417,17 @@ hend(Eprog prog)
 	DPUTS(hptr < chline, "History end pointer off start of line");
 	*hptr = '\0';
     }
-    addlinknode(hookargs, "zshaddhistory");
-    addlinknode(hookargs, chline);
-    callhookfunc("zshaddhistory", hookargs, 1, &hookret);
+    {
+	LinkList hookargs = newlinklist();
+	int save_errflag = errflag;
+	errflag = 0;
+
+	addlinknode(hookargs, "zshaddhistory");
+	addlinknode(hookargs, chline);
+	callhookfunc("zshaddhistory", hookargs, 1, &hookret);
+
+	errflag |= save_errflag;
+    }
     /* For history sharing, lock history file once for both read and write */
     hf = getsparam("HISTFILE");
     if (isset(SHAREHISTORY) && !lockhistfile(hf, 0)) {