Fix dbmjz lookup
authorJeremy Harris <jgh146exb@wizmail.org>
Tue, 23 Jul 2024 12:26:24 +0000 (13:26 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Tue, 23 Jul 2024 12:31:33 +0000 (13:31 +0100)
Broken-by: c66a6edf7ba8
src/src/dbfn.c

index 16b300180b17e0ae6cb30f9fc0cd3cc42b6b49d2..1044611cca1b276e0fb136c116d015395d83dc68 100644 (file)
@@ -376,14 +376,13 @@ DEBUG(D_hints_lookup)
 *             Read from database file            *
 *************************************************/
 
-/* Passing back the pointer unchanged is useless, because there is
+/* Read, using a defined-length key (permitting embedded NULs).
+
+Passing back the pointer unchanged is useless, because there is
 no guarantee of alignment. Since all the records used by Exim need
 to be properly aligned to pick out the timestamps, etc., we might as
 well do the copying centrally here.
 
-Most calls don't need the length, so there is a macro called dbfn_read which
-has two arguments; it calls this function adding NULL as the third.
-
 Arguments:
   dbblock   a pointer to an open database block
   key       the key of the record to be read
@@ -421,9 +420,11 @@ if (!exim_dbget(dbblock->dbptr, &key_datum, &result_datum))
 store the taint status with the data. */
 
 dlen = exim_datum_size_get(&result_datum);
-yield = store_get(dlen, GET_TAINTED);
-memcpy(yield, exim_datum_data_get(&result_datum), dlen);
 DEBUG(D_hints_lookup) debug_printf_indent("dbfn_read: size %u return\n", dlen);
+
+yield = store_get(dlen+1, GET_TAINTED);
+memcpy(yield, exim_datum_data_get(&result_datum), dlen);
+((uschar *)yield)[dlen] = '\0';
 if (length) *length = dlen;
 
 exim_datum_free(&result_datum);    /* Some DBM libs require freeing */
@@ -431,7 +432,11 @@ return yield;
 }
 
 
-/*
+/* Read, using a NUL-terminated key.
+
+Most calls don't need the length, so there is a macro called dbfn_read which
+has two arguments; it calls this function adding NULL as the third.
+
 Arguments:
   dbblock   a pointer to an open database block
   key       the key of the record to be read (NUL-terminated)