kill, whether implemented as a builtin or an external command, supports
signal numbers and signal names.  As an extension to POSIX, signal names
may be prefixed with "SIG".  Both /bin/kill and the kill ksh builtin
attempt to do that, but the test in ksh is flawed.

The minimal diff below fixes that.

Index: trap.c
===================================================================
RCS file: /d/cvs/src/bin/ksh/trap.c,v
retrieving revision 1.32
diff -u -p -p -u -r1.32 trap.c
--- trap.c      15 Mar 2018 16:51:29 -0000      1.32
+++ trap.c      8 Dec 2018 11:02:12 -0000
@@ -97,13 +97,13 @@ gettrap(const char *name, int igncase)
                        if (igncase) {
                                if (p->name && (!strcasecmp(p->name, name) ||
                                    (strlen(name) > 3 && !strncasecmp("SIG",
-                                   p->name, 3) &&
+                                   name, 3) &&
                                    !strcasecmp(p->name, name + 3))))
                                        return p;
                        } else {
                                if (p->name && (!strcmp(p->name, name) ||
                                    (strlen(name) > 3 && !strncmp("SIG",
-                                   p->name, 3) && !strcmp(p->name, name + 3))))
+                                   name, 3) && !strcmp(p->name, name + 3))))
                                        return p;
                        }
                }



Alternately, if you find that code a bit obfuscated, please find below
a version I find less redundant and more readable.

Looking for oks, preferably for the second version.


Index: trap.c
===================================================================
RCS file: /d/cvs/src/bin/ksh/trap.c,v
retrieving revision 1.32
diff -u -p -p -u -r1.32 trap.c
--- trap.c      15 Mar 2018 16:51:29 -0000      1.32
+++ trap.c      8 Dec 2018 11:03:46 -0000
@@ -92,20 +92,18 @@ gettrap(const char *name, int igncase)
                        return &sigtraps[n];
                return NULL;
        }
+
+       if (igncase && strncasecmp(name, "SIG", 3) == 0)
+               name += 3;
+       if (!igncase && strncmp(name, "SIG", 3) == 0)
+               name += 3;
+
        for (p = sigtraps, i = NSIG+1; --i >= 0; p++)
                if (p->name) {
-                       if (igncase) {
-                               if (p->name && (!strcasecmp(p->name, name) ||
-                                   (strlen(name) > 3 && !strncasecmp("SIG",
-                                   p->name, 3) &&
-                                   !strcasecmp(p->name, name + 3))))
-                                       return p;
-                       } else {
-                               if (p->name && (!strcmp(p->name, name) ||
-                                   (strlen(name) > 3 && !strncmp("SIG",
-                                   p->name, 3) && !strcmp(p->name, name + 3))))
-                                       return p;
-                       }
+                       if (igncase && strcasecmp(p->name, name) == 0)
+                               return p;
+                       if (!igncase && strcmp(p->name, name) == 0)
+                               return p;
                }
        return NULL;
 }

-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to