[dovecot-cvs] dovecot/src/auth auth-client-connection.c,1.1,1.2
mech-anonymous.c,1.2,1.3 mech-cyrus-sasl2.c,1.3,1.4
mech-digest-md5.c,1.13,1.14 mech-plain.c,1.14,1.15 mech.c,1.12,1.13
mech.h,1.10,1.11 passdb-ldap.c,1.7,1.8 passdb-pam.c,1.9,1.10
cras at procontrol.fi
cras at procontrol.fi
Fri Aug 22 08:57:52 EEST 2003
Update of /home/cvs/dovecot/src/auth
In directory danu:/tmp/cvs-serv14732/auth
Modified Files:
auth-client-connection.c mech-anonymous.c mech-cyrus-sasl2.c
mech-digest-md5.c mech-plain.c mech.c mech.h passdb-ldap.c
passdb-pam.c
Log Message:
Fixed crash if login process connection died while there were some auth
requests.
Index: auth-client-connection.c
===================================================================
RCS file: /home/cvs/dovecot/src/auth/auth-client-connection.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- auth-client-connection.c 22 Aug 2003 02:42:13 -0000 1.1
+++ auth-client-connection.c 22 Aug 2003 04:57:49 -0000 1.2
@@ -212,7 +212,8 @@
{
struct auth_request *auth_request = value;
- auth_request->auth_free(auth_request);
+ auth_request->conn = NULL;
+ auth_request_unref(auth_request);
}
void auth_client_connection_destroy(struct auth_client_connection *conn)
Index: mech-anonymous.c
===================================================================
RCS file: /home/cvs/dovecot/src/auth/mech-anonymous.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- mech-anonymous.c 22 Aug 2003 02:42:13 -0000 1.2
+++ mech-anonymous.c 22 Aug 2003 04:57:49 -0000 1.3
@@ -38,6 +38,7 @@
pool = pool_alloconly_create("anonymous_auth_request", 256);
auth_request = p_new(pool, struct auth_request, 1);
+ auth_request->refcount = 1;
auth_request->pool = pool;
auth_request->auth_continue = mech_anonymous_auth_continue;
auth_request->auth_free = mech_anonymous_auth_free;
Index: mech-cyrus-sasl2.c
===================================================================
RCS file: /home/cvs/dovecot/src/auth/mech-cyrus-sasl2.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- mech-cyrus-sasl2.c 24 Jun 2003 23:16:56 -0000 1.3
+++ mech-cyrus-sasl2.c 22 Aug 2003 04:57:49 -0000 1.4
@@ -195,6 +195,7 @@
pool = pool_alloconly_create("cyrus_sasl_auth_request", 256);
cyrus_request = p_new(pool, struct cyrus_auth_request, 1);
+ cyrus_request->auth_request.refcount = 1;
cyrus_request->auth_request.pool = pool;
cyrus_request->auth_request.auth_continue =
cyrus_sasl_auth_continue;
Index: mech-digest-md5.c
===================================================================
RCS file: /home/cvs/dovecot/src/auth/mech-digest-md5.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- mech-digest-md5.c 22 Aug 2003 02:42:13 -0000 1.13
+++ mech-digest-md5.c 22 Aug 2003 04:57:49 -0000 1.14
@@ -620,6 +620,7 @@
auth = p_new(pool, struct digest_auth_request, 1);
auth->pool = pool;
+ auth->auth_request.refcount = 1;
auth->auth_request.pool = pool;
auth->auth_request.auth_continue = mech_digest_md5_auth_continue;
auth->auth_request.auth_free = mech_digest_md5_auth_free;
Index: mech-plain.c
===================================================================
RCS file: /home/cvs/dovecot/src/auth/mech-plain.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- mech-plain.c 22 Aug 2003 02:42:13 -0000 1.14
+++ mech-plain.c 22 Aug 2003 04:57:49 -0000 1.15
@@ -91,6 +91,7 @@
pool = pool_alloconly_create("plain_auth_request", 256);
auth_request = p_new(pool, struct auth_request, 1);
+ auth_request->refcount = 1;
auth_request->pool = pool;
auth_request->auth_continue = mech_plain_auth_continue;
auth_request->auth_free = mech_plain_auth_free;
Index: mech.c
===================================================================
RCS file: /home/cvs/dovecot/src/auth/mech.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- mech.c 22 Aug 2003 02:42:13 -0000 1.12
+++ mech.c 22 Aug 2003 04:57:49 -0000 1.13
@@ -127,7 +127,7 @@
void mech_request_free(struct auth_client_connection *conn,
struct auth_request *auth_request, unsigned int id)
{
- auth_request->auth_free(auth_request);
+ auth_request_unref(auth_request);
hash_remove(conn->auth_requests, POINTER_CAST(id));
}
@@ -198,6 +198,20 @@
}
return TRUE;
+}
+
+void auth_request_ref(struct auth_request *request)
+{
+ request->refcount++;
+}
+
+int auth_request_unref(struct auth_request *request)
+{
+ if (--request->refcount > 0)
+ return TRUE;
+
+ request->auth_free(request);
+ return FALSE;
}
extern struct mech_module mech_plain;
Index: mech.h
===================================================================
RCS file: /home/cvs/dovecot/src/auth/mech.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- mech.h 22 Aug 2003 02:42:13 -0000 1.10
+++ mech.h 22 Aug 2003 04:57:49 -0000 1.11
@@ -10,6 +10,8 @@
struct auth_client_connection *conn);
struct auth_request {
+ int refcount;
+
pool_t pool;
char *user;
@@ -69,6 +71,9 @@
mech_cyrus_sasl_new(struct auth_client_connection *conn,
struct auth_client_request_new *request,
mech_callback_t *callback);
+
+void auth_request_ref(struct auth_request *request);
+int auth_request_unref(struct auth_request *request);
void mech_init(void);
void mech_deinit(void);
Index: passdb-ldap.c
===================================================================
RCS file: /home/cvs/dovecot/src/auth/passdb-ldap.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- passdb-ldap.c 19 Feb 2003 23:55:40 -0000 1.7
+++ passdb-ldap.c 22 Aug 2003 04:57:49 -0000 1.8
@@ -98,6 +98,11 @@
}
}
+ /* LDAP result is free'd now. we can check if auth_request is
+ even needed anymore */
+ if (!auth_request_unref(auth_request))
+ return;
+
scheme = password_get_scheme(&password);
if (scheme == NULL) {
scheme = conn->set.default_pass_scheme;
@@ -149,6 +154,7 @@
filter = str_c(str);
}
+ auth_request_ref(auth_request);
ldap_request->callback = handle_request;
ldap_request->context = auth_request;
Index: passdb-pam.c
===================================================================
RCS file: /home/cvs/dovecot/src/auth/passdb-pam.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- passdb-pam.c 25 Jun 2003 23:15:35 -0000 1.9
+++ passdb-pam.c 22 Aug 2003 04:57:49 -0000 1.10
@@ -288,7 +288,8 @@
}
}
- request->callback(result, request->request);
+ if (auth_request_unref(request->request))
+ request->callback(result, request->request);
if (close(request->fd) < 0)
i_error("PAM: close(child input) failed: %m");
@@ -360,6 +361,7 @@
if (close(fd[1]) < 0)
i_error("PAM: close(fd[1]) failed: %m");
+ auth_request_ref(request);
pam_auth_request = i_new(struct pam_auth_request, 1);
pam_auth_request->fd = fd[0];
pam_auth_request->request = request;
More information about the dovecot-cvs
mailing list