hush: protect against self-modifying trap code

function                                             old     new   delta
check_and_run_traps                                  211     236     +25

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-01-30 04:29:03 +01:00
parent 6f9442ff30
commit 749575d3c5

View File

@ -2004,10 +2004,12 @@ static int check_and_run_traps(void)
smalluint save_rcode; smalluint save_rcode;
char *argv[3]; char *argv[3];
/* argv[0] is unused */ /* argv[0] is unused */
argv[1] = G_traps[sig]; argv[1] = xstrdup(G_traps[sig]);
/* why strdup? trap can modify itself: trap 'trap "echo oops" INT' INT */
argv[2] = NULL; argv[2] = NULL;
save_rcode = G.last_exitcode; save_rcode = G.last_exitcode;
builtin_eval(argv); builtin_eval(argv);
free(argv[1]);
//FIXME: shouldn't it be set to 128 + sig instead? //FIXME: shouldn't it be set to 128 + sig instead?
G.last_exitcode = save_rcode; G.last_exitcode = save_rcode;
last_sig = sig; last_sig = sig;