Move errno-protection into string_open_failed()
authorJeremy Harris <jgh146exb@wizmail.org>
Sun, 5 Jul 2020 12:15:00 +0000 (13:15 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Sun, 5 Jul 2020 12:15:00 +0000 (13:15 +0100)
18 files changed:
src/src/daemon.c
src/src/dbfn.c
src/src/exim.c
src/src/expand.c
src/src/filter.c
src/src/functions.h
src/src/lookups/cdb.c
src/src/lookups/dbmdb.c
src/src/lookups/dsearch.c
src/src/lookups/json.c
src/src/lookups/lsearch.c
src/src/match.c
src/src/parse.c
src/src/rda.c
src/src/readconf.c
src/src/spool_mbox.c
src/src/string.c
src/src/tls-gnu.c

index 09cb1a7f12b9c8262c1def2b0eb9b78bde0d5232..c376f27c766b6853ff4e1e17a533e45dc45f376e 100644 (file)
@@ -950,8 +950,7 @@ if ((f = Ufopen(pid_file_path, "rb")))
   }
 else
   DEBUG(D_any)
   }
 else
   DEBUG(D_any)
-    debug_printf("%s\n", string_open_failed(errno, "pid file %s",
-      pid_file_path));
+    debug_printf("%s\n", string_open_failed("pid file %s", pid_file_path));
 exim_exit(EXIT_SUCCESS);
 }
 
 exim_exit(EXIT_SUCCESS);
 }
 
@@ -1822,8 +1821,7 @@ if (f.running_in_test_harness || write_pid)
     }
   else
     DEBUG(D_any)
     }
   else
     DEBUG(D_any)
-      debug_printf("%s\n", string_open_failed(errno, "pid file %s",
-        pid_file_path));
+      debug_printf("%s\n", string_open_failed("pid file %s", pid_file_path));
   }
 
 /* Set up the handler for SIGHUP, which causes a restart of the daemon. */
   }
 
 /* Set up the handler for SIGHUP, which causes a restart of the daemon. */
index aa083200a5784d7465f914459033c383518e1562..a37271f36f00a5f9f1c0e99e4f9d94e9bf17e385 100644 (file)
@@ -123,7 +123,7 @@ if ((dbblock->lockfd = Uopen(filename, O_RDWR, EXIMDB_LOCKFILE_MODE)) < 0)
 if (dbblock->lockfd < 0)
   {
   log_write(0, LOG_MAIN, "%s",
 if (dbblock->lockfd < 0)
   {
   log_write(0, LOG_MAIN, "%s",
-    string_open_failed(errno, "database lock file %s", filename));
+    string_open_failed("database lock file %s", filename));
   errno = 0;      /* Indicates locking failure */
   DEBUG(D_hints_lookup) acl_level--;
   return NULL;
   errno = 0;      /* Indicates locking failure */
   DEBUG(D_hints_lookup) acl_level--;
   return NULL;
@@ -228,12 +228,13 @@ exist. */
 
 if (!dbblock->dbptr)
   {
 
 if (!dbblock->dbptr)
   {
+  errno = save_errno;
   if (lof && save_errno != ENOENT)
   if (lof && save_errno != ENOENT)
-    log_write(0, LOG_MAIN, "%s", string_open_failed(save_errno, "DB file %s",
+    log_write(0, LOG_MAIN, "%s", string_open_failed("DB file %s",
         filename));
   else
     DEBUG(D_hints_lookup)
         filename));
   else
     DEBUG(D_hints_lookup)
-      debug_printf_indent("%s\n", CS string_open_failed(save_errno, "DB file %s",
+      debug_printf_indent("%s\n", CS string_open_failed("DB file %s",
           filename));
   (void)close(dbblock->lockfd);
   errno = save_errno;
           filename));
   (void)close(dbblock->lockfd);
   errno = save_errno;
index dd3a17f14f5199e3aa964428ff494759cbd9b0c6..3edbc29d3044957f049136c515d0ff69f0a69271 100644 (file)
@@ -564,7 +564,7 @@ for (int i = 0; i <= 2; i++)
     {
     if (devnull < 0) devnull = open("/dev/null", O_RDWR);
     if (devnull < 0) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s",
     {
     if (devnull < 0) devnull = open("/dev/null", O_RDWR);
     if (devnull < 0) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s",
-      string_open_failed(errno, "/dev/null", NULL));
+      string_open_failed("/dev/null", NULL));
     if (devnull != i) (void)dup2(devnull, i);
     }
   }
     if (devnull != i) (void)dup2(devnull, i);
     }
   }
index 291db426abb19e0517d1c5e89b53f0701f5158ec..41860d93bebf6f000bf0a4da6d805afefd17dc0f 100644 (file)
@@ -5261,7 +5261,7 @@ while (*s)
 
       if (!(f = Ufopen(sub_arg[0], "rb")))
         {
 
       if (!(f = Ufopen(sub_arg[0], "rb")))
         {
-        expand_string_message = string_open_failed(errno, "%s", sub_arg[0]);
+        expand_string_message = string_open_failed("%s", sub_arg[0]);
         goto EXPAND_FAILED;
         }
 
         goto EXPAND_FAILED;
         }
 
index 402ad6ae53f52065f4e7df29b0f164ce2f67cc26..59c08f882ea224bb8d125fc30bbfc7860c3c254b 100644 (file)
@@ -1952,7 +1952,7 @@ while (commands)
          (long int)geteuid());
        if (log_fd < 0)
          {
          (long int)geteuid());
        if (log_fd < 0)
          {
-         if (log_filename == NULL)
+         if (!log_filename)
            {
            *error_pointer = US"attempt to obey \"logwrite\" command "
              "without a previous \"logfile\"";
            {
            *error_pointer = US"attempt to obey \"logwrite\" command "
              "without a previous \"logfile\"";
@@ -1961,7 +1961,7 @@ while (commands)
          log_fd = Uopen(log_filename, O_CREAT|O_APPEND|O_WRONLY, log_mode);
          if (log_fd < 0)
            {
          log_fd = Uopen(log_filename, O_CREAT|O_APPEND|O_WRONLY, log_mode);
          if (log_fd < 0)
            {
-           *error_pointer = string_open_failed(errno, "filter log file \"%s\"",
+           *error_pointer = string_open_failed("filter log file \"%s\"",
              log_filename);
            return FF_ERROR;
            }
              log_filename);
            return FF_ERROR;
            }
@@ -1975,9 +1975,8 @@ while (commands)
          }
        }
       else
          }
        }
       else
-       {
-       DEBUG(D_filter) debug_printf_indent("skipping logwrite (verifying or testing)\n");
-       }
+       DEBUG(D_filter)
+         debug_printf_indent("skipping logwrite (verifying or testing)\n");
       break;
 
       /* Header addition and removal is available only in the system filter. The
       break;
 
       /* Header addition and removal is available only in the system filter. The
index 1dc64cea0684ca72fe570b38ec37de0791d013d1..69bdaa5ed2a60e51b71bf5c7d0cf6758b1182e8f 100644 (file)
@@ -554,10 +554,10 @@ extern BOOL    string_format_trc(uschar *, int, const uschar *, unsigned,
 extern gstring *string_vformat_trc(gstring *, const uschar *, unsigned,
                        unsigned, unsigned, const char *, va_list);
 
 extern gstring *string_vformat_trc(gstring *, const uschar *, unsigned,
                        unsigned, unsigned, const char *, va_list);
 
-#define string_open_failed(eno, fmt, ...) \
-       string_open_failed_trc(eno, US __FUNCTION__, __LINE__, fmt, __VA_ARGS__)
-extern uschar *string_open_failed_trc(int, const uschar *, unsigned,
-                       const char *, ...) PRINTF_FUNCTION(4,5);
+#define string_open_failed(fmt, ...) \
+       string_open_failed_trc(US __FUNCTION__, __LINE__, fmt, __VA_ARGS__)
+extern uschar *string_open_failed_trc(const uschar *, unsigned,
+                       const char *, ...) PRINTF_FUNCTION(3,4);
 
 #define string_nextinlist(lp, sp, b, l) \
        string_nextinlist_trc((lp), (sp), (b), (l), US __FUNCTION__, __LINE__)
 
 #define string_nextinlist(lp, sp, b, l) \
        string_nextinlist_trc((lp), (sp), (b), (l), US __FUNCTION__, __LINE__)
index e0faa905d138a11a03a47c35f927fee2ab38199f..c0ac2cbe45e360c902b4745386b8c7e305decb99 100644 (file)
@@ -157,19 +157,14 @@ void * mapbuf;
 
 if ((fileno = Uopen(filename, O_RDONLY, 0)) < 0)
   {
 
 if ((fileno = Uopen(filename, O_RDONLY, 0)) < 0)
   {
-  int save_errno = errno;
-  *errmsg = string_open_failed(errno, "%s for cdb lookup", filename);
-  errno = save_errno;
+  *errmsg = string_open_failed("%s for cdb lookup", filename);
   return NULL;
   }
 
 if (fstat(fileno, &statbuf) != 0)
   {
   return NULL;
   }
 
 if (fstat(fileno, &statbuf) != 0)
   {
-  int save_errno = errno;
-  *errmsg = string_open_failed(errno,
-                             "fstat(%s) failed - cannot do cdb lookup",
+  *errmsg = string_open_failed("fstat(%s) failed - cannot do cdb lookup",
                              filename);
                              filename);
-  errno = save_errno;
   return NULL;
   }
 
   return NULL;
   }
 
@@ -178,11 +173,7 @@ CDB_HASH_TABLE bytes long */
 
 if (statbuf.st_size < CDB_HASH_TABLE)
   {
 
 if (statbuf.st_size < CDB_HASH_TABLE)
   {
-  int save_errno = errno;
-  *errmsg = string_open_failed(errno,
-                             "%s too short for cdb lookup",
-                             filename);
-  errno = save_errno;
+  *errmsg = string_open_failed("%s too short for cdb lookup", filename);
   return NULL;
   }
 
   return NULL;
   }
 
@@ -231,8 +222,7 @@ if (cdb_bread(fileno, cdbp->cdb_offsets, CDB_HASH_TABLE) == -1)
   /* read of hash table failed, oh dear, oh.....  time to give up I think....
   call the close routine (deallocs the memory), and return NULL */
 
   /* read of hash table failed, oh dear, oh.....  time to give up I think....
   call the close routine (deallocs the memory), and return NULL */
 
-  *errmsg = string_open_failed(errno,
-                             "cannot read header from %s for cdb lookup",
+  *errmsg = string_open_failed("cannot read header from %s for cdb lookup",
                              filename);
   cdb_close(cdbp);
   return NULL;
                              filename);
   cdb_close(cdbp);
   return NULL;
index 0cec7327310c835e2151117e1c209811f74cd456..f5614fdacb7ddfac67b3edfed9e583803bf6cb1c 100644 (file)
@@ -26,11 +26,7 @@ EXIM_DB *yield = NULL;
 if ((s = Ustrrchr(dirname, '/'))) *s = '\0';
 EXIM_DBOPEN(filename, dirname, O_RDONLY, 0, &yield);
 if (!yield)
 if ((s = Ustrrchr(dirname, '/'))) *s = '\0';
 EXIM_DBOPEN(filename, dirname, O_RDONLY, 0, &yield);
 if (!yield)
-  {
-  int save_errno = errno;
-  *errmsg = string_open_failed(errno, "%s as a %s file", filename, EXIM_DBTYPE);
-  errno = save_errno;
-  }
+  *errmsg = string_open_failed("%s as a %s file", filename, EXIM_DBTYPE);
 return yield;
 }
 
 return yield;
 }
 
index 76f52774bc93f835c16c388e22e0ebdee93e941b..a6b331edb6401e2932caf3d6d3543d3e7e2f4add 100644 (file)
@@ -31,9 +31,7 @@ dsearch_open(const uschar * dirname, uschar ** errmsg)
 DIR * dp = exim_opendir(dirname);
 if (!dp)
   {
 DIR * dp = exim_opendir(dirname);
 if (!dp)
   {
-  int save_errno = errno;
-  *errmsg = string_open_failed(errno, "%s for directory search", dirname);
-  errno = save_errno;
+  *errmsg = string_open_failed("%s for directory search", dirname);
   return NULL;
   }
 closedir(dp);
   return NULL;
   }
 closedir(dp);
index 1a2ca0449e75c55180416abc7c6562e9f9db73da..9b1fe78ed3b4e9d17e20ee8863d74563ac096302 100644 (file)
@@ -47,12 +47,7 @@ FILE * f;
 json_set_alloc_funcs(json_malloc, json_free);
 
 if (!(f = Ufopen(filename, "rb")))
 json_set_alloc_funcs(json_malloc, json_free);
 
 if (!(f = Ufopen(filename, "rb")))
-  {
-  int save_errno = errno;
-  *errmsg = string_open_failed(errno, "%s for json search", filename);
-  errno = save_errno;
-  return NULL;
-  }
+  *errmsg = string_open_failed("%s for json search", filename);
 return f;
 }
 
 return f;
 }
 
index b78e858c34e0849c9b620a522ac84c631d1d9c2a..9df7a167f11bb9c130231caa1ae249259f80888c 100644 (file)
@@ -29,14 +29,9 @@ enum {
 static void *
 lsearch_open(const uschar * filename, uschar ** errmsg)
 {
 static void *
 lsearch_open(const uschar * filename, uschar ** errmsg)
 {
-FILE *f = Ufopen(filename, "rb");
-if (f == NULL)
-  {
-  int save_errno = errno;
-  *errmsg = string_open_failed(errno, "%s for linear search", filename);
-  errno = save_errno;
-  return NULL;
-  }
+FILE * f = Ufopen(filename, "rb");
+if (!f)
+  *errmsg = string_open_failed("%s for linear search", filename);
 return f;
 }
 
 return f;
 }
 
index 18de9779641a11138e42c72e3014ff3d3b516535..6a331419422b8a06134206e7c46d4f3d6b4af35a 100644 (file)
@@ -786,7 +786,7 @@ while ((sss = string_nextinlist(&list, &sep, NULL, 0)))
       if (listname[0] == 0)
         listname = string_sprintf("\"%s\"", *listptr);
       log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s",
       if (listname[0] == 0)
         listname = string_sprintf("\"%s\"", *listptr);
       log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s",
-        string_open_failed(errno, "%s when checking %s", sss, listname));
+        string_open_failed("%s when checking %s", sss, listname));
       }
 
     /* Trailing comments are introduced by #, but in an address list or local
       }
 
     /* Trailing comments are introduced by #, but in an address list or local
index e3b471f1a6e7a017171e00f4668ebc1c9a1e13d6..0ce36a345d05c95dfcec08e2a005c6c763940af7 100644 (file)
@@ -1525,7 +1525,7 @@ for (;;)
 
     if (!f)
       {
 
     if (!f)
       {
-      *error = string_open_failed(errno, "included file %s", filename);
+      *error = string_open_failed("included file %s", filename);
       return FF_INCLUDEFAIL;
       }
 
       return FF_INCLUDEFAIL;
       }
 
index aed8abc246b54b5e1a764f0e13171c827f958542..5615b64d5b893edb93f0e0c5686b31d0e1dbba58 100644 (file)
@@ -222,7 +222,7 @@ if (!(fwd = Ufopen(filename, "rb"))) switch(errno)
 
 DEFAULT_ERROR:
   default:
 
 DEFAULT_ERROR:
   default:
-    *error = string_open_failed(errno, "%s", filename);
+    *error = string_open_failed("%s", filename);
     *yield = FF_ERROR;
     return NULL;
   }
     *yield = FF_ERROR;
     return NULL;
   }
index a8f13350a8567a179abcb4778dd8f4cec1abac5d..e3c9ed72d44ed61d9bd372d4cd660d084719be65 100644 (file)
@@ -3214,12 +3214,12 @@ if (config_file)
   }
 else
   {
   }
 else
   {
-  if (filename == NULL)
+  if (!filename)
     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "non-existent configuration file(s): "
       "%s", config_main_filelist);
   else
     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "non-existent configuration file(s): "
       "%s", config_main_filelist);
   else
-    log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s", string_open_failed(errno,
-      "configuration file %s", filename));
+    log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s",
+      string_open_failed("configuration file %s", filename));
   }
 
 /* Now, once we found and opened our configuration file, we change the directory
   }
 
 /* Now, once we found and opened our configuration file, we change the directory
index 9f1efbf59f41353fc6a1d0ef9775916886377eb8..cf7909fbe2b628afe0a3be75c9ccd5bb67d60bea 100644 (file)
@@ -53,8 +53,8 @@ if (!spool_mbox_ok)
   temp_string = string_sprintf("scan/%s", message_id);
   if (!directory_make(spool_directory, temp_string, 0750, FALSE))
     {
   temp_string = string_sprintf("scan/%s", message_id);
   if (!directory_make(spool_directory, temp_string, 0750, FALSE))
     {
-    log_write(0, LOG_MAIN|LOG_PANIC, "%s", string_open_failed(errno,
-      "scan directory %s/scan/%s", spool_directory, temp_string));
+    log_write(0, LOG_MAIN|LOG_PANIC, "%s",
+      string_open_failed("scan directory %s/scan/%s", spool_directory, temp_string));
     goto OUT;
     }
 
     goto OUT;
     }
 
@@ -62,8 +62,8 @@ if (!spool_mbox_ok)
 
   if (!(mbox_file = modefopen(mbox_path, "wb", SPOOL_MODE)))
     {
 
   if (!(mbox_file = modefopen(mbox_path, "wb", SPOOL_MODE)))
     {
-    log_write(0, LOG_MAIN|LOG_PANIC, "%s", string_open_failed(errno,
-      "scan file %s", mbox_path));
+    log_write(0, LOG_MAIN|LOG_PANIC, "%s",
+      string_open_failed("scan file %s", mbox_path));
     goto OUT;
     }
 
     goto OUT;
     }
 
@@ -185,8 +185,8 @@ if (!spool_mbox_ok)
 if (  !(yield = Ufopen(mbox_path,"rb"))
    || fstat(fileno(yield), &statbuf) != 0
    )
 if (  !(yield = Ufopen(mbox_path,"rb"))
    || fstat(fileno(yield), &statbuf) != 0
    )
-  log_write(0, LOG_MAIN|LOG_PANIC, "%s", string_open_failed(errno,
-    "scan file %s", mbox_path));
+  log_write(0, LOG_MAIN|LOG_PANIC, "%s",
+    string_open_failed( "scan file %s", mbox_path));
 else
   *mbox_file_size = statbuf.st_size;
 
 else
   *mbox_file_size = statbuf.st_size;
 
index 3cacccce9ae4160312e277473c97cab7e48772c2..1b08e7fb8a58a856a72dd3ec276e2402c9e5a64d 100644 (file)
@@ -1612,7 +1612,6 @@ string supplied as data, adds the strerror() text, and if the failure was
 "Permission denied", reads and includes the euid and egid.
 
 Arguments:
 "Permission denied", reads and includes the euid and egid.
 
 Arguments:
-  eno           the value of errno after the failure
   format        a text format string - deliberately not uschar *
   ...           arguments for the format string
 
   format        a text format string - deliberately not uschar *
   ...           arguments for the format string
 
@@ -1620,7 +1619,7 @@ Returns:        a message, in dynamic store
 */
 
 uschar *
 */
 
 uschar *
-string_open_failed_trc(int eno, const uschar * func, unsigned line,
+string_open_failed_trc(const uschar * func, unsigned line,
   const char *format, ...)
 {
 va_list ap;
   const char *format, ...)
 {
 va_list ap;
@@ -1636,22 +1635,26 @@ doesn't seem much we can do about that. */
 va_start(ap, format);
 (void) string_vformat_trc(g, func, line, STRING_SPRINTF_BUFFER_SIZE,
        SVFMT_REBUFFER, format, ap);
 va_start(ap, format);
 (void) string_vformat_trc(g, func, line, STRING_SPRINTF_BUFFER_SIZE,
        SVFMT_REBUFFER, format, ap);
-string_from_gstring(g);
-gstring_release_unused(g);
 va_end(ap);
 
 va_end(ap);
 
-return eno == EACCES
-  ? string_sprintf("%s: %s (euid=%ld egid=%ld)", g->s, strerror(eno),
-    (long int)geteuid(), (long int)getegid())
-  : string_sprintf("%s: %s", g->s, strerror(eno));
+g = string_catn(g, US": ", 2);
+g = string_cat(g, US strerror(errno));
+
+if (errno == EACCES)
+  {
+  int save_errno = errno;
+  g = string_fmt_append(g, " (euid=%ld egid=%ld)",
+    (long int)geteuid(), (long int)getegid());
+  errno = save_errno;
+  }
+gstring_release_unused(g);
+return string_from_gstring(g);
 }
 }
-#endif  /* COMPILE_UTILITY */
 
 
 
 
 
 
 
 
 
 
-#ifndef COMPILE_UTILITY
 /* qsort(3), currently used to sort the environment variables
 for -bP environment output, needs a function to compare two pointers to string
 pointers. Here it is. */
 /* qsort(3), currently used to sort the environment variables
 for -bP environment output, needs a function to compare two pointers to string
 pointers. Here it is. */
index df520e8d76886268895a7d6ca28232877fbaa5e8..6308f10df4d00bb29ef55b0f88c8365a200dbe3d 100644 (file)
@@ -728,7 +728,7 @@ else if (errno == ENOENT)
     debug_printf("D-H parameter cache file \"%s\" does not exist\n", filename);
   }
 else
     debug_printf("D-H parameter cache file \"%s\" does not exist\n", filename);
   }
 else
-  return tls_error(string_open_failed(errno, "\"%s\" for reading", filename),
+  return tls_error(string_open_failed("\"%s\" for reading", filename),
       NULL, NULL, errstr);
 
 /* If ret < 0, either the cache file does not exist, or the data it contains
       NULL, NULL, errstr);
 
 /* If ret < 0, either the cache file does not exist, or the data it contains