Michael, You can simplify the patch. I ran the patched code under
valgrind and it informed me that there was a memory leak. It would
not be the end of the world, but it just isn't a good example.
Commands:
$ make makefiles shared=no dynamicmaps=no
...
$ cd src/util; make update
...
$ cd ../global; make mail_dict
...
$ cat /tmp/foo
dbpath = /tmp/foo-db
query = SELECT replacement FROM aliases WHERE mailbox = '%s'
$ valgrind --tool=memcheck --leak-check=full --log-file=/tmp/valgrind/%p
./mail_dict sqlite:/tmp/foo read
./mail_dict: error: sqlite:/tmp/foo: open database /tmp/foo-db: unable to
open database file: No such file or directory
...
get foo
./mail_dict: warning: sqlite:/tmp/foo is unavailable. sqlite:/tmp/foo: open
database /tmp/foo-db: unable to open database file: No such file or directory
foo: error
^D
Valgrind output fragment:
==1227729== 1,344 (824 direct, 520 indirect) bytes in 1 blocks are
definitely lost in loss record 25 of 27
==1227729== at 0x4843866: malloc (vg_replace_malloc.c:446)
==1227729== by 0x567FD45: sqlite3MemMalloc.lto_priv.0 (sqlite3.c:26471)
==1227729== by 0x567BC30: UnknownInlinedFun (sqlite3.c:30173)
==1227729== by 0x567BC30: UnknownInlinedFun (sqlite3.c:30219)
==1227729== by 0x567BC30: sqlite3Malloc.lto_priv.0 (sqlite3.c:30213)
==1227729== by 0x572A8FE: UnknownInlinedFun (sqlite3.c:30498)
==1227729== by 0x572A8FE: openDatabase (sqlite3.c:181410)
==1227729== by 0x11EA41: dict_sqlite_open (dict_sqlite.c:334)
==1227729== by 0x12A93D: dict_open3 (dict_open.c:492)
==1227729== by 0x12A861: dict_open (dict_open.c:470)
==1227729== by 0x13EA6B: dict_test (dict_test.c:88)
==1227729== by 0x111127: main (mail_dict.c:121)
On closer investigation, the leak happens because you moved some
code out of dict_sqlite_close() into a new function dict_sqlite_free()
that does not free the db.
Simplified patch follows... please verify.
Wietse
--- /var/tmp/postfix-3.10-20241202/src/global/dict_sqlite.c 2023-10-12
11:34:40.000000000 -0400
+++ ./dict_sqlite.c 2025-01-03 11:15:36.752684221 -0500
@@ -59,6 +59,9 @@
#if !defined(SQLITE_VERSION_NUMBER) || (SQLITE_VERSION_NUMBER < 3005004)
#define sqlite3_prepare_v2 sqlite3_prepare
#endif
+#if !defined(SQLITE_VERSION_NUMBER) || (SQLITE_VERSION_NUMBER < 3005000)
+#define sqlite3_open_v2(fname,ppDB,flags,zVfs) sqlite_open(fname,ppDB)
+#endif
/* Utility library. */
@@ -320,10 +323,16 @@
dict_sqlite->parser = parser;
sqlite_parse_config(dict_sqlite, name);
- if (sqlite3_open(dict_sqlite->dbpath, &dict_sqlite->db))
- msg_fatal("%s:%s: Can't open database: %s\n",
- DICT_TYPE_SQLITE, name, sqlite3_errmsg(dict_sqlite->db));
+ if (sqlite3_open_v2(dict_sqlite->dbpath, &dict_sqlite->db,
+ SQLITE_OPEN_READONLY, NULL) != SQLITE_OK) {
+ DICT *dict = dict_surrogate(DICT_TYPE_SQLITE, name, open_flags,
+ dict_flags, "%s:%s: open database %s: %s: %m",
+ DICT_TYPE_SQLITE, name, dict_sqlite->dbpath,
+ sqlite3_errmsg(dict_sqlite->db));
+ dict_sqlite_close(&dict_sqlite->dict);
+ return dict;
+ }
dict_sqlite->dict.owner = cfg_get_owner(dict_sqlite->parser);
return (DICT_DEBUG (&dict_sqlite->dict));
_______________________________________________
Postfix-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]