File CVE-2022-30550.patch of Package dovecot22.24960
--- src/auth/auth-request.c.orig 2022-07-07 19:06:16.591545938 +0200
+++ src/auth/auth-request.c 2022-07-07 19:10:56.837218056 +0200
@@ -670,8 +670,8 @@ auth_request_want_skip_passdb(struct aut
struct auth_passdb *passdb)
{
/* if mechanism is not supported, skip */
- const char *const *mechs = passdb->passdb->mechanisms;
- const char *const *username_filter = passdb->passdb->username_filter;
+ const char *const *mechs = passdb->mechanisms;
+ const char *const *username_filter = passdb->username_filter;
const char *username;
username = request->user;
@@ -684,7 +684,7 @@ auth_request_want_skip_passdb(struct aut
return TRUE;
}
- if (passdb->passdb->username_filter != NULL &&
+ if (passdb->username_filter != NULL &&
!auth_request_username_accepted(username_filter, username)) {
auth_request_log_debug(request,
request->mech != NULL ? AUTH_SUBSYS_MECH
--- src/auth/auth.c.orig 2017-06-26 13:29:36.000000000 +0200
+++ src/auth/auth.c 2022-07-07 19:06:16.607546034 +0200
@@ -86,6 +86,24 @@ auth_passdb_preinit(struct auth *auth, c
auth_passdb->override_fields_tmpl =
passdb_template_build(auth->pool, set->override_fields);
+ if (*set->mechanisms == '\0') {
+ auth_passdb->mechanisms = NULL;
+ } else if (strcasecmp(set->mechanisms, "none") == 0) {
+ auth_passdb->mechanisms = (const char *const[]){ NULL };
+ } else {
+ auth_passdb->mechanisms =
+ (const char *const *)p_strsplit_spaces(auth->pool,
+ set->mechanisms, " ,");
+ }
+
+ if (*set->username_filter == '\0') {
+ auth_passdb->username_filter = NULL;
+ } else {
+ auth_passdb->username_filter =
+ (const char *const *)p_strsplit_spaces(auth->pool,
+ set->username_filter, " ,");
+ }
+
/* for backwards compatibility: */
if (set->pass)
auth_passdb->result_success = AUTH_DB_RULE_CONTINUE;
--- src/auth/auth.h.orig 2017-06-26 13:29:01.000000000 +0200
+++ src/auth/auth.h 2022-07-07 19:06:16.607546034 +0200
@@ -38,6 +38,11 @@ struct auth_passdb {
struct passdb_template *default_fields_tmpl;
struct passdb_template *override_fields_tmpl;
+ /* Supported authentication mechanisms, NULL is all, {NULL} is none */
+ const char *const *mechanisms;
+ /* Username filter, NULL is no filter */
+ const char *const *username_filter;
+
enum auth_passdb_skip skip;
enum auth_db_rule result_success;
enum auth_db_rule result_failure;
--- src/auth/passdb.c.orig 2017-06-26 13:29:01.000000000 +0200
+++ src/auth/passdb.c 2022-07-07 19:15:23.986811819 +0200
@@ -223,19 +223,8 @@ passdb_preinit(pool_t pool, const struct
passdb->id = ++auth_passdb_id;
passdb->iface = *iface;
passdb->args = p_strdup(pool, set->args);
- if (*set->mechanisms == '\0') {
- passdb->mechanisms = NULL;
- } else if (strcasecmp(set->mechanisms, "none") == 0) {
- passdb->mechanisms = (const char *const[]){NULL};
- } else {
- passdb->mechanisms = (const char* const*)p_strsplit_spaces(pool, set->mechanisms, " ,");
- }
-
- if (*set->username_filter == '\0') {
- passdb->username_filter = NULL;
- } else {
- passdb->username_filter = (const char* const*)p_strsplit_spaces(pool, set->username_filter, " ,");
- }
+ /* NOTE: if anything else than driver & args are added here,
+ passdb_find() also needs to be updated. */
array_append(&passdb_modules, &passdb, 1);
return passdb;
}
--- src/auth/passdb.h.orig 2017-06-26 13:29:36.000000000 +0200
+++ src/auth/passdb.h 2022-07-07 19:16:54.283350479 +0200
@@ -62,10 +62,6 @@ struct passdb_module {
/* Default password scheme for this module.
If cache_key is set, must not be NULL. */
const char *default_pass_scheme;
- /* Supported authentication mechanisms, NULL is all, [NULL] is none*/
- const char *const *mechanisms;
- /* Username filter, NULL is no filter */
- const char *const *username_filter;
/* If blocking is set to TRUE, use child processes to access
this passdb. */