Blame SOURCES/0004-dhparams-don-t-fail-if-default-file-can-t-be-created.patch

19eb29
From 282f819bc39c9557ee34f73c6f6623182f680792 Mon Sep 17 00:00:00 2001
19eb29
From: Stephen Gallagher <sgallagh@redhat.com>
19eb29
Date: Wed, 16 Nov 2022 15:27:58 -0500
19eb29
Subject: [PATCH] dhparams: don't fail if default file can't be created
19eb29
19eb29
Resolves: rhbz#2143206
19eb29
19eb29
Signed-off-by: Stephen Gallagher <sgallagh@redhat.com>
19eb29
---
19eb29
 src/arguments.c |  1 -
19eb29
 src/io_utils.c  | 12 +++++++++++
19eb29
 src/sscg.c      | 55 +++++++++++++++++++++++++++++++++----------------
19eb29
 3 files changed, 49 insertions(+), 19 deletions(-)
19eb29
19eb29
diff --git a/src/arguments.c b/src/arguments.c
19eb29
index 7b9da14a732875b0f33a12e22a97d51a78216839..770d834aacc05d6d92cc0c855852eadb88f8c9bc 100644
19eb29
--- a/src/arguments.c
19eb29
+++ b/src/arguments.c
19eb29
@@ -69,7 +69,6 @@ set_default_options (struct sscg_options *opts)
19eb29
 
19eb29
   opts->lifetime = 398;
19eb29
 
19eb29
-  opts->dhparams_file = talloc_strdup (opts, "dhparams.pem");
19eb29
   opts->dhparams_group = talloc_strdup (opts, "ffdhe4096");
19eb29
   opts->dhparams_generator = 2;
19eb29
 
19eb29
diff --git a/src/io_utils.c b/src/io_utils.c
19eb29
index 1b8bc41c3849acbe4657ae14dfe55e3010957129..5d34327bdbe450add5326ac20c337c9399b471dc 100644
19eb29
--- a/src/io_utils.c
19eb29
+++ b/src/io_utils.c
19eb29
@@ -544,6 +544,18 @@ sscg_io_utils_open_output_files (struct sscg_stream **streams, bool overwrite)
19eb29
     {
19eb29
       SSCG_LOG (SSCG_DEBUG, "Opening %s\n", stream->path);
19eb29
       stream->bio = BIO_new_file (stream->path, create_mode);
19eb29
+      if (!stream->bio)
19eb29
+        {
19eb29
+          fprintf (stderr,
19eb29
+                   "Could not write to %s. Check directory permissions.\n",
19eb29
+                   stream->path);
19eb29
+
19eb29
+          /* The dhparams file is special, it will be handled later */
19eb29
+          if (i != SSCG_FILE_TYPE_DHPARAMS)
19eb29
+            {
19eb29
+              continue;
19eb29
+            }
19eb29
+        }
19eb29
       CHECK_BIO (stream->bio, stream->path);
19eb29
     }
19eb29
 
19eb29
diff --git a/src/sscg.c b/src/sscg.c
19eb29
index 1bf8019c2dda136abe56acd101dfe8ad0b3d725d..dcff4cd2b8dfd2e11c8612d36ecc94b175e9dc26 100644
19eb29
--- a/src/sscg.c
19eb29
+++ b/src/sscg.c
19eb29
@@ -93,6 +93,7 @@ main (int argc, const char **argv)
19eb29
   int ret, sret;
19eb29
   struct sscg_options *options;
19eb29
   bool build_client_cert = false;
19eb29
+  char *dhparams_file = NULL;
19eb29
 
19eb29
   struct sscg_x509_cert *cacert;
19eb29
   struct sscg_evp_pkey *cakey;
19eb29
@@ -182,9 +183,19 @@ main (int argc, const char **argv)
19eb29
                                        options->crl_mode);
19eb29
   CHECK_OK (ret);
19eb29
 
19eb29
+  if (options->dhparams_file)
19eb29
+    {
19eb29
+      dhparams_file = talloc_strdup (main_ctx, options->dhparams_file);
19eb29
+    }
19eb29
+  else
19eb29
+    {
19eb29
+      dhparams_file = talloc_strdup (main_ctx, "./dhparams.pem");
19eb29
+    }
19eb29
+  CHECK_MEM (dhparams_file);
19eb29
+
19eb29
   ret = sscg_io_utils_add_output_file (options->streams,
19eb29
                                        SSCG_FILE_TYPE_DHPARAMS,
19eb29
-                                       options->dhparams_file,
19eb29
+                                       dhparams_file,
19eb29
                                        options->dhparams_mode);
19eb29
   CHECK_OK (ret);
19eb29
 
19eb29
@@ -281,28 +292,36 @@ main (int argc, const char **argv)
19eb29
 
19eb29
 
19eb29
   /* Create DH parameters file */
19eb29
-  bp = GET_BIO (SSCG_FILE_TYPE_DHPARAMS);
19eb29
-  if (options->dhparams_prime_len > 0)
19eb29
+  if ((bp = GET_BIO (SSCG_FILE_TYPE_DHPARAMS)))
19eb29
     {
19eb29
-      ret = create_dhparams (options->verbosity,
19eb29
-                             options->dhparams_prime_len,
19eb29
-                             options->dhparams_generator,
19eb29
-                             &dhparams);
19eb29
-      CHECK_OK (ret);
19eb29
+      if (options->dhparams_prime_len > 0)
19eb29
+        {
19eb29
+          ret = create_dhparams (options->verbosity,
19eb29
+                                 options->dhparams_prime_len,
19eb29
+                                 options->dhparams_generator,
19eb29
+                                 &dhparams);
19eb29
+          CHECK_OK (ret);
19eb29
+        }
19eb29
+      else
19eb29
+        {
19eb29
+          ret = get_params_by_named_group (options->dhparams_group, &dhparams);
19eb29
+          CHECK_OK (ret);
19eb29
+        }
19eb29
+
19eb29
+      /* Export the DH parameters to the file */
19eb29
+      sret = PEM_write_bio_Parameters (bp, dhparams);
19eb29
+      CHECK_SSL (sret, PEM_write_bio_Parameters ());
19eb29
+      ANNOUNCE_WRITE (SSCG_FILE_TYPE_DHPARAMS);
19eb29
+      EVP_PKEY_free (dhparams);
19eb29
     }
19eb29
-  else
19eb29
+  else if (options->dhparams_file)
19eb29
     {
19eb29
-      ret = get_params_by_named_group (options->dhparams_group, &dhparams);
19eb29
-      CHECK_OK (ret);
19eb29
+      /* A filename was explicitly passed, but it couldn't be created */
19eb29
+      ret = EPERM;
19eb29
+      fprintf (stderr, "Could not write to %s: ", options->dhparams_file);
19eb29
+      goto done;
19eb29
     }
19eb29
 
19eb29
-  /* Export the DH parameters to the file */
19eb29
-  sret = PEM_write_bio_Parameters (bp, dhparams);
19eb29
-  CHECK_SSL (sret, PEM_write_bio_Parameters ());
19eb29
-  ANNOUNCE_WRITE (SSCG_FILE_TYPE_DHPARAMS);
19eb29
-  EVP_PKEY_free (dhparams);
19eb29
-
19eb29
-
19eb29
   /* Set the final file permissions */
19eb29
   sscg_io_utils_finalize_output_files (options->streams);
19eb29
 
19eb29
-- 
19eb29
2.38.1
19eb29