From cc4e13cfdd9e267ded2ff5079598f0c686bee828 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Mon, 15 Jul 2024 13:40:37 +0200 Subject: [PATCH] trigger: parse only once TRIGGER_DIR env variable Instead of parsing TRIGGER_DIR every time a new event happens, store the trigger full path, simplifying the logic and avoiding memory leaks. Signed-off-by: Mauro Carvalho Chehab --- ras-mc-handler.c | 13 ++++++------- trigger.c | 23 +++++++++-------------- trigger.h | 2 +- 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/ras-mc-handler.c b/ras-mc-handler.c index 26ff0be..7bc6c91 100644 --- a/ras-mc-handler.c +++ b/ras-mc-handler.c @@ -40,7 +40,9 @@ void mc_event_trigger_setup(void) trigger = getenv("MC_CE_TRIGGER"); if (trigger && strcmp(trigger, "")) { - if (trigger_check(trigger) < 0) { + mc_ce_trigger = trigger_check(trigger); + + if (!mc_ce_trigger) { log(ALL, LOG_ERR, "Cannot access mc_event ce trigger `%s`\n", trigger); @@ -48,13 +50,14 @@ void mc_event_trigger_setup(void) 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) { + mc_ue_trigger = trigger_check(trigger); + + if (!mc_ue_trigger) { log(ALL, LOG_ERR, "Cannot access mc_event ue trigger `%s`\n", trigger); @@ -62,7 +65,6 @@ void mc_event_trigger_setup(void) log(ALL, LOG_INFO, "Setup mc_event ue trigger `%s`\n", trigger); - mc_ue_trigger = trigger; } } } @@ -73,9 +75,6 @@ static void run_mc_trigger(struct ras_mc_event *ev, const char *mc_trigger) int ei = 0; int i; - if (!strcmp(mc_trigger, "")) - return; - if (asprintf(&env[ei++], "PATH=%s", getenv("PATH") ?: "/sbin:/usr/sbin:/bin:/usr/bin") < 0) goto free; if (asprintf(&env[ei++], "TIMESTAMP=%s", ev->timestamp) < 0) diff --git a/trigger.c b/trigger.c index 0d91e05..0ee1a5e 100644 --- a/trigger.c +++ b/trigger.c @@ -9,15 +9,10 @@ void run_trigger(const char *trigger, char *argv[], char **env, const char *reporter) { pid_t child; - char *path; int status; - char *trigger_dir = getenv("TRIGGER_DIR"); log(SYSLOG, LOG_INFO, "Running trigger `%s' (reporter: %s)\n", trigger, reporter); - if (asprintf(&path, "%s/%s", trigger_dir, trigger) < 0) - return; - child = fork(); if (child < 0) { log(SYSLOG, LOG_ERR, "Cannot create process for trigger"); @@ -25,7 +20,7 @@ void run_trigger(const char *trigger, char *argv[], char **env, const char *repo } if (child == 0) { - execve(path, argv, env); + execve(trigger, argv, env); _exit(127); } else { waitpid(child, &status, 0); @@ -39,7 +34,7 @@ void run_trigger(const char *trigger, char *argv[], char **env, const char *repo } } -int trigger_check(const char *s) +const char *trigger_check(const char *s) { char *name; int rc; @@ -47,14 +42,14 @@ int trigger_check(const char *s) if (trigger_dir) { if (asprintf(&name, "%s/%s", trigger_dir, s) < 0) - return -1; - } else - name = s; + return NULL; + s = name; + } - rc = access(name, R_OK|X_OK); + rc = access(s, R_OK|X_OK); - if (trigger_dir) - free(name); + if (!rc) + return(s); - return rc; + return NULL; } diff --git a/trigger.h b/trigger.h index ccd1a9b..aea29b5 100644 --- a/trigger.h +++ b/trigger.h @@ -6,7 +6,7 @@ struct event_trigger { void (*setup)(void); }; -int trigger_check(const char *s); +const char *trigger_check(const char *s); void run_trigger(const char *trigger, char *argv[], char **env, const char* reporter); #endif -- 2.49.0