Sqlite: fix segfault on bad/missing sqlite_dbfile. Bug 2606
authorJeremy Harris <jgh146exb@wizmail.org>
Sun, 28 Jun 2020 14:24:21 +0000 (15:24 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Sun, 28 Jun 2020 14:24:21 +0000 (15:24 +0100)
doc/doc-txt/ChangeLog
src/src/lookups/sqlite.c
test/scripts/2600-SQLite/2600
test/stderr/2600
test/stdout/2600

index 83d027d0f6ba8fb24951816167b4b38e584d34b7..b2b9a74b876f331e909ad03d1480d661a9f19f18 100644 (file)
@@ -66,6 +66,9 @@ JH/12 Bug 2607: Fix the ${srs_encode } expansion to handle quoted local_parts.
 JH/13 Fix dsearch "subdir" filter to ignore ".".  Previously only ".." was
       excluded, not matching the documentation.
 
+JH/14 Bug 2606: Fix a segfault in sqlite lookups.  When no, or a bad, filename
+      was given for the sqlite_dbfile a trap resulted.
+
 
 Exim version 4.94
 -----------------
index dc4439153bd991650855d068405fbf99284fd1cb..1638ea4019d6b0ccd86b4ec2c4ba6630f55ffd42 100644 (file)
@@ -24,16 +24,23 @@ sqlite_open(const uschar * filename, uschar ** errmsg)
 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);
+  sqlite3_close(db);
+  db = NULL;
   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;
 }
 
index d7e4d69d86b22f4d9ed47bc2654a939f4c933411..a11d46ef173d78f17da86922d6fcefa346c3d301 100644 (file)
@@ -43,3 +43,9 @@ ${lookup sqlite{DIR/aux-fixed/sqlitedb select name from them where id='userx';}}
 exim -DDATA=DIR/aux-fixed/sqlitedb -d-all+lookup -be
 ${lookup sqlite{select name from them where id='userx';}}
 ****
+exim -DDATA=nonabsolute_filename -d-all+lookup -be
+${lookup sqlite{select name from them where id='userx';}}
+****
+exim -DDATA=DIR/missingfile -d-all+lookup -be
+${lookup sqlite{select name from them where id='userx';}}
+****
index ecc3c2091bb8edaff8588c509ded9214e76d2c16..e9fab91548930b1304e1951dcc218bc4e270196c 100644 (file)
@@ -618,6 +618,7 @@ configuration file is TESTSUITE/test-config
 admin user
 dropping to exim gid; retaining priv uid
  search_open: sqlite "NULL"
+ Using sqlite_dbfile: TESTSUITE/aux-fixed/sqlitedb
  search_find: file="NULL"
    key="select name from them where id='userx';" partial=-1 affix=NULL starflags=0 opts=NULL
  LRU list:
@@ -628,3 +629,28 @@ dropping to exim gid; retaining priv uid
  lookup yielded: Ayen Other
 search_tidyup called
 >>>>>>>>>>>>>>>> Exim pid=pppp (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
+Exim version x.yz ....
+configuration file is TESTSUITE/test-config
+admin user
+dropping to exim gid; retaining priv uid
+ search_open: sqlite "NULL"
+ Using sqlite_dbfile: nonabsolute_filename
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
+Exim version x.yz ....
+configuration file is TESTSUITE/test-config
+admin user
+dropping to exim gid; retaining priv uid
+ search_open: sqlite "NULL"
+ Using sqlite_dbfile: TESTSUITE/missingfile
+ search_find: file="NULL"
+   key="select name from them where id='userx';" partial=-1 affix=NULL starflags=0 opts=NULL
+ LRU list:
+ internal_search_find: file="NULL"
+   type=sqlite key="select name from them where id='userx';" opts=NULL
+ database lookup required for select name from them where id='userx';
+ sqlite3_exec failed: no such table: them
+ creating new cache entry
+ lookup failed
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
index c21783b864a1613c70238f948fc977ccde982548..0a0a461ceab0bbe185d378e2e9f4f34c4615c517 100644 (file)
@@ -46,3 +46,7 @@ after" id=newline
 > 
 > Ayen Other
 > 
+> Failed: absolute file name expected for "sqlite" lookup
+> 
+> 
+>