hush: fix a case where EXIT trap may modify its code mid-flight

function                                             old     new   delta
hush_exit                                             93      99      +6

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-01-19 16:58:44 +01:00
parent b8d076b00b
commit 46f839c3f7

View File

@ -1936,7 +1936,7 @@ static void hush_exit(int exitcode)
if (G.exiting <= 0 && G_traps && G_traps[0] && G_traps[0][0]) { if (G.exiting <= 0 && G_traps && G_traps[0] && G_traps[0][0]) {
char *argv[3]; char *argv[3];
/* argv[0] is unused */ /* argv[0] is unused */
argv[1] = G_traps[0]; argv[1] = xstrdup(G_traps[0]); /* copy, since EXIT trap handler may modify G_traps[0] */
argv[2] = NULL; argv[2] = NULL;
G.exiting = 1; /* prevent EXIT trap recursion */ G.exiting = 1; /* prevent EXIT trap recursion */
/* Note: G_traps[0] is not cleared! /* Note: G_traps[0] is not cleared!