From 8045f7f49330e4588c34f806d29da296248a1bdc Mon Sep 17 00:00:00 2001 From: Shaun Ruffell Date: Mon, 7 Jul 2014 15:12:57 -0500 Subject: [PATCH] dahdi_cfg: Unlink semaphore on early exit. If dahdi_cfg is terminated while holding the named semaphore, it is possible to leave it behind and all subsequenct invocations of dahdi_cfg will block waiting for it. Signed-off-by: Shaun Ruffell Signed-off-by: Russ Meyerriecks --- dahdi_cfg.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/dahdi_cfg.c b/dahdi_cfg.c index 620383b..90bd466 100644 --- a/dahdi_cfg.c +++ b/dahdi_cfg.c @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -1540,15 +1541,27 @@ static int span_restrict(char *str) return 1; } +static const char *SEM_NAME = "dahdi_cfg"; +static sem_t *lock = SEM_FAILED; + +static void signal_handler(int signal) +{ + if (SEM_FAILED != lock) { + sem_unlink(SEM_NAME); + } + /* The default handler should have been restored before this handler was + * called, so we can let the "normal" processing finish the cleanup. */ + raise(signal); +} + int main(int argc, char *argv[]) { int c; char *buf; char *key, *value; int x,found; - sem_t *lock = SEM_FAILED; - const char *SEM_NAME = "dahdi_cfg"; int exit_code = 0; + struct sigaction act; while((c = getopt(argc, argv, "fthc:vsd::C:S:")) != -1) { switch(c) { @@ -1670,6 +1683,19 @@ finish: fflush(stdout); } + sigemptyset(&act.sa_mask); + act.sa_handler = signal_handler; + act.sa_flags = SA_RESETHAND; + + if (sigaction(SIGTERM, &act, NULL) == -1) { + perror("Failed to install SIGTERM handler."); + exit(1); + } + if (sigaction(SIGINT, &act, NULL) == -1) { + perror("Failed to install SIGINT handler."); + exit(1); + } + lock = sem_open(SEM_NAME, O_CREAT, O_RDWR, 1); if (SEM_FAILED == lock) { perror("Unable to create 'dahdi_cfg' mutex");