]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: Optimize memory usage when auth_username_format is set
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 4 Aug 2020 11:35:49 +0000 (14:35 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Thu, 27 Aug 2020 06:20:17 +0000 (06:20 +0000)
The per-request memory pool was used unnecessarily to allocate the username
before the formatting was applied.

src/auth/auth-request-fields.c

index 53e01cd16b51b4a533c4b6908fd7c65731cf8079..67531112277c2a72d723181908a54fd4228b150e 100644 (file)
@@ -253,7 +253,7 @@ bool auth_request_import(struct auth_request *request,
        return TRUE;
 }
 
-static char *
+static const char *
 auth_request_fix_username(struct auth_request *request, const char *username,
                          const char **error_r)
 {
@@ -263,10 +263,10 @@ auth_request_fix_username(struct auth_request *request, const char *username,
 
        if (*set->default_realm != '\0' &&
            strchr(username, '@') == NULL) {
-               user = p_strconcat(request->pool, username, "@",
+               user = p_strconcat(unsafe_data_stack_pool, username, "@",
                                   set->default_realm, NULL);
        } else {
-               user = p_strdup(request->pool, username);
+               user = t_strdup_noconst(username);
        }
 
        for (p = (unsigned char *)user; *p != '\0'; p++) {
@@ -300,7 +300,7 @@ auth_request_fix_username(struct auth_request *request, const char *username,
                                "Failed to expand username_format=%s: %s",
                                set->username_format, error);
                }
-               user = p_strdup(request->pool, str_c(dest));
+               user = str_c_modifiable(dest);
        }
 
        if (user[0] == '\0') {
@@ -342,7 +342,8 @@ bool auth_request_set_username(struct auth_request *request,
                username = request->fields.user;
        }
 
-       request->fields.user = auth_request_fix_username(request, username, error_r);
+       request->fields.user = p_strdup(request->pool,
+               auth_request_fix_username(request, username, error_r));
        if (request->fields.user == NULL)
                return FALSE;
        if (request->fields.translated_username == NULL) {
@@ -385,8 +386,8 @@ bool auth_request_set_login_username(struct auth_request *request,
        }
        request->passdb = master_passdb;
 
-       request->fields.requested_login_user =
-               auth_request_fix_username(request, username, error_r);
+       request->fields.requested_login_user = p_strdup(request->pool,
+               auth_request_fix_username(request, username, error_r));
        if (request->fields.requested_login_user == NULL)
                return FALSE;