From: Mauro Carvalho Chehab Date: Tue, 16 Jul 2024 05:38:13 +0000 (+0200) Subject: ras-mc-handler: cleanup trigger logic X-Git-Tag: v0.8.1~12 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=5e3194f64db5590eab0f20c56d9abab6dbdd4941;p=users%2Fmchehab%2Frasdaemon.git ras-mc-handler: cleanup trigger logic - Only setup mc_ce_trigger/mc_ue_trigger if the trigger is valid; - Check if the trigger is there before doing strcmp, as checking if a pointer is not null is faster than strcmp(); - Ensure that the trigger env vars will be const, as we don't want to accidentally override those env vars; - Print trigger enabled messages when rasdaemon runs with -f; - ensure that trigger variables will initialize to NULL; - coding style cleanups. Signed-off-by: Mauro Carvalho Chehab --- diff --git a/ras-events.c b/ras-events.c index 0df1d20..3c778e8 100644 --- a/ras-events.c +++ b/ras-events.c @@ -62,7 +62,7 @@ extern char *choices_disable; -const static struct event_trigger event_triggers[] = { +static const struct event_trigger event_triggers[] = { { "mc_event", &mc_event_trigger_setup }, }; @@ -284,6 +284,7 @@ free_ras: static void setup_event_trigger(char *event) { struct event_trigger trigger; + for (int i = 0; i < ARRAY_SIZE(event_triggers); i++) { trigger = event_triggers[i]; if (!strcmp(event, trigger.name)) diff --git a/ras-mc-handler.c b/ras-mc-handler.c index 2f06a01..26ff0be 100644 --- a/ras-mc-handler.c +++ b/ras-mc-handler.c @@ -16,42 +16,55 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #define _GNU_SOURCE +#include #include #include #include -#include #include -#include +#include + #include "ras-mc-handler.h" -#include "ras-record.h" #include "ras-logger.h" #include "ras-page-isolation.h" +#include "ras-record.h" #include "ras-report.h" #include "trigger.h" #define MAX_ENV 30 -static char *mc_ce_trigger; -static char *mc_ue_trigger; +static const char *mc_ce_trigger = NULL; +static const char *mc_ue_trigger = NULL; void mc_event_trigger_setup(void) { - mc_ce_trigger = getenv("MC_CE_TRIGGER"); - if (!mc_ce_trigger || !strcmp(mc_ce_trigger, "") - || trigger_check(mc_ce_trigger) < 0) { - log(SYSLOG, LOG_ERR, "Cannot access mc_event ce trigger `%s`\n", - mc_ce_trigger); - } else - log(SYSLOG, LOG_INFO, "Setup mc_event ce trigger `%s`\n", - mc_ce_trigger); - - mc_ue_trigger = getenv("MC_UE_TRIGGER"); - if (!mc_ue_trigger || !strcmp(mc_ue_trigger, "") - || trigger_check(mc_ue_trigger) < 0) { - log(SYSLOG, LOG_ERR, "Cannot access mc_event ue trigger `%s`\n", - mc_ue_trigger); - } else - log(SYSLOG, LOG_INFO, "Setup mc_event ue trigger `%s`\n", - mc_ue_trigger); + const char *trigger; + + trigger = getenv("MC_CE_TRIGGER"); + if (trigger && strcmp(trigger, "")) { + if (trigger_check(trigger) < 0) { + log(ALL, LOG_ERR, + "Cannot access mc_event ce trigger `%s`\n", + trigger); + } else { + log(ALL, LOG_INFO, + "Setup mc_event ce trigger `%s`\n", + trigger); + mc_ce_trigger = trigger; + } + } + + trigger = getenv("MC_UE_TRIGGER"); + if (trigger && strcmp(trigger, "")) { + if (trigger_check(trigger) < 0) { + log(ALL, LOG_ERR, + "Cannot access mc_event ue trigger `%s`\n", + trigger); + } else { + log(ALL, LOG_INFO, + "Setup mc_event ue trigger `%s`\n", + trigger); + mc_ue_trigger = trigger; + } + } } static void run_mc_trigger(struct ras_mc_event *ev, const char *mc_trigger) @@ -60,7 +73,7 @@ static void run_mc_trigger(struct ras_mc_event *ev, const char *mc_trigger) int ei = 0; int i; - if (!mc_trigger || !strcmp(mc_trigger, "")) + if (!strcmp(mc_trigger, "")) return; if (asprintf(&env[ei++], "PATH=%s", getenv("PATH") ?: "/sbin:/usr/sbin:/bin:/usr/bin") < 0) @@ -269,10 +282,10 @@ int ras_mc_event_handler(struct trace_seq *s, ras_report_mc_event(ras, &ev); #endif - if (!strcmp(ev.error_type, "Corrected")) + if (mc_ce_trigger && !strcmp(ev.error_type, "Corrected")) run_mc_trigger(&ev, mc_ce_trigger); - if (!strcmp(ev.error_type, "Uncorrected")) + if (mc_ue_trigger && !strcmp(ev.error_type, "Uncorrected")) run_mc_trigger(&ev, mc_ue_trigger); return 0; diff --git a/trigger.c b/trigger.c index 95fb8ca..0d91e05 100644 --- a/trigger.c +++ b/trigger.c @@ -6,7 +6,7 @@ #include "ras-logger.h" #include "trigger.h" -void run_trigger(const char *trigger, char *argv[], char **env, const char* reporter) +void run_trigger(const char *trigger, char *argv[], char **env, const char *reporter) { pid_t child; char *path; @@ -39,7 +39,7 @@ void run_trigger(const char *trigger, char *argv[], char **env, const char* repo } } -int trigger_check(char *s) +int trigger_check(const char *s) { char *name; int rc; diff --git a/trigger.h b/trigger.h index 556a7f2..ccd1a9b 100644 --- a/trigger.h +++ b/trigger.h @@ -6,8 +6,7 @@ struct event_trigger { void (*setup)(void); }; -int trigger_check(char *s); +int trigger_check(const char *s); void run_trigger(const char *trigger, char *argv[], char **env, const char* reporter); - #endif