From d27ed4a839a982cf53e6e42013a78f400b4a73cb Mon Sep 17 00:00:00 2001 From: lohhiiccc <96543753+lohhiiccc@users.noreply.github.com> Date: Mon, 23 Mar 2026 23:04:10 +0100 Subject: [PATCH] fix: propagate setitimer and sigaction failures --- includes/internal/ping/scheduler.h | 4 ++-- src/ping/core/ping.c | 3 ++- src/ping/scheduler/scheduler_arm.c | 6 +++--- src/ping/scheduler/scheduler_init.c | 13 ++++++------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/includes/internal/ping/scheduler.h b/includes/internal/ping/scheduler.h index 5f6f042..9175f5f 100644 --- a/includes/internal/ping/scheduler.h +++ b/includes/internal/ping/scheduler.h @@ -5,8 +5,8 @@ #include "internal/ping/ping_state.h" -void ping_scheduler_init(struct ping_state *state); -void ping_scheduler_arm(const struct ping_config *config); +int ping_scheduler_init(struct ping_state *state); +int ping_scheduler_arm(const struct ping_config *config); void ping_scheduler_select_tv(const struct ping_config *config, struct timeval *tv); diff --git a/src/ping/core/ping.c b/src/ping/core/ping.c index 86cf8b2..bb0140c 100644 --- a/src/ping/core/ping.c +++ b/src/ping/core/ping.c @@ -61,7 +61,8 @@ ping_one(const struct ping_config *config, struct destinations *dest, ping_init_state(&state, &stats, &tracker, config, dest->ip, handle); payload_len = config->packet_size; - ping_scheduler_init(&state); + if (0 != ping_scheduler_init(&state)) + return 1; ping_output_start(config, dest, payload_len); do_send(&state, payload_len); ping_loop(&state, payload_len); diff --git a/src/ping/scheduler/scheduler_arm.c b/src/ping/scheduler/scheduler_arm.c index 9b753e1..5e25bc3 100644 --- a/src/ping/scheduler/scheduler_arm.c +++ b/src/ping/scheduler/scheduler_arm.c @@ -1,19 +1,19 @@ #include "ping/ft_ping_flags.h" #include "internal/ping/scheduler.h" -void +int ping_scheduler_arm(const struct ping_config *config) { struct itimerval itv; double interval; if (HAS_FLAG(config->flags, FLAG_FLOOD)) - return; + return 0; interval = (double)config->interval; itv.it_value.tv_sec = (time_t)interval; itv.it_value.tv_usec = (suseconds_t)((interval - (double)(time_t)interval) * 1e6); itv.it_interval.tv_sec = 0; itv.it_interval.tv_usec = 0; - setitimer(ITIMER_REAL, &itv, NULL); + return setitimer(ITIMER_REAL, &itv, NULL); } diff --git a/src/ping/scheduler/scheduler_init.c b/src/ping/scheduler/scheduler_init.c index fe472ed..5a53e71 100644 --- a/src/ping/scheduler/scheduler_init.c +++ b/src/ping/scheduler/scheduler_init.c @@ -4,20 +4,20 @@ /* Forward declarations */ static void inline sigint_handler(int sig); static void inline sigalrm_handler(int sig); -static void install_signal(int signum, void (*handler)(int)); +static int install_signal(int signum, void (*handler)(int)); static struct ping_state *g_state = NULL; /* -------------------- */ -void +int ping_scheduler_init(struct ping_state *state) { g_state = state; - install_signal(SIGALRM, sigalrm_handler); - install_signal(SIGINT, sigint_handler); + return (install_signal(SIGALRM, sigalrm_handler) != 0 || + install_signal(SIGINT, sigint_handler) != 0) ? -1 : 0; } -static void +static int install_signal(int signum, void (*handler)(int)) { struct sigaction sa; @@ -25,7 +25,7 @@ install_signal(int signum, void (*handler)(int)) sa.sa_handler = handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; - sigaction(signum, &sa, NULL); + return sigaction(signum, &sa, NULL); } static void inline @@ -41,4 +41,3 @@ sigint_handler(__unused int sig) if (NULL != g_state) g_state->stop_flag = 1; } -