]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tree-wide: add new SIGNAL_VALID() macro-like function that validates signal numbers
authorLennart Poettering <lennart@poettering.net>
Fri, 8 Apr 2016 09:27:28 +0000 (11:27 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 12 Apr 2016 11:43:32 +0000 (13:43 +0200)
And port all code over to use it.

src/basic/signal-util.c
src/basic/signal-util.h
src/core/dbus-kill.c
src/core/dbus-unit.c
src/core/unit.c
src/libsystemd/sd-event/sd-event.c
src/login/logind-session-dbus.c
src/login/logind-user-dbus.c
src/machine/machine-dbus.c

index e3047b209b65bb05af4c001e32e88bad78d070c5..280b5c3251ecc53f84baf906be816522e3f7a72c 100644 (file)
@@ -255,7 +255,7 @@ int signal_from_string(const char *s) {
         }
         if (safe_atou(s, &u) >= 0) {
                 signo = (int) u + offset;
-                if (signo > 0 && signo < _NSIG)
+                if (SIGNAL_VALID(signo))
                         return signo;
         }
         return -EINVAL;
index a7322ff26a9e4fa03bae9d655e6bba23f5bad6f7..dfd6eb564dff4b8f478fb94304daf54dff3b7c9e 100644 (file)
@@ -50,3 +50,7 @@ static inline void block_signals_reset(sigset_t *ss) {
                 assert_se(sigprocmask_many(SIG_BLOCK, &t, __VA_ARGS__, -1) >= 0); \
                 t;                                                                \
         })
+
+static inline bool SIGNAL_VALID(int signo) {
+        return signo > 0 && signo < _NSIG;
+}
index fc50fafaad272e48c787a76b1ff7166d4055aeaf..0f54c6b84b4c383d6e017bf60654bad354f73c97 100644 (file)
@@ -58,7 +58,7 @@ int bus_kill_context_set_transient_property(
 
                 k = kill_mode_from_string(m);
                 if (k < 0)
-                        return -EINVAL;
+                        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Kill mode '%s' not known.", m);
 
                 if (mode != UNIT_CHECK) {
                         c->kill_mode = k;
@@ -75,7 +75,7 @@ int bus_kill_context_set_transient_property(
                 if (r < 0)
                         return r;
 
-                if (sig <= 0 || sig >= _NSIG)
+                if (!SIGNAL_VALID(sig))
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Signal %i out of range", sig);
 
                 if (mode != UNIT_CHECK) {
index b351f6a2c20394468aebc71d93e8edd17a9bcded..c50726507012b3970f3aee0c5a20fefc2a64b2e2 100644 (file)
@@ -27,6 +27,7 @@
 #include "locale-util.h"
 #include "log.h"
 #include "selinux-access.h"
+#include "signal-util.h"
 #include "special.h"
 #include "string-util.h"
 #include "strv.h"
@@ -547,7 +548,7 @@ int bus_unit_method_kill(sd_bus_message *message, void *userdata, sd_bus_error *
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid who argument %s", swho);
         }
 
-        if (signo <= 0 || signo >= _NSIG)
+        if (!SIGNAL_VALID(signo))
                 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Signal number out of range.");
 
         r = bus_verify_manage_units_async_full(
@@ -1002,7 +1003,6 @@ int bus_unit_queue_job(
                         type = JOB_TRY_RELOAD;
         }
 
-
         if (type == JOB_STOP &&
             (u->load_state == UNIT_NOT_FOUND || u->load_state == UNIT_ERROR) &&
             unit_active_state(u) == UNIT_INACTIVE)
@@ -1259,6 +1259,7 @@ int bus_unit_set_properties(
 }
 
 int bus_unit_check_load_state(Unit *u, sd_bus_error *error) {
+        assert(u);
 
         if (u->load_state == UNIT_LOADED)
                 return 0;
index c028f57f139101e615505176c8ea665d48696ed6..a8174e6041a7098c15a1b42401f9460064790555 100644 (file)
@@ -47,6 +47,7 @@
 #include "path-util.h"
 #include "process-util.h"
 #include "set.h"
+#include "signal-util.h"
 #include "special.h"
 #include "stat-util.h"
 #include "stdio-util.h"
@@ -3062,8 +3063,7 @@ bool unit_active_or_pending(Unit *u) {
 int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error) {
         assert(u);
         assert(w >= 0 && w < _KILL_WHO_MAX);
-        assert(signo > 0);
-        assert(signo < _NSIG);
+        assert(SIGNAL_VALID(signo));
 
         if (!UNIT_VTABLE(u)->kill)
                 return -EOPNOTSUPP;
index 841358ed03c73a9a0cb32136b5a0bfe1baeeffa7..9fd744768d5a7fffb46e23e00e50a7fcfe29ff8f 100644 (file)
@@ -1145,8 +1145,7 @@ _public_ int sd_event_add_signal(
         int r;
 
         assert_return(e, -EINVAL);
-        assert_return(sig > 0, -EINVAL);
-        assert_return(sig < _NSIG, -EINVAL);
+        assert_return(SIGNAL_VALID(sig), -EINVAL);
         assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
         assert_return(!event_pid_changed(e), -ECHILD);
 
@@ -2200,7 +2199,7 @@ static int process_signal(sd_event *e, struct signal_data *d, uint32_t events) {
                 if (_unlikely_(n != sizeof(si)))
                         return -EIO;
 
-                assert(si.ssi_signo < _NSIG);
+                assert(SIGNAL_VALID(si.ssi_signo));
 
                 read_one = true;
 
index ff9170683bafd49b3dbbe0a49e3c15ebfe32e778..0f8862c0d9ca1543bf84f674754731a8bab9147f 100644 (file)
@@ -28,6 +28,7 @@
 #include "logind-session-device.h"
 #include "logind-session.h"
 #include "logind.h"
+#include "signal-util.h"
 #include "strv.h"
 #include "util.h"
 
@@ -300,7 +301,7 @@ int bus_session_method_kill(sd_bus_message *message, void *userdata, sd_bus_erro
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid kill parameter '%s'", swho);
         }
 
-        if (signo <= 0 || signo >= _NSIG)
+        if (!SIGNAL_VALID(signo))
                 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid signal %i", signo);
 
         r = bus_verify_polkit_async(
index fd98c7becafb800daeb3f7ada0f8d8e06484a8ea..b73f9ea69e8c30d8f94108fdd23f3431ce5c9b70 100644 (file)
@@ -25,6 +25,7 @@
 #include "formats-util.h"
 #include "logind-user.h"
 #include "logind.h"
+#include "signal-util.h"
 #include "strv.h"
 #include "user-util.h"
 
@@ -222,7 +223,7 @@ int bus_user_method_kill(sd_bus_message *message, void *userdata, sd_bus_error *
         if (r < 0)
                 return r;
 
-        if (signo <= 0 || signo >= _NSIG)
+        if (!SIGNAL_VALID(signo))
                 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid signal %i", signo);
 
         r = user_kill(u, signo);
index c5bbf2fbde92982da41dc18644abd0926f3c9970..c7ff0efac8f5e0c332a593ada4db6e548d2e21d6 100644 (file)
@@ -46,6 +46,7 @@
 #include "mkdir.h"
 #include "path-util.h"
 #include "process-util.h"
+#include "signal-util.h"
 #include "strv.h"
 #include "terminal-util.h"
 #include "user-util.h"
@@ -166,7 +167,7 @@ int bus_machine_method_kill(sd_bus_message *message, void *userdata, sd_bus_erro
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid kill parameter '%s'", swho);
         }
 
-        if (signo <= 0 || signo >= _NSIG)
+        if (!SIGNAL_VALID(signo))
                 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid signal %i", signo);
 
         r = bus_verify_polkit_async(