X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/4a7dca52352d0976f200b89a50825433b7551554..d954f4b2539fb156ff85edb45eddcfb03fa45d79:/src/src/search.c diff --git a/src/src/search.c b/src/src/search.c index 061a9e864..90af54c36 100644 --- a/src/src/search.c +++ b/src/src/search.c @@ -3,7 +3,7 @@ *************************************************/ /* Copyright (c) University of Cambridge 1995 - 2015 */ -/* Copyright (c) The Exim Maintainers 2020 */ +/* Copyright (c) The Exim Maintainers 2020 - 2021 */ /* See the file NOTICE for conditions of use and distribution. */ /* A set of functions to search databases in various formats. An open @@ -223,18 +223,31 @@ Arguments: search the search-type string query argument for the search; filename or query fnamep pointer to return filename + opts options Return: keyquery the search-type (for single-key) or query (for query-type) */ uschar * -search_args(int search_type, uschar * search, uschar * query, uschar ** fnamep) +search_args(int search_type, uschar * search, uschar * query, uschar ** fnamep, + const uschar * opts) { Uskip_whitespace(&query); if (mac_islookup(search_type, lookup_absfilequery)) { /* query-style but with file (sqlite) */ - uschar * s = query; + int sep = ','; + + /* Check options first for new-style file spec */ + if (opts) for (uschar * s; s = string_nextinlist(&opts, &sep, NULL, 0); ) + if (Ustrncmp(s, "file=", 5) == 0) + { + *fnamep = s+5; + return query; + } + + /* If no filename from options, use old-tyle space-sep prefix on query */ if (*query == '/') { + uschar * s = query; while (*query && !isspace(*query)) query++; *fnamep = string_copyn(s, query - s); Uskip_whitespace(&query); @@ -379,12 +392,8 @@ lookup_info *lk = lookup_list[search_type]; uschar keybuffer[256]; int old_pool = store_pool; -if (filename && is_tainted(filename)) - { - log_write(0, LOG_MAIN|LOG_PANIC, - "Tainted filename for search: '%s'", filename); +if (filename && is_tainted2(filename, LOG_MAIN|LOG_PANIC, "Tainted filename for search: '%s'", filename)) return NULL; - } /* Change to the search store pool and remember our reset point */ @@ -701,7 +710,7 @@ if (opts) /* Arrange to put this database at the top of the LRU chain if it is a type that opens real files. */ -if ( open_top != (tree_node *)handle +if ( open_top != (tree_node *)handle && lookup_list[t->name[0]-'0']->type == lookup_absfile) { search_cache *c = (search_cache *)(t->data.ptr);