chiark / gitweb /
util: make signal_from_string() accept RTMIN, RTMAX, and RTMAX-n
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 3 May 2018 07:40:02 +0000 (16:40 +0900)
committerSven Eden <yamakuzure@gmx.net>
Fri, 24 Aug 2018 14:47:08 +0000 (16:47 +0200)
Before this, `signal_from_string()` accepts simple signal name
or RTMIN+n. This makes the function also accept RTMIN, RTMAX,
and RTMAX-n.
Note that RTMIN+0 is equivalent to RTMIN, and RTMAX-0 is to RTMAX.

This also fixes the integer overflow reported by oss-fuzz #8064.
https://oss-fuzz.com/v2/testcase-detail/5648573352902656

src/basic/signal-util.c

index 5bd5c71ceb700464b786ed9df682147e739b3c8e..bf4816fd6d938f599a5d316a7bd849a662b42cd2 100644 (file)
@@ -234,7 +234,11 @@ int signal_from_string(const char *s) {
         const char *p;
         int signo, r;
 
-        /* Check that the input is a signal number. */
+        /* Check that the input is a signal name. */
+        signo = __signal_from_string(s);
+        if (signo > 0)
+                return signo;
+
         if (safe_atoi(s, &signo) >= 0) {
                 if (SIGNAL_VALID(signo))
                         return signo;
@@ -242,15 +246,6 @@ int signal_from_string(const char *s) {
                         return -ERANGE;
         }
 
-        /* Drop "SIG" prefix. */
-        if (startswith(s, "SIG"))
-                s += 3;
-
-        /* Check that the input is a signal name. */
-        signo = __signal_from_string(s);
-        if (signo > 0)
-                return signo;
-
         /* Check that the input is RTMIN or
          * RTMIN+n (0 <= n <= SIGRTMAX-SIGRTMIN). */
         p = startswith(s, "RTMIN");
@@ -292,6 +287,17 @@ int signal_from_string(const char *s) {
         return -EINVAL;
 }
 
+int signal_from_string_try_harder(const char *s) {
+        int signo;
+        assert(s);
+
+        signo = signal_from_string(s);
+        if (signo <= 0)
+                if (startswith(s, "SIG"))
+                        return signal_from_string(s+3);
+
+        return signo;
+}
 
 #if 0 /// UNNEEDED by elogind
 void nop_signal_handler(int sig) {