diff options
author | Wolfgang Hommel <wolfgang.hommel@unibw.de> | 2019-11-20 08:43:24 +0100 |
---|---|---|
committer | Wolfgang Hommel <wolfgang.hommel@unibw.de> | 2019-11-20 08:43:24 +0100 |
commit | 22f8c3dd36d0cd905e2ad60a00a554941419a51b (patch) | |
tree | 6a940055667622eb986bcfc6aa2d232a2bec0d34 | |
parent | a0fe6b56b0ec64750866b47e5064501e42cf5008 (diff) | |
download | libfaketime-22f8c3dd36d0cd905e2ad60a00a554941419a51b.tar.gz |
Work around race conditions when semaphore gets deleted by parent process (#217)
-rw-r--r-- | src/libfaketime.c | 27 |
1 files 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))) |