]> granicus.if.org Git - strace/commitdiff
Fix signame usage in qual_signal
authorDmitry V. Levin <ldv@altlinux.org>
Fri, 18 Nov 2016 00:11:39 +0000 (00:11 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Fri, 18 Nov 2016 00:11:39 +0000 (00:11 +0000)
Do not assume that the string returned by signame starts with "SIG"
prefix, this is not always the case.

* syscall.c (qual_signal): Skip signame return value
when it does not have "SIG" prefix.

syscall.c

index 02a82e6a6276ae631aa3c222f811642cf42cee27..2e9b2e344475abb28e9863d489a36582ec4c9a8b 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -677,22 +677,27 @@ qual_fault(const char *const s, const unsigned int bitflag, const int not)
 static int
 qual_signal(const char *s, const unsigned int bitflag, const int not)
 {
-       unsigned int i;
+       int i;
 
        if (*s >= '0' && *s <= '9') {
-               int signo = string_to_uint_upto(s, 255);
-               if (signo < 0)
+               i = string_to_uint_upto(s, 255);
+               if (i < 0)
                        return -1;
-               qualify_one(signo, bitflag, not, -1, NULL);
+               qualify_one(i, bitflag, not, -1, NULL);
                return 0;
        }
        if (strncasecmp(s, "SIG", 3) == 0)
                s += 3;
-       for (i = 0; i <= NSIG; i++) {
-               if (strcasecmp(s, signame(i) + 3) == 0) {
-                       qualify_one(i, bitflag, not, -1, NULL);
-                       return 0;
-               }
+       for (i = 0; i <= NSIG; ++i) {
+               const char *name = signame(i);
+               if (strncasecmp(name, "SIG", 3) != 0)
+                       continue;
+               name += 3;
+
+               if (strcasecmp(name, s) != 0)
+                       continue;
+               qualify_one(i, bitflag, not, -1, NULL);
+               return 0;
        }
        return -1;
 }