Hintsdb: fix dumpdb for sqlite
authorJeremy Harris <jgh146exb@wizmail.org>
Sat, 29 Jun 2024 08:18:52 +0000 (09:18 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Sat, 29 Jun 2024 08:18:52 +0000 (09:18 +0100)
src/src/exim_dbutil.c
src/src/hintsdb/hints_sqlite.h
test/log/0128
test/msglog/0128.10HmaX-000000005vi-0000
test/runtest
test/stdout/0543

index 397b1162e6008546a8a38422d3748bf75702c1f8..d3d854dd5520e78a48638c041010ca21640183ae 100644 (file)
@@ -344,7 +344,7 @@ if (flags & O_RDWR) flags |= O_CREAT;
 
 if (!(dbblock->dbptr = exim_dbopen(filename, dirname, flags, 0)))
   {
-  printf("** Failed to open DBM file %s for %s: %s%s\n", filename,
+  printf("** Failed to open hintsdb file %s for %s: %s%s\n", filename,
     read_only ? "reading" : "writing", strerror(errno),
 #ifdef USE_DB
     " (or Berkeley DB error while opening)"
index 21ebd4f01351dbb76d0f4731b2fd5ada7d051359..69f9c43c1c9492a78b6d553f6f5a76409a1781d7 100644 (file)
@@ -99,9 +99,10 @@ if (sqlite3_step(statement) != SQLITE_ROW)
 
 res->len = sqlite3_column_bytes(statement, 0);
 # ifdef COMPILE_UTILITY
-res->data = malloc(res->len);
+if (!(res->data = malloc(res->len +1)))
+  { sqlite3_finalize(statement); return FALSE; }
 # else
-res->data = store_get(res->len, GET_TAINTED);
+res->data = store_get(res->len +1, GET_TAINTED);
 # endif
 memcpy(res->data, sqlite3_column_blob(statement, 0), res->len);
 res->data[res->len] = '\0';
@@ -120,7 +121,9 @@ BOOL ret;
 
 # ifdef COMPILE_UTILITY
 /* fprintf(stderr, "exim_dbget(k len %d '%.*s')\n", (int)key->len, (int)key->len, key->data); */
-qry = malloc(i = snprintf(NULL, 0, FMT, (int) key->len, key->data));
+i = snprintf(NULL, 0, FMT, (int) key->len, key->data)+1;
+if (!(qry = malloc(i)))
+  return FALSE;
 snprintf(CS qry, i, FMT, (int) key->len, key->data);
 ret = exim_dbget__(dbp, qry, res);
 free(qry);
@@ -143,19 +146,20 @@ exim_s_dbp(EXIM_DB * dbp, EXIM_DATUM * key, EXIM_DATUM * data, const uschar * al
 {
 int hlen = data->len * 2, off = 0, res;
 # define FMT "INSERT OR %s INTO tbl (ky,dat) VALUES ('%.*s', X'%.*s');"
+uschar * qry;
 # ifdef COMPILE_UTILITY
 uschar * hex = malloc(hlen+1);
+if (!hex) return EXIM_DBPUTB_DUP;      /* best we can do */
 # else
 uschar * hex = store_get(hlen+1, data->data);
 # endif
-uschar * qry;
 
 for (const uschar * s = data->data, * t = s + data->len; s < t; s++, off += 2)
   sprintf(CS hex + off, "%02X", *s);
 
 # ifdef COMPILE_UTILITY
-res = snprintf(CS hex, 0, FMT, alt, (int) key->len, key->data, hlen, hex);
-qry = malloc(res);
+res = snprintf(CS hex, 0, FMT, alt, (int) key->len, key->data, hlen, hex) +1;
+if (!(qry = malloc(res))) return EXIM_DBPUTB_DUP;
 snprintf(CS qry, res, FMT, alt, (int) key->len, key->data, hlen, hex);
 /* fprintf(stderr, "exim_s_dbp(%s)\n", qry); */
 res = sqlite3_exec(dbp, CS qry, NULL, NULL, NULL);
@@ -204,8 +208,8 @@ uschar * qry;
 int res;
 
 # ifdef COMPILE_UTILITY
-res = snprintf(NULL, 0, FMT, (int) key->len, key->data); /* res excludes nul */
-qry = malloc(res);
+res = snprintf(NULL, 0, FMT, (int) key->len, key->data) +1; /* res includes nul */
+if (!(qry = malloc(res))) return SQLITE_NOMEM;
 snprintf(CS qry, res, FMT, (int) key->len, key->data);
 res = sqlite3_exec(dbp, CS qry, NULL, NULL, NULL);
 free(qry);
@@ -227,6 +231,7 @@ exim_dbcreate_cursor(EXIM_DB * dbp)
 {
 # ifdef COMPILE_UTILITY
 EXIM_CURSOR * c = malloc(sizeof(int));
+if (!c) return NULL;
 # else
 EXIM_CURSOR * c = store_malloc(sizeof(int));
 # endif
@@ -246,7 +251,8 @@ int i;
 BOOL ret;
 
 # ifdef COMPILE_UTILITY
-if (!(qry = malloc((i = snprintf(NULL, 0, FMT, *cursor))+1))) return FALSE;
+i = snprintf(NULL, 0, FMT, *cursor)+1;
+if (!(qry = malloc(i))) return FALSE;
 snprintf(CS qry, i, FMT, *cursor);
 /* fprintf(stderr, "exim_dbscan(%s)\n", qry); */
 ret = exim_dbget__(dbp, qry, key);
index 58f770eb96f594f3373b3394d657cc167e6ee4c0..a267f684d99d00f74f718118790436234a27d93e 100644 (file)
@@ -1,2 +1,2 @@
 1999-03-02 09:44:33 10HmaX-000000005vi-0000 <= CALLER@test.ex U=CALLER P=local S=sss
-1999-03-02 09:44:33 10HmaX-000000005vi-0000 == userx@test.ex R=reply T=reply defer (EEE): Is a directory: Failed to open DBM file TESTSUITE/spool when sending message from reply transport: Is a directory
+1999-03-02 09:44:33 10HmaX-000000005vi-0000 == userx@test.ex R=reply T=reply defer (EEE): Is a directory: Failed to open sqlite3 file TESTSUITE/spool when sending message from reply transport: Is a directory
index 930261ebb2a35e08053b0b978c930680493b8c6f..4687b60dfdbe8b4f2153ff2a03ba4212c3bdd170 100644 (file)
@@ -1,2 +1,2 @@
 1999-03-02 09:44:33 Received from CALLER@test.ex U=CALLER P=local S=sss
-1999-03-02 09:44:33 userx@test.ex R=reply T=reply defer (EEE): Is a directory: Failed to open DBM file TESTSUITE/spool when sending message from reply transport: Is a directory
+1999-03-02 09:44:33 userx@test.ex R=reply T=reply defer (EEE): Is a directory: Failed to open sqlite3 file TESTSUITE/spool when sending message from reply transport: Is a directory
index 7a642fc2014cd2c505250c0edae90812cb0d44a3..781ea97d114689a4c3cdb9bfa69b2f52abc06997 100755 (executable)
@@ -468,9 +468,6 @@ RESET_AFTER_EXTRA_LINE_READ:
   # This message sometimes has a different number of seconds
   s/forced fail after \d seconds/forced fail after d seconds/;
 
-  # This message may contain a different DBM library name
-  s/Failed to open \S+( \([^\)]+\))? file/Failed to open DBM file/;
-
   # The message for a non-listening FIFO varies
   s/:[^:]+: while opening named pipe/: Error: while opening named pipe/;
 
@@ -1056,7 +1053,7 @@ RESET_AFTER_EXTRA_LINE_READ:
     s/^(Connection request from) \[.*:.*:.*\]$/$1 \[ipv6\]/;
 
     # Hints DB use of lockfiles is provider-dependent
-    s/Failed to open \K(?:DBM|database lock) file (.*\/spool\/db\/[^.]*)(?:.lockfile)?(?=(?: for reading)?: No such file or directory$)/hintsdb $1/;
+    s/Failed to open \K(?:hintsdb|database lock) file (.*\/spool\/db\/[^.]*)(?:.lockfile)?(?=(?: for reading)?: No such file or directory$)/hintsdb $1/;
 
     # openssl version variances
   # Error lines on stdout from SSL contain process id values and file names.
@@ -2470,7 +2467,7 @@ if ($debug) { printf ">> $_\n"; }
 ###################
 
 # The "dbmbuild" command runs exim_dbmbuild. This is used both to test the
-# utility and to make DBM files for testing DBM lookups.
+# utility and to make hintsdb files for testing hintsdb lookups.
 
 if (/^dbmbuild\s+(\S+)\s+(\S+)/)
   {
@@ -2483,7 +2480,7 @@ if (/^dbmbuild\s+(\S+)\s+(\S+)/)
 
 # The "dump" command runs exim_dumpdb. On different systems, the output for
 # some types of dump may appear in a different order because it's just hauled
-# out of the DBM file. We can solve this by sorting. Ignore the leading
+# out of the hintsdb file. We can solve this by sorting. Ignore the leading
 # date/time, as it will be flattened later during munging.
 
 if (/^dump\s+(\S+)/)
index c53cb62adcb45b0ef88764b127a8316a28572ad5..d51549ac946ac03343abcdf1a73647217082546e 100644 (file)
@@ -1,5 +1,5 @@
 +++++++++++++++++++++++++++
-** Failed to open hintsdb TESTSUITE/spool/db/wait-smtp: No such file or directory
+** Failed to open hintsdb TESTSUITE/spool/db/wait-smtp for reading: No such file or directory
 
 ******** SERVER ********
 Listening on port 1224 ...