Dsearch: Fix taint-handling in lookup. Bug 2465
authorJeremy Harris <jgh146exb@wizmail.org>
Thu, 7 Nov 2019 17:32:49 +0000 (17:32 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Thu, 7 Nov 2019 17:32:49 +0000 (17:32 +0000)
doc/doc-txt/ChangeLog
src/src/lookups/dsearch.c
src/src/string.c

index 9be52ceddc82688cd386e9a39af2ba0e2086745d..ac7f3357d9efc8383c54cbb77e6ffedccf4c0ca4 100644 (file)
@@ -196,6 +196,10 @@ JH/42 Bug 2545: Fix CHUNKING for all RCPT commands rejected.  Previously we
       carried on and emitted a BDAT command, even when PIPELINING was not
       active.
 
       carried on and emitted a BDAT command, even when PIPELINING was not
       active.
 
+JH/43 Bug 2465: Fix taint-handling in dsearch lookup.  Previously a nontainted
+      buffer was used for the filename, resulting in a trap when tainted
+      arguments (eg. $domain) were used.
+
 
 Exim version 4.92
 -----------------
 
 Exim version 4.92
 -----------------
index 9f7dd8da0c0319050bfb8586a7eaf0e099d25207..c27f5d6e65203f9d01d984012ab3566c067bb997 100644 (file)
@@ -65,13 +65,13 @@ return lf_check_file(-1, filename, S_IFDIR, modemask, owners, owngroups,
 scanning the directory, as it is hopefully faster to let the OS do the scanning
 for us. */
 
 scanning the directory, as it is hopefully faster to let the OS do the scanning
 for us. */
 
-int
-static dsearch_find(void *handle, uschar *dirname, const uschar *keystring, int length,
+static int
+dsearch_find(void *handle, uschar *dirname, const uschar *keystring, int length,
   uschar **result, uschar **errmsg, uint *do_cache)
 {
 struct stat statbuf;
 int save_errno;
   uschar **result, uschar **errmsg, uint *do_cache)
 {
 struct stat statbuf;
 int save_errno;
-uschar filename[PATH_MAX];
+uschar * filename;
 
 handle = handle;  /* Keep picky compilers happy */
 length = length;
 
 handle = handle;  /* Keep picky compilers happy */
 length = length;
@@ -84,12 +84,7 @@ if (Ustrchr(keystring, '/') != 0)
   return DEFER;
   }
 
   return DEFER;
   }
 
-if (!string_format(filename, sizeof(filename), "%s/%s", dirname, keystring))
-  {
-  *errmsg = US"path name too long";
-  return DEFER;
-  }
-
+filename = string_sprintf("%s/%s", dirname, keystring);
 if (Ulstat(filename, &statbuf) >= 0)
   {
   *result = string_copy(keystring);
 if (Ulstat(filename, &statbuf) >= 0)
   {
   *result = string_copy(keystring);
index ced1ad8c78bfe71236b67242708ab82619fd799c..007ec877ef5d1c491527e210ab2b8e778ab283ba 100644 (file)
@@ -664,7 +664,7 @@ return yield;
 *************************************************/
 
 /* The formatting is done by string_vformat, which checks the length of
 *************************************************/
 
 /* The formatting is done by string_vformat, which checks the length of
-everything.
+everything.  Taint is taken from the worst of the arguments.
 
 Arguments:
   format    a printf() format - deliberately char * rather than uschar *
 
 Arguments:
   format    a printf() format - deliberately char * rather than uschar *