From ccb1c16ef0669eaced1b199f9c86d554c4cfce85 Mon Sep 17 00:00:00 2001 From: FUTATSUKI Yasuhito Date: Thu, 20 Jun 2024 06:36:08 +0900 Subject: [PATCH 1/5] dkimf_db_walk: explicitly treat DKIMF_DB_MEMCACHE as unsupported db type. This saves incorrect usage of DKIMF_DB_MEMCACHE from assertion failure addressing to unknown DB type error, although it still need that caller should handle the error properly. --- opendkim/opendkim-db.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/opendkim/opendkim-db.c b/opendkim/opendkim-db.c index af0c13c9..38ab802c 100644 --- a/opendkim/opendkim-db.c +++ b/opendkim/opendkim-db.c @@ -5832,13 +5832,16 @@ dkimf_db_walk(DKIMF_DB db, _Bool first, void *key, size_t *keylen, (key == NULL && keylen != NULL)) return -1; - if (db->db_type == DKIMF_DB_TYPE_REFILE || - db->db_type == DKIMF_DB_TYPE_SOCKET || - db->db_type == DKIMF_DB_TYPE_LUA) - return -1; - switch (db->db_type) { + case DKIMF_DB_TYPE_REFILE: + case DKIMF_DB_TYPE_SOCKET: + case DKIMF_DB_TYPE_LUA: + case DKIMF_DB_TYPE_MEMCACHE: + { + /* This operation does not support these type of dbs. */ + return -1; + } case DKIMF_DB_TYPE_CSL: case DKIMF_DB_TYPE_FILE: { From 3c60fa8cc8bff9ec7a6ab12cea0cbeef05215c25 Mon Sep 17 00:00:00 2001 From: FUTATSUKI Yasuhito Date: Sat, 5 Oct 2024 01:16:27 +0900 Subject: [PATCH 2/5] Add new function to consult if a db supports dkimf_db_walk() * opendkim/opendkim-db.c, opendkim/opendkim-db.h (dkimf_can_db_walk): New. --- opendkim/opendkim-db.c | 26 ++++++++++++++++++++++++++ opendkim/opendkim-db.h | 1 + 2 files changed, 27 insertions(+) diff --git a/opendkim/opendkim-db.c b/opendkim/opendkim-db.c index 38ab802c..30d5a750 100644 --- a/opendkim/opendkim-db.c +++ b/opendkim/opendkim-db.c @@ -5805,6 +5805,32 @@ dkimf_db_strerror(DKIMF_DB db, char *err, size_t errlen) /* NOTREACHED */ } +/* +** DKIMF_CAN_DB_WALK -- check if the db supports dkimf_db_walk operation +** +** Parameters: +** db -- database +** +** Return value: +** TRUE -- suppots +** FALSE -- does not support +*/ + +_Bool +dkimf_can_db_walk(DKIMF_DB db) +{ + switch (db->db_type) + { + case DKIMF_DB_TYPE_REFILE: + case DKIMF_DB_TYPE_SOCKET: + case DKIMF_DB_TYPE_LUA: + case DKIMF_DB_TYPE_MEMCACHE: + case DKIMF_DB_TYPE_UNKNOWN: + return FALSE; + } + return TRUE; +} + /* ** DKIMF_DB_WALK -- walk a database ** diff --git a/opendkim/opendkim-db.h b/opendkim/opendkim-db.h index 13ca112d..805fb8c4 100644 --- a/opendkim/opendkim-db.h +++ b/opendkim/opendkim-db.h @@ -94,6 +94,7 @@ extern int dkimf_db_rewalk __P((DKIMF_DB, char *, DKIMF_DBDATA, unsigned int, extern void dkimf_db_set_ldap_param __P((int, char *)); extern int dkimf_db_strerror __P((DKIMF_DB, char *, size_t)); extern int dkimf_db_type __P((DKIMF_DB)); +extern _Bool dkimf_can_db_walk __P((DKIMF_DB)); extern int dkimf_db_walk __P((DKIMF_DB, _Bool, void *, size_t *, DKIMF_DBDATA, unsigned int)); From 565d38c00734a31cabe7e3577ef96ebc8f8a9433 Mon Sep 17 00:00:00 2001 From: FUTATSUKI Yasuhito Date: Sat, 5 Oct 2024 01:47:57 +0900 Subject: [PATCH 3/5] dkimf_config_load: skip consistency check for signing table if the db does not support db walk operation * opendkim/opendkim.c (dkimf_config_load): As above --- opendkim/opendkim.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/opendkim/opendkim.c b/opendkim/opendkim.c index 803f37b0..cf84ad20 100644 --- a/opendkim/opendkim.c +++ b/opendkim/opendkim.c @@ -8323,7 +8323,8 @@ dkimf_config_load(struct config *data, struct dkimf_config *conf, ** missing KeyTable entries. */ - if (conf->conf_signtabledb != NULL) + if (conf->conf_signtabledb != NULL && + dkimf_can_db_walk(conf->conf_signtabledb)) { _Bool first = TRUE; _Bool found; From a15213f710b7c9c12435a869d28e579187eeae1d Mon Sep 17 00:00:00 2001 From: FUTATSUKI Yasuhito Date: Sat, 5 Oct 2024 02:01:20 +0900 Subject: [PATCH 4/5] Rename from dkimf_can_db_walk to dkimf_db_can_walk for nameing rule --- opendkim/opendkim-db.c | 4 ++-- opendkim/opendkim-db.h | 2 +- opendkim/opendkim.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/opendkim/opendkim-db.c b/opendkim/opendkim-db.c index 30d5a750..d39b3e77 100644 --- a/opendkim/opendkim-db.c +++ b/opendkim/opendkim-db.c @@ -5806,7 +5806,7 @@ dkimf_db_strerror(DKIMF_DB db, char *err, size_t errlen) } /* -** DKIMF_CAN_DB_WALK -- check if the db supports dkimf_db_walk operation +** DKIMF_DB_CAN_WALK -- check if the db supports dkimf_db_walk operation ** ** Parameters: ** db -- database @@ -5817,7 +5817,7 @@ dkimf_db_strerror(DKIMF_DB db, char *err, size_t errlen) */ _Bool -dkimf_can_db_walk(DKIMF_DB db) +dkimf_db_can_walk(DKIMF_DB db) { switch (db->db_type) { diff --git a/opendkim/opendkim-db.h b/opendkim/opendkim-db.h index 805fb8c4..aac35d77 100644 --- a/opendkim/opendkim-db.h +++ b/opendkim/opendkim-db.h @@ -94,7 +94,7 @@ extern int dkimf_db_rewalk __P((DKIMF_DB, char *, DKIMF_DBDATA, unsigned int, extern void dkimf_db_set_ldap_param __P((int, char *)); extern int dkimf_db_strerror __P((DKIMF_DB, char *, size_t)); extern int dkimf_db_type __P((DKIMF_DB)); -extern _Bool dkimf_can_db_walk __P((DKIMF_DB)); +extern _Bool dkimf_db_can_walk __P((DKIMF_DB)); extern int dkimf_db_walk __P((DKIMF_DB, _Bool, void *, size_t *, DKIMF_DBDATA, unsigned int)); diff --git a/opendkim/opendkim.c b/opendkim/opendkim.c index cf84ad20..dccb1ef1 100644 --- a/opendkim/opendkim.c +++ b/opendkim/opendkim.c @@ -8324,7 +8324,7 @@ dkimf_config_load(struct config *data, struct dkimf_config *conf, */ if (conf->conf_signtabledb != NULL && - dkimf_can_db_walk(conf->conf_signtabledb)) + dkimf_db_can_walk(conf->conf_signtabledb)) { _Bool first = TRUE; _Bool found; From 7c39a621e9ae464ab96478f1166a9730f3f495e2 Mon Sep 17 00:00:00 2001 From: FUTATSUKI Yasuhito Date: Sat, 5 Oct 2024 02:11:33 +0900 Subject: [PATCH 5/5] * opendkm/opendkim-db.c (dkimf_db_can_walk): Add assertion db should not be NULL --- opendkim/opendkim-db.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/opendkim/opendkim-db.c b/opendkim/opendkim-db.c index d39b3e77..db3d9409 100644 --- a/opendkim/opendkim-db.c +++ b/opendkim/opendkim-db.c @@ -5819,6 +5819,8 @@ dkimf_db_strerror(DKIMF_DB db, char *err, size_t errlen) _Bool dkimf_db_can_walk(DKIMF_DB db) { + assert(db != NULL); + switch (db->db_type) { case DKIMF_DB_TYPE_REFILE: