[PATCH v3] irmd, lib: Improve libgcrypt init

  • From: Dimitri Staessens <dimitri@ouroboros.rocks>
  • To: ouroboros@xxxxxxxxxxxxx
  • Date: Fri, 26 Jul 2019 12:07:21 +0200

The proper initialization of libgrypt requires a call to
gcry_check_version. The library initialization should first run a
check if the application (or some other library) hasn't already
initialized libgcrypt before attempting to initialize libgcrypt.

Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks>
---
 src/irmd/main.c | 17 +++++++++++++----
 src/lib/dev.c   |  9 +++++++--
 2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/src/irmd/main.c b/src/irmd/main.c
index 5875d7d..f3a3ff8 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -2206,12 +2206,18 @@ static int irm_init(void)
 #endif
 
 #ifdef HAVE_LIBGCRYPT
-        if (gcry_control(GCRYCTL_ANY_INITIALIZATION_P))
-                goto fail_gcry_control;
+        if (!gcry_check_version(GCRYPT_VERSION)) {
+                log_err("Error checking libgcrypt version.");
+                goto fail_gcry_version;
+        }
+
+        if (!gcry_control(GCRYCTL_ANY_INITIALIZATION_P)) {
+                log_err("Libgcrypt was not initialized.");
+                goto fail_gcry_version;
+        }
 
         gcry_control(GCRYCTL_INITIALIZATION_FINISHED);
 #endif
-
         irmd_set_state(IRMD_RUNNING);
 
         log_info("Ouroboros IPC Resource Manager daemon started...");
@@ -2219,7 +2225,10 @@ static int irm_init(void)
         return 0;
 
 #ifdef HAVE_LIBGCRYPT
- fail_gcry_control:
+ fail_gcry_version:
+#ifdef HAVE_FUSE
+        rmdir(FUSE_PREFIX);
+#endif
         shm_rdrbuff_destroy(irmd.rdrb);
 #endif
  fail_rdrbuff:
diff --git a/src/lib/dev.c b/src/lib/dev.c
index ee7839c..229a147 100644
--- a/src/lib/dev.c
+++ b/src/lib/dev.c
@@ -344,8 +344,13 @@ static void init(int     argc,
 
         ai.pid = getpid();
 #ifdef HAVE_LIBGCRYPT
-        if (!gcry_check_version(GCRYPT_VERSION))
-                goto fail_fds;
+        if (!gcry_control (GCRYCTL_INITIALIZATION_FINISHED_P)) {
+                if (!gcry_check_version(GCRYPT_VERSION))
+                        goto fail_fds;
+                /* Needs to be enabled when we add encryption. */
+                gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
+                gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
+        }
 #endif
         ai.fds = bmp_create(PROG_MAX_FLOWS - PROG_RES_FDS, PROG_RES_FDS);
         if (ai.fds == NULL)
-- 
2.22.0


Other related posts: