Mercurial > dovecot > original-hg > dovecot-1.2
changeset 5232:7e26736a9fba HEAD
After calling sasl_callback() the client may be destroyed already. Don't try
to modify it.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 07 Mar 2007 01:59:43 +0200 |
parents | f5c23985f946 |
children | 359a8f31aa9b |
files | src/login-common/sasl-server.c |
diffstat | 1 files changed, 22 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/login-common/sasl-server.c Wed Mar 07 01:43:27 2007 +0200 +++ b/src/login-common/sasl-server.c Wed Mar 07 01:59:43 2007 +0200 @@ -22,12 +22,26 @@ return auth_flags; } +static void +call_client_callback(struct client *client, enum sasl_server_reply reply, + const char *data, const char *const *args) +{ + sasl_server_callback_t *sasl_callback; + + i_assert(reply != SASL_SERVER_REPLY_CONTINUE); + + sasl_callback = client->sasl_callback; + client->sasl_callback = NULL; + + sasl_callback(client, reply, data, args); + /* NOTE: client may be destroyed now */ +} + static void master_callback(struct client *client, bool success) { client->authenticating = FALSE; - client->sasl_callback(client, success ? SASL_SERVER_REPLY_SUCCESS : - SASL_SERVER_REPLY_MASTER_FAILED, NULL, NULL); - client->sasl_callback = NULL; + call_client_callback(client, success ? SASL_SERVER_REPLY_SUCCESS : + SASL_SERVER_REPLY_MASTER_FAILED, NULL, NULL); } static void authenticate_callback(struct auth_request *request, int status, @@ -70,9 +84,8 @@ if (nologin) { client->authenticating = FALSE; - client->sasl_callback(client, SASL_SERVER_REPLY_SUCCESS, - NULL, args); - client->sasl_callback = NULL; + call_client_callback(client, SASL_SERVER_REPLY_SUCCESS, + NULL, args); } else { master_request_login(client, master_callback, auth_client_request_get_server_pid(request), @@ -94,9 +107,8 @@ } client->authenticating = FALSE; - client->sasl_callback(client, SASL_SERVER_REPLY_AUTH_FAILED, - NULL, args); - client->sasl_callback = NULL; + call_client_callback(client, SASL_SERVER_REPLY_AUTH_FAILED, + NULL, args); break; } } @@ -168,8 +180,7 @@ client->auth_request = NULL; } - client->sasl_callback(client, reply, reason, NULL); - client->sasl_callback = NULL; + call_client_callback(client, reply, reason, NULL); } void sasl_server_auth_failed(struct client *client, const char *reason)