aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-01-30 04:29:03 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-01-30 04:29:03 +0100
commit749575d3c52c32f57f46f2cbb2942a2204d333ee (patch)
tree8c6269fbc476bbd01b2c6295f86870319b0df9b1
parent6f9442ff30f2fa7b66395935b0f59b01ecc89f0e (diff)
downloadbusybox-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.c4
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;