From a3547fd4c165bd6c0c9c9d2643bd61b593f7bbaf Mon Sep 17 00:00:00 2001 From: Oliver Kiddle Date: Fri, 31 Oct 2025 10:54:49 +0100 Subject: 54013: add a range check on signal numbers passed to trap --- ChangeLog | 3 +++ Src/builtin.c | 8 ++++++++ Src/jobs.c | 6 +++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 9e5110098..b7b58541a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2025-10-31 Oliver Kiddle + * 54013: Src/builtin.c, Src/jobs.c: add a range check on signal + numbers passed to trap + * 54012: Src/subst.c: fix use of out of scope array variable * 54007: Src/exec.c, Src/hist.c, Src/init.c, Src/jobs.c, Src/module.c, diff --git a/Src/builtin.c b/Src/builtin.c index 5dd4fee01..23067abe1 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -7428,6 +7428,14 @@ bin_trap(char *name, char **argv, UNUSED(Options ops), UNUSED(int func)) return 1; } + if (!*argv) { + if (idigit(*arg) || !strncmp(arg, "SIG", 3)) + zwarnnam(name, "undefined signal: %s", arg); + else + zwarnnam(name, "signal expected"); + return 1; + } + /* set traps */ for (; *argv; argv++) { Eprog t; diff --git a/Src/jobs.c b/Src/jobs.c index 31938bedd..4905ae925 100644 --- a/Src/jobs.c +++ b/Src/jobs.c @@ -3054,7 +3054,11 @@ getsigidx(const char *s) /* check for a signal specified by number */ x = atoi(s); - if (idigit(*s) && x >= 0) + if (idigit(*s) && x >= 0 && (x < VSIGCOUNT +#if defined(SIGRTMIN) && defined(SIGRTMAX) + || (x >= SIGRTMIN && x <= SIGRTMAX) +#endif + )) return SIGIDX(x); /* search for signal by name */ -- cgit v1.2.3-70-g09d2