dovecot-2.1: lib-auth: Improved warning message about aborting a...
dovecot at dovecot.org
dovecot at dovecot.org
Fri Jan 20 16:37:20 EET 2012
details: http://hg.dovecot.org/dovecot-2.1/rev/3dae51fd4565
changeset: 13959:3dae51fd4565
user: Timo Sirainen <tss at iki.fi>
date: Fri Jan 20 16:37:10 2012 +0200
description:
lib-auth: Improved warning message about aborting auth requests.
diffstat:
src/lib-auth/auth-client-request.c | 7 ++++
src/lib-auth/auth-client-request.h | 1 +
src/lib-auth/auth-client.c | 4 +-
src/lib-auth/auth-client.h | 2 +-
src/lib-auth/auth-server-connection.c | 58 ++++++++++++++++++++++++----------
src/lib-auth/auth-server-connection.h | 3 +-
src/login-common/client-common.c | 2 +-
src/login-common/main.c | 2 +-
8 files changed, 55 insertions(+), 24 deletions(-)
diffs (278 lines):
diff -r 7175320feafc -r 3dae51fd4565 src/lib-auth/auth-client-request.c
--- a/src/lib-auth/auth-client-request.c Thu Jan 19 17:46:52 2012 +0200
+++ b/src/lib-auth/auth-client-request.c Fri Jan 20 16:37:10 2012 +0200
@@ -15,6 +15,7 @@
struct auth_server_connection *conn;
unsigned int id;
+ time_t created;
struct auth_request_info request_info;
@@ -91,6 +92,7 @@
request->id =
auth_server_connection_add_request(request->conn, request);
+ request->created = ioloop_time;
T_BEGIN {
auth_server_send_new_request(request->conn, request);
} T_END;
@@ -159,6 +161,11 @@
return request->callback == NULL;
}
+time_t auth_client_request_get_create_time(struct auth_client_request *request)
+{
+ return request->created;
+}
+
void auth_client_request_server_input(struct auth_client_request *request,
enum auth_request_status status,
const char *const *args)
diff -r 7175320feafc -r 3dae51fd4565 src/lib-auth/auth-client-request.h
--- a/src/lib-auth/auth-client-request.h Thu Jan 19 17:46:52 2012 +0200
+++ b/src/lib-auth/auth-client-request.h Fri Jan 20 16:37:10 2012 +0200
@@ -4,6 +4,7 @@
struct auth_server_connection;
bool auth_client_request_is_aborted(struct auth_client_request *request);
+time_t auth_client_request_get_create_time(struct auth_client_request *request);
void auth_client_request_server_input(struct auth_client_request *request,
enum auth_request_status status,
diff -r 7175320feafc -r 3dae51fd4565 src/lib-auth/auth-client.c
--- a/src/lib-auth/auth-client.c Thu Jan 19 17:46:52 2012 +0200
+++ b/src/lib-auth/auth-client.c Fri Jan 20 16:37:10 2012 +0200
@@ -37,9 +37,9 @@
auth_server_connection_connect(client->conn);
}
-void auth_client_disconnect(struct auth_client *client)
+void auth_client_disconnect(struct auth_client *client, const char *reason)
{
- auth_server_connection_disconnect(client->conn);
+ auth_server_connection_disconnect(client->conn, reason);
}
bool auth_client_is_connected(struct auth_client *client)
diff -r 7175320feafc -r 3dae51fd4565 src/lib-auth/auth-client.h
--- a/src/lib-auth/auth-client.h Thu Jan 19 17:46:52 2012 +0200
+++ b/src/lib-auth/auth-client.h Fri Jan 20 16:37:10 2012 +0200
@@ -61,7 +61,7 @@
void auth_client_deinit(struct auth_client **client);
void auth_client_connect(struct auth_client *client);
-void auth_client_disconnect(struct auth_client *client);
+void auth_client_disconnect(struct auth_client *client, const char *reason);
bool auth_client_is_connected(struct auth_client *client);
bool auth_client_is_disconnected(struct auth_client *client);
void auth_client_set_connect_notify(struct auth_client *client,
diff -r 7175320feafc -r 3dae51fd4565 src/lib-auth/auth-server-connection.c
--- a/src/lib-auth/auth-server-connection.c Thu Jan 19 17:46:52 2012 +0200
+++ b/src/lib-auth/auth-server-connection.c Fri Jan 20 16:37:10 2012 +0200
@@ -3,6 +3,7 @@
#include "lib.h"
#include "array.h"
#include "hash.h"
+#include "hostpid.h"
#include "ioloop.h"
#include "istream.h"
#include "ostream.h"
@@ -20,7 +21,8 @@
#define AUTH_SERVER_RECONNECT_TIMEOUT_SECS 5
static void
-auth_server_connection_reconnect(struct auth_server_connection *conn);
+auth_server_connection_reconnect(struct auth_server_connection *conn,
+ const char *disconnect_reason);
static int
auth_server_input_mech(struct auth_server_connection *conn,
@@ -235,7 +237,7 @@
static void auth_server_connection_input(struct auth_server_connection *conn)
{
struct istream *input;
- const char *line;
+ const char *line, *error;
int ret;
switch (i_stream_read(conn->input)) {
@@ -243,13 +245,15 @@
return;
case -1:
/* disconnected */
- auth_server_connection_reconnect(conn);
+ error = conn->input->stream_errno != 0 ?
+ strerror(conn->input->stream_errno) : "EOF";
+ auth_server_connection_reconnect(conn, error);
return;
case -2:
/* buffer full - can't happen unless auth is buggy */
i_error("BUG: Auth server sent us more than %d bytes of data",
AUTH_SERVER_CONN_MAX_LINE_LENGTH);
- auth_server_connection_disconnect(conn);
+ auth_server_connection_disconnect(conn, "buffer full");
return;
}
@@ -264,7 +268,8 @@
AUTH_CLIENT_PROTOCOL_MAJOR_VERSION)) {
i_error("Authentication server not compatible with "
"this client (mixed old and new binaries?)");
- auth_server_connection_disconnect(conn);
+ auth_server_connection_disconnect(conn,
+ "incompatible serevr");
return;
}
conn->version_received = TRUE;
@@ -278,7 +283,8 @@
} T_END;
if (ret < 0) {
- auth_server_connection_disconnect(conn);
+ auth_server_connection_disconnect(conn, t_strdup_printf(
+ "Received broken input: %s", line));
break;
}
}
@@ -303,31 +309,45 @@
}
static void
-auth_server_connection_remove_requests(struct auth_server_connection *conn)
+auth_server_connection_remove_requests(struct auth_server_connection *conn,
+ const char *disconnect_reason)
{
static const char *const temp_failure_args[] = { "temp", NULL };
struct hash_iterate_context *iter;
void *key, *value;
- unsigned int request_count = hash_table_count(conn->requests);
+ time_t created, oldest = 0;
+ unsigned int request_count = 0;
- if (request_count == 0)
+ if (hash_table_count(conn->requests) == 0)
return;
- i_warning("Auth connection closed with %u pending requests",
- request_count);
iter = hash_table_iterate_init(conn->requests);
while (hash_table_iterate(iter, &key, &value)) {
struct auth_client_request *request = value;
+ if (!auth_client_request_is_aborted(request)) {
+ request_count++;
+ created = auth_client_request_get_create_time(request);
+ if (oldest > created || oldest == 0)
+ oldest = created;
+ }
+
auth_client_request_server_input(request,
AUTH_REQUEST_STATUS_INTERNAL_FAIL,
temp_failure_args);
}
+
+ i_warning("Auth connection closed with %u pending requests "
+ "(max %u secs, pid=%s, %s)", request_count,
+ (unsigned int)(ioloop_time - oldest),
+ my_pid, disconnect_reason);
+
hash_table_iterate_deinit(&iter);
hash_table_clear(conn->requests, FALSE);
}
-void auth_server_connection_disconnect(struct auth_server_connection *conn)
+void auth_server_connection_disconnect(struct auth_server_connection *conn,
+ const char *reason)
{
conn->handshake_received = FALSE;
conn->version_received = FALSE;
@@ -350,7 +370,7 @@
conn->fd = -1;
}
- auth_server_connection_remove_requests(conn);
+ auth_server_connection_remove_requests(conn, reason);
if (conn->client->connect_notify_callback != NULL) {
conn->client->connect_notify_callback(conn->client, FALSE,
@@ -364,11 +384,12 @@
}
static void
-auth_server_connection_reconnect(struct auth_server_connection *conn)
+auth_server_connection_reconnect(struct auth_server_connection *conn,
+ const char *disconnect_reason)
{
time_t next_connect;
- auth_server_connection_disconnect(conn);
+ auth_server_connection_disconnect(conn, disconnect_reason);
next_connect = conn->last_connect + AUTH_SERVER_RECONNECT_TIMEOUT_SECS;
conn->to = timeout_add(ioloop_time >= next_connect ? 0 :
@@ -382,7 +403,7 @@
*_conn = NULL;
- auth_server_connection_disconnect(conn);
+ auth_server_connection_disconnect(conn, "deinitializing");
i_assert(hash_table_count(conn->requests) == 0);
hash_table_destroy(&conn->requests);
array_free(&conn->available_auth_mechs);
@@ -394,7 +415,7 @@
i_error("Timeout waiting for handshake from auth server. "
"my pid=%u, input bytes=%"PRIuUOFF_T,
conn->client->client_pid, conn->input->v_offset);
- auth_server_connection_reconnect(conn);
+ auth_server_connection_reconnect(conn, "auth server timeout");
}
int auth_server_connection_connect(struct auth_server_connection *conn)
@@ -434,7 +455,8 @@
conn->client->client_pid);
if (o_stream_send_str(conn->output, handshake) < 0) {
i_warning("Error sending handshake to auth server: %m");
- auth_server_connection_disconnect(conn);
+ auth_server_connection_disconnect(conn,
+ strerror(conn->output->last_failed_errno));
return -1;
}
diff -r 7175320feafc -r 3dae51fd4565 src/lib-auth/auth-server-connection.h
--- a/src/lib-auth/auth-server-connection.h Thu Jan 19 17:46:52 2012 +0200
+++ b/src/lib-auth/auth-server-connection.h Fri Jan 20 16:37:10 2012 +0200
@@ -31,7 +31,8 @@
void auth_server_connection_deinit(struct auth_server_connection **conn);
int auth_server_connection_connect(struct auth_server_connection *conn);
-void auth_server_connection_disconnect(struct auth_server_connection *conn);
+void auth_server_connection_disconnect(struct auth_server_connection *conn,
+ const char *reason);
unsigned int
auth_server_connection_add_request(struct auth_server_connection *conn,
diff -r 7175320feafc -r 3dae51fd4565 src/login-common/client-common.c
--- a/src/login-common/client-common.c Thu Jan 19 17:46:52 2012 +0200
+++ b/src/login-common/client-common.c Fri Jan 20 16:37:10 2012 +0200
@@ -162,7 +162,7 @@
authentication anymore, so close the connection.
do this only with initial service_count=1, in case there
are other clients with pending authentications */
- auth_client_disconnect(auth_client);
+ auth_client_disconnect(auth_client, "unnecessary connection");
}
login_client_destroyed();
login_refresh_proctitle();
diff -r 7175320feafc -r 3dae51fd4565 src/login-common/main.c
--- a/src/login-common/main.c Thu Jan 19 17:46:52 2012 +0200
+++ b/src/login-common/main.c Fri Jan 20 16:37:10 2012 +0200
@@ -73,7 +73,7 @@
{
i_assert(clients == NULL);
- auth_client_disconnect(auth_client);
+ auth_client_disconnect(auth_client, "idle disconnect");
timeout_remove(&auth_client_to);
}
More information about the dovecot-cvs
mailing list