From 22f8c3dd36d0cd905e2ad60a00a554941419a51b Mon Sep 17 00:00:00 2001 From: Wolfgang Hommel Date: Wed, 20 Nov 2019 08:43:24 +0100 Subject: [PATCH] Work around race conditions when semaphore gets deleted by parent process (#217) --- src/libfaketime.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/libfaketime.c b/src/libfaketime.c index 4614e28..745384d 100644 --- a/src/libfaketime.c +++ b/src/libfaketime.c @@ -413,6 +413,7 @@ static void ft_shm_init (void) int ticks_shm_fd; char sem_name[256], shm_name[256], *ft_shared_env = getenv("FAKETIME_SHARED"); sem_t *shared_semR = NULL; + static int nt=1; /* create semaphore and shared memory locally unless it has been passed along */ if (ft_shared_env == NULL) @@ -451,10 +452,28 @@ static void ft_shm_init (void) if (SEM_FAILED == (shared_sem = sem_open(sem_name, 0))) { - perror("libfaketime: In ft_shm_init(), sem_open failed"); - fprintf(stderr, "libfaketime: sem_name was %s, created locally: %s\n", sem_name, shmCreator ? "true":"false"); - fprintf(stderr, "libfaketime: parsed from env: %s\n", ft_shared_env); - exit(1); + if (shmCreator) + { + perror("libfaketime: In ft_shm_init(), sem_open failed"); + fprintf(stderr, "libfaketime: sem_name was %s, created locally: %s\n", sem_name, shmCreator ? "true":"false"); + fprintf(stderr, "libfaketime: parsed from env: %s\n", ft_shared_env); + exit(1); + } + else + { + nt++; + if (nt > 3) + { + perror("libfaketime: In ft_shm_init(), sem_open failed and recreation attempts failed"); + fprintf(stderr, "libfaketime: sem_name was %s, created locally: %s\n", sem_name, shmCreator ? "true":"false"); + exit(1); + } + else{ + ft_shm_init(); + return; + } + + } } if (-1 == (ticks_shm_fd = shm_open(shm_name, O_CREAT|O_RDWR, S_IWUSR|S_IRUSR)))