File dovecot-2.2.25_ldap_bind.patch of Package dovecot22

diff --git a/src/auth/db-ldap.c b/src/auth/db-ldap.c
index be61e04..6a09809 100644
--- a/src/auth/db-ldap.c
+++ b/src/auth/db-ldap.c
@@ -993,7 +993,41 @@ static void ldap_connection_timeout(struct ldap_connection *conn)
 	db_ldap_conn_close(conn);
 }
 
-static int db_ldap_bind(struct ldap_connection *conn)
+#ifdef HAVE_LDAP_SASL
+static int db_ldap_bind_sasl(struct ldap_connection *conn)
+{
+	struct db_ldap_sasl_bind_context context;
+	int ret;
+
+	memset(&context, 0, sizeof(context));
+	context.authcid = conn->set.dn;
+	context.passwd = conn->set.dnpass;
+	context.realm = conn->set.sasl_realm;
+	context.authzid = conn->set.sasl_authz_id;
+
+	/* There doesn't seem to be a way to do SASL binding
+	   asynchronously.. */
+	ret = ldap_sasl_interactive_bind_s(conn->ld, NULL,
+					   conn->set.sasl_mech,
+					   NULL, NULL, LDAP_SASL_QUIET,
+					   sasl_interact, &context);
+	if (db_ldap_connect_finish(conn, ret) < 0)
+		return -1;
+	
+	conn->conn_state = LDAP_CONN_STATE_BOUND_DEFAULT;
+
+	return 0;
+}
+#else
+static int db_ldap_bind_sasl(struct ldap_connection *conn ATTR_UNUSED)
+{
+	i_unreached(); /* already checked at init */
+
+	return -1;
+}
+#endif
+
+static int db_ldap_bind_simple(struct ldap_connection *conn)
 {
 	int msgid;
 
@@ -1022,6 +1056,19 @@ static int db_ldap_bind(struct ldap_connection *conn)
 	return 0;
 }
 
+static int db_ldap_bind(struct ldap_connection *conn)
+{
+	if (conn->set.sasl_bind) {
+		if (db_ldap_bind_sasl(conn) < 0)
+			return -1;
+	} else {
+		if (db_ldap_bind_simple(conn) < 0)
+			return -1;
+	}
+
+	return 0;
+}
+
 static void db_ldap_get_fd(struct ldap_connection *conn)
 {
 	int ret;
@@ -1194,32 +1241,9 @@ int db_ldap_connect(struct ldap_connection *conn)
 #endif
 	}
 
-	if (conn->set.sasl_bind) {
-#ifdef HAVE_LDAP_SASL
-		struct db_ldap_sasl_bind_context context;
-
-		memset(&context, 0, sizeof(context));
-		context.authcid = conn->set.dn;
-		context.passwd = conn->set.dnpass;
-		context.realm = conn->set.sasl_realm;
-		context.authzid = conn->set.sasl_authz_id;
-
-		/* There doesn't seem to be a way to do SASL binding
-		   asynchronously.. */
-		ret = ldap_sasl_interactive_bind_s(conn->ld, NULL,
-						   conn->set.sasl_mech,
-						   NULL, NULL, LDAP_SASL_QUIET,
-						   sasl_interact, &context);
-		if (db_ldap_connect_finish(conn, ret) < 0)
-			return -1;
-#else
-		i_unreached(); /* already checked at init */
-#endif
-		conn->conn_state = LDAP_CONN_STATE_BOUND_DEFAULT;
-	} else {
-		if (db_ldap_bind(conn) < 0)
-			return -1;
-	}
+	if (db_ldap_bind(conn) < 0)
+		return -1;
+
 	if (debug) {
 		if (gettimeofday(&end, NULL) == 0) {
 			int msecs = timeval_diff_msecs(&end, &start);
openSUSE Build Service is sponsored by