diff options
Diffstat (limited to 'main/zsh/fix-zle-segfault.patch')
-rw-r--r-- | main/zsh/fix-zle-segfault.patch | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/main/zsh/fix-zle-segfault.patch b/main/zsh/fix-zle-segfault.patch new file mode 100644 index 000000000..faf6522f9 --- /dev/null +++ b/main/zsh/fix-zle-segfault.patch @@ -0,0 +1,94 @@ +From 0c2d823a7955981e88f7cb5b718a7081d97104f0 Mon Sep 17 00:00:00 2001 +From: Peter Stephenson <pws@zsh.org> +Date: Mon, 7 Dec 2015 14:32:52 +0000 +Subject: [PATCH] 37337: Delay freeing widget until not in use. +--- +Alpine notes: +Fixes http://bugs.alpinelinux.org/issues/5699 +--- +index 2d672de..e9b1428 100644 +--- a/Src/Zle/zle.h ++++ b/Src/Zle/zle.h +@@ -213,6 +213,8 @@ struct widget { + #define ZLE_KEEPSUFFIX (1<<9) /* DON'T remove added suffix */ + #define ZLE_NOTCOMMAND (1<<10) /* widget should not alter lastcmd */ + #define ZLE_ISCOMP (1<<11) /* usable for new style completion */ ++#define WIDGET_INUSE (1<<12) /* widget is in use */ ++#define WIDGET_FREE (1<<13) /* request to free when no longer in use */ + + /* thingies */ + +index 38427e8..1f0c07d 100644 +--- a/Src/Zle/zle_main.c ++++ b/Src/Zle/zle_main.c +@@ -1344,6 +1344,8 @@ execzlefunc(Thingy func, char **args, int set_bindk) + eofsent = 1; + ret = 1; + } else { ++ int inuse = wflags & WIDGET_INUSE; ++ w->flags |= WIDGET_INUSE; + if(!(wflags & ZLE_KEEPSUFFIX)) + removesuffix(); + if(!(wflags & ZLE_MENUCMP)) { +@@ -1367,6 +1369,12 @@ execzlefunc(Thingy func, char **args, int set_bindk) + ret = w->u.fn(args); + unqueue_signals(); + } ++ if (!inuse) { ++ if (w->flags & WIDGET_FREE) ++ freewidget(w); ++ else ++ w->flags &= ~WIDGET_INUSE; ++ } + if (!(wflags & ZLE_NOTCOMMAND)) + lastcmd = wflags; + } +@@ -1387,6 +1395,8 @@ execzlefunc(Thingy func, char **args, int set_bindk) + int osc = sfcontext, osi = movefd(0); + int oxt = isset(XTRACE); + LinkList largs = NULL; ++ int inuse = w->flags & WIDGET_INUSE; ++ w->flags |= WIDGET_INUSE; + + if (*args) { + largs = newlinklist(); +@@ -1402,8 +1412,15 @@ execzlefunc(Thingy func, char **args, int set_bindk) + opts[XTRACE] = oxt; + sfcontext = osc; + endparamscope(); +- lastcmd = w->flags; +- w->flags = 0; ++ lastcmd = w->flags & ~(WIDGET_INUSE|WIDGET_FREE); ++ if (inuse) { ++ w->flags &= WIDGET_INUSE|WIDGET_FREE; ++ } else { ++ if (w->flags & WIDGET_FREE) ++ freewidget(w); ++ else ++ w->flags = 0; ++ } + r = 1; + redup(osi, 0); + } +index 271fd8e..21495b6 100644 +--- a/Src/Zle/zle_thingy.c ++++ b/Src/Zle/zle_thingy.c +@@ -253,9 +253,14 @@ unbindwidget(Thingy t, int override) + /* Free a widget. */ + + /**/ +-static void ++void + freewidget(Widget w) + { ++ if (w->flags & WIDGET_INUSE) { ++ w->flags |= WIDGET_FREE; ++ return; ++ } ++ + if (w->flags & WIDGET_NCOMP) { + zsfree(w->u.comp.wid); + zsfree(w->u.comp.func); +-- +2.10.0 + |