From 3fe1fe023a48b36d74932466811472f97b41b2e2 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Tue, 16 Aug 2022 18:52:10 +0200 Subject: [PATCH] Fix shared memory management on error --- src/lib/cache.c | 18 +++++++++--------- src/lib/config.c | 14 +++++++------- src/necronda-server.c | 5 +++++ 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/lib/cache.c b/src/lib/cache.c index 998f43b..4bf9ff9 100644 --- a/src/lib/cache.c +++ b/src/lib/cache.c @@ -45,14 +45,14 @@ int cache_process() { int shm_id = shmget(CACHE_SHM_KEY, CACHE_ENTRIES * sizeof(cache_entry), 0); if (shm_id < 0) { - fprintf(stderr, ERR_STR "Unable to create shared memory: %s" CLR_STR "\n", strerror(errno)); + fprintf(stderr, ERR_STR "Unable to create cache shared memory: %s" CLR_STR "\n", strerror(errno)); return -1; } shmdt(cache); void *shm_rw = shmat(shm_id, NULL, 0); if (shm_rw == (void *) -1) { - fprintf(stderr, ERR_STR "Unable to attach shared memory (rw): %s" CLR_STR "\n", strerror(errno)); + fprintf(stderr, ERR_STR "Unable to attach cache shared memory (rw): %s" CLR_STR "\n", strerror(errno)); return -2; } cache = shm_rw; @@ -226,20 +226,20 @@ int cache_init() { int shm_id = shmget(CACHE_SHM_KEY, CACHE_ENTRIES * sizeof(cache_entry), IPC_CREAT | IPC_EXCL | 0600); if (shm_id < 0) { - fprintf(stderr, ERR_STR "Unable to create shared memory: %s" CLR_STR "\n", strerror(errno)); + fprintf(stderr, ERR_STR "Unable to create cache shared memory: %s" CLR_STR "\n", strerror(errno)); return -2; } void *shm = shmat(shm_id, NULL, SHM_RDONLY); if (shm == (void *) -1) { - fprintf(stderr, ERR_STR "Unable to attach shared memory (ro): %s" CLR_STR "\n", strerror(errno)); + fprintf(stderr, ERR_STR "Unable to attach cache shared memory (ro): %s" CLR_STR "\n", strerror(errno)); return -3; } cache = shm; void *shm_rw = shmat(shm_id, NULL, 0); if (shm_rw == (void *) -1) { - fprintf(stderr, ERR_STR "Unable to attach shared memory (rw): %s" CLR_STR "\n", strerror(errno)); + fprintf(stderr, ERR_STR "Unable to attach cache shared memory (rw): %s" CLR_STR "\n", strerror(errno)); return -4; } cache = shm_rw; @@ -268,11 +268,11 @@ int cache_init() { int cache_unload() { int shm_id = shmget(CACHE_SHM_KEY, 0, 0); if (shm_id < 0) { - fprintf(stderr, ERR_STR "Unable to get shared memory id: %s" CLR_STR "\n", strerror(errno)); + fprintf(stderr, ERR_STR "Unable to get cache shared memory id: %s" CLR_STR "\n", strerror(errno)); shmdt(cache); return -1; } else if (shmctl(shm_id, IPC_RMID, NULL) < 0) { - fprintf(stderr, ERR_STR "Unable to configure shared memory: %s" CLR_STR "\n", strerror(errno)); + fprintf(stderr, ERR_STR "Unable to configure cache shared memory: %s" CLR_STR "\n", strerror(errno)); shmdt(cache); return -1; } @@ -285,7 +285,7 @@ int cache_update_entry(int entry_num, const char *filename, const char *webroot) int shm_id = shmget(CACHE_SHM_KEY, 0, 0); void *shm_rw = shmat(shm_id, NULL, 0); if (shm_rw == (void *) -1) { - print(ERR_STR "Unable to attach shared memory (rw): %s" CLR_STR, strerror(errno)); + print(ERR_STR "Unable to attach cache shared memory (rw): %s" CLR_STR, strerror(errno)); return -1; } cache = shm_rw; @@ -328,7 +328,7 @@ int cache_filename_comp_invalid(const char *filename) { int shm_id = shmget(CACHE_SHM_KEY, 0, 0); void *shm_rw = shmat(shm_id, NULL, 0); if (shm_rw == (void *) -1) { - print(ERR_STR "Unable to attach shared memory (rw): %s" CLR_STR, strerror(errno)); + print(ERR_STR "Unable to attach cache shared memory (rw): %s" CLR_STR, strerror(errno)); return -1; } cache = shm_rw; diff --git a/src/lib/config.c b/src/lib/config.c index 610e9b0..c2db22f 100644 --- a/src/lib/config.c +++ b/src/lib/config.c @@ -20,20 +20,20 @@ char geoip_dir[256], dns_server[256]; int config_init() { int shm_id = shmget(CONFIG_SHM_KEY, sizeof(t_config), IPC_CREAT | IPC_EXCL | 0640); if (shm_id < 0) { - fprintf(stderr, ERR_STR "Unable to create shared memory: %s" CLR_STR "\n", strerror(errno)); + fprintf(stderr, ERR_STR "Unable to create config shared memory: %s" CLR_STR "\n", strerror(errno)); return -1; } void *shm = shmat(shm_id, NULL, SHM_RDONLY); if (shm == (void *) -1) { - fprintf(stderr, ERR_STR "Unable to attach shared memory (ro): %s" CLR_STR "\n", strerror(errno)); + fprintf(stderr, ERR_STR "Unable to attach config shared memory (ro): %s" CLR_STR "\n", strerror(errno)); return -2; } config = shm; void *shm_rw = shmat(shm_id, NULL, 0); if (shm_rw == (void *) -1) { - fprintf(stderr, ERR_STR "Unable to attach shared memory (rw): %s" CLR_STR "\n", strerror(errno)); + fprintf(stderr, ERR_STR "Unable to attach config shared memory (rw): %s" CLR_STR "\n", strerror(errno)); return -3; } config = shm_rw; @@ -46,11 +46,11 @@ int config_init() { int config_unload() { int shm_id = shmget(CONFIG_SHM_KEY, 0, 0); if (shm_id < 0) { - fprintf(stderr, ERR_STR "Unable to get shared memory id: %s" CLR_STR "\n", strerror(errno)); + fprintf(stderr, ERR_STR "Unable to get config shared memory id: %s" CLR_STR "\n", strerror(errno)); shmdt(config); return -1; } else if (shmctl(shm_id, IPC_RMID, NULL) < 0) { - fprintf(stderr, ERR_STR "Unable to configure shared memory: %s" CLR_STR "\n", strerror(errno)); + fprintf(stderr, ERR_STR "Unable to configure config shared memory: %s" CLR_STR "\n", strerror(errno)); shmdt(config); return -1; } @@ -256,7 +256,7 @@ int config_load(const char *filename) { int shm_id = shmget(CONFIG_SHM_KEY, 0, 0); if (shm_id < 0) { - fprintf(stderr, ERR_STR "Unable to get shared memory id: %s" CLR_STR "\n", strerror(errno)); + fprintf(stderr, ERR_STR "Unable to get config shared memory id: %s" CLR_STR "\n", strerror(errno)); shmdt(config); return -3; } @@ -264,7 +264,7 @@ int config_load(const char *filename) { void *shm_rw = shmat(shm_id, NULL, 0); if (shm_rw == (void *) -1) { free(tmp_config); - fprintf(stderr, ERR_STR "Unable to attach shared memory (rw): %s" CLR_STR "\n", strerror(errno)); + fprintf(stderr, ERR_STR "Unable to attach config shared memory (rw): %s" CLR_STR "\n", strerror(errno)); return -4; } memcpy(shm_rw, tmp_config, sizeof(t_config)); diff --git a/src/necronda-server.c b/src/necronda-server.c index a8d5639..3376ead 100644 --- a/src/necronda-server.c +++ b/src/necronda-server.c @@ -313,11 +313,13 @@ int main(int argc, const char *argv[]) { if (SSL_CTX_use_certificate_chain_file(ctx, conf->full_chain) != 1) { fprintf(stderr, ERR_STR "Unable to load certificate chain file: %s: %s" CLR_STR "\n", ERR_reason_error_string(ERR_get_error()), conf->full_chain); config_unload(); + cache_unload(); return 1; } if (SSL_CTX_use_PrivateKey_file(ctx, conf->priv_key, SSL_FILETYPE_PEM) != 1) { fprintf(stderr, ERR_STR "Unable to load private key file: %s: %s" CLR_STR "\n", ERR_reason_error_string(ERR_get_error()), conf->priv_key); config_unload(); + cache_unload(); return 1; } } @@ -331,6 +333,7 @@ int main(int argc, const char *argv[]) { if (listen(sockets[i], LISTEN_BACKLOG) < 0) { fprintf(stderr, ERR_STR "Unable to listen on socket %i: %s" CLR_STR "\n", i, strerror(errno)); config_unload(); + cache_unload(); return 1; } } @@ -406,5 +409,7 @@ int main(int argc, const char *argv[]) { } } + config_unload(); + cache_unload(); return 0; }