While at it, make get_signum() return -1 for numeric strings >= NSIG.
function old new delta
trapcmd 292 306 +14
get_signum 295 300 +5
builtin_trap 413 412 -1
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/1 up/down: 19/-1) Total: 18 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
unsigned i;
i = bb_strtou(name, NULL, 10);
- if (!errno)
+ if (!errno && i < NSIG) /* for shells, we allow 0 too */
return i;
if (strncasecmp(name, "SIG", 3) == 0)
name += 3;
arg = *++argv;
} /* else it must be -SIG */
signo = get_signum(arg);
- if (signo < 0) { /* || signo > MAX_SIGNUM ? */
+ if (signo < 0) {
bb_error_msg("bad signal name '%s'", arg);
return EXIT_FAILURE;
}
return 0;
}
+ /* Why the second check?
+ * "trap NUM [sig2]..." is the same as "trap - NUM [sig2]..."
+ * In this case, NUM is signal no, not an action.
+ */
action = NULL;
- if (ap[1])
+ if (ap[1] && !is_number(ap[0]))
action = *ap++;
+
exitcode = 0;
while (*ap) {
signo = get_signum(*ap);
- if (signo < 0 || signo >= NSIG) {
+ if (signo < 0) {
/* Mimic bash message exactly */
ash_msg("%s: invalid signal specification", *ap);
exitcode = 1;
sighandler_t handler;
sig = get_signum(*argv++);
- if (sig < 0 || sig >= NSIG) {
+ if (sig < 0) {
ret = EXIT_FAILURE;
/* Mimic bash message exactly */
bb_error_msg("trap: %s: invalid signal specification", argv[-1]);