git://git.exim.org
/
exim.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Propagate null gstring through string_catn()
[exim.git]
/
src
/
src
/
lookups
/
sqlite.c
diff --git
a/src/src/lookups/sqlite.c
b/src/src/lookups/sqlite.c
index dc4439153bd991650855d068405fbf99284fd1cb..d8a11ba1294897001964023c4cafb644381a049b 100644
(file)
--- a/
src/src/lookups/sqlite.c
+++ b/
src/src/lookups/sqlite.c
@@
-3,7
+3,7
@@
*************************************************/
/* Copyright (c) University of Cambridge 1995 - 2018 */
*************************************************/
/* Copyright (c) University of Cambridge 1995 - 2018 */
-/* Copyright (c) The Exim Maintainers 2020 */
+/* Copyright (c) The Exim Maintainers 2020
- 2021
*/
/* See the file NOTICE for conditions of use and distribution. */
#include "../exim.h"
/* See the file NOTICE for conditions of use and distribution. */
#include "../exim.h"
@@
-24,16
+24,23
@@
sqlite_open(const uschar * filename, uschar ** errmsg)
sqlite3 *db = NULL;
int ret;
sqlite3 *db = NULL;
int ret;
-if (!filename || !*filename) filename = sqlite_dbfile;
-if (*filename != '/')
+if (!filename || !*filename)
+ {
+ DEBUG(D_lookup) debug_printf_indent("Using sqlite_dbfile: %s\n", sqlite_dbfile);
+ filename = sqlite_dbfile;
+ }
+if (!filename || *filename != '/')
*errmsg = US"absolute file name expected for \"sqlite\" lookup";
else if ((ret = sqlite3_open(CCS filename, &db)) != 0)
{
*errmsg = (void *)sqlite3_errmsg(db);
*errmsg = US"absolute file name expected for \"sqlite\" lookup";
else if ((ret = sqlite3_open(CCS filename, &db)) != 0)
{
*errmsg = (void *)sqlite3_errmsg(db);
+ sqlite3_close(db);
+ db = NULL;
DEBUG(D_lookup) debug_printf_indent("Error opening database: %s\n", *errmsg);
}
DEBUG(D_lookup) debug_printf_indent("Error opening database: %s\n", *errmsg);
}
-sqlite3_busy_timeout(db, 1000 * sqlite_lock_timeout);
+if (db)
+ sqlite3_busy_timeout(db, 1000 * sqlite_lock_timeout);
return db;
}
return db;
}
@@
-59,7
+66,7
@@
if (argc > 1)
/* For multiple fields, include the field name too */
for (int i = 0; i < argc; i++)
{
/* For multiple fields, include the field name too */
for (int i = 0; i < argc; i++)
{
- uschar *
value = US((argv[i] != NULL)? argv[i]:
"<NULL>");
+ uschar *
value = US(argv[i] ? argv[i] :
"<NULL>");
res = lf_quote(US azColName[i], value, Ustrlen(value), res);
}
}
res = lf_quote(US azColName[i], value, Ustrlen(value), res);
}
}
@@
-67,7
+74,8
@@
if (argc > 1)
else
res = string_cat(res, argv[0] ? US argv[0] : US "<NULL>");
else
res = string_cat(res, argv[0] ? US argv[0] : US "<NULL>");
-*(gstring **)arg = res;
+/* always return a non-null gstring, even for a zero-length string result */
+*(gstring **)arg = res ? res : string_get(1);
return 0;
}
return 0;
}
@@
-87,7
+95,7
@@
if (ret != SQLITE_OK)
return FAIL;
}
return FAIL;
}
-if (!res) *do_cache = 0;
+if (!res) *do_cache = 0;
/* on fail, wipe cache */
*result = string_from_gstring(res);
return OK;
*result = string_from_gstring(res);
return OK;