[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