diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-01-30 04:29:03 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-01-30 04:29:03 +0100 |
commit | 749575d3c52c32f57f46f2cbb2942a2204d333ee (patch) | |
tree | 8c6269fbc476bbd01b2c6295f86870319b0df9b1 | |
parent | 6f9442ff30f2fa7b66395935b0f59b01ecc89f0e (diff) | |
download | busybox-w32-749575d3c52c32f57f46f2cbb2942a2204d333ee.tar.gz busybox-w32-749575d3c52c32f57f46f2cbb2942a2204d333ee.tar.bz2 busybox-w32-749575d3c52c32f57f46f2cbb2942a2204d333ee.zip |
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>
-rw-r--r-- | shell/hush.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/shell/hush.c b/shell/hush.c index ddf377355..585c51bd5 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
@@ -2004,10 +2004,12 @@ static int check_and_run_traps(void) | |||
2004 | smalluint save_rcode; | 2004 | smalluint save_rcode; |
2005 | char *argv[3]; | 2005 | char *argv[3]; |
2006 | /* argv[0] is unused */ | 2006 | /* argv[0] is unused */ |
2007 | argv[1] = G_traps[sig]; | 2007 | argv[1] = xstrdup(G_traps[sig]); |
2008 | /* why strdup? trap can modify itself: trap 'trap "echo oops" INT' INT */ | ||
2008 | argv[2] = NULL; | 2009 | argv[2] = NULL; |
2009 | save_rcode = G.last_exitcode; | 2010 | save_rcode = G.last_exitcode; |
2010 | builtin_eval(argv); | 2011 | builtin_eval(argv); |
2012 | free(argv[1]); | ||
2011 | //FIXME: shouldn't it be set to 128 + sig instead? | 2013 | //FIXME: shouldn't it be set to 128 + sig instead? |
2012 | G.last_exitcode = save_rcode; | 2014 | G.last_exitcode = save_rcode; |
2013 | last_sig = sig; | 2015 | last_sig = sig; |