svn commit: samba r11447 - in branches/SAMBA_4_0/source/ldap_server: .

tridge at samba.org tridge at samba.org
Tue Nov 1 23:44:02 GMT 2005


Author: tridge
Date: 2005-11-01 23:44:01 +0000 (Tue, 01 Nov 2005)
New Revision: 11447

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=11447

Log:

fixed a problem with the ldap server spinning using CPU time

Modified:
   branches/SAMBA_4_0/source/ldap_server/ldap_server.c


Changeset:
Modified: branches/SAMBA_4_0/source/ldap_server/ldap_server.c
===================================================================
--- branches/SAMBA_4_0/source/ldap_server/ldap_server.c	2005-11-01 23:29:02 UTC (rev 11446)
+++ branches/SAMBA_4_0/source/ldap_server/ldap_server.c	2005-11-01 23:44:01 UTC (rev 11447)
@@ -260,18 +260,18 @@
 	status = tls_socket_pending(conn->tls, &npending);
 	if (!NT_STATUS_IS_OK(status)) {
 		ldapsrv_terminate_connection(conn, "socket_pending() failed");
-		return;
+		goto done;
 	}
 	if (npending == 0) {
 		ldapsrv_terminate_connection(conn, "EOF from client");
-		return;
+		goto done;
 	}
 
 	conn->partial.data = talloc_realloc_size(conn, conn->partial.data, 
 						 conn->partial.length + npending);
 	if (conn->partial.data == NULL) {
 		ldapsrv_terminate_connection(conn, "out of memory");
-		return;
+		goto done;
 	}
 
 	/* receive the data */
@@ -279,14 +279,14 @@
 				 npending, &nread);
 	if (NT_STATUS_IS_ERR(status)) {
 		ldapsrv_terminate_connection(conn, "socket_recv() failed");
-		return;
+		goto done;
 	}
 	if (!NT_STATUS_IS_OK(status)) {
 		return;
 	}
 	if (nread == 0) {
 		ldapsrv_terminate_connection(conn, "EOF from client");
-		return;
+		goto done;
 	}
 	conn->partial.length += nread;
 
@@ -301,6 +301,7 @@
 
 	EVENT_FD_READABLE(c->event.fde);
 
+done:
 	if (conn->terminate) {
 		if (conn->tls) {
 			talloc_free(conn->tls);
@@ -328,7 +329,7 @@
 		}
 		if (!NT_STATUS_IS_OK(status)) {
 			ldapsrv_terminate_connection(conn, "socket_send error");
-			return;
+			goto done;
 		}
 
 		q->blob.data += nsent;
@@ -341,6 +342,7 @@
 		EVENT_FD_NOT_WRITEABLE(c->event.fde);
 	}
 
+done:
 	if (conn->terminate) {
 		if (conn->tls) {
 			talloc_free(conn->tls);
@@ -385,25 +387,25 @@
 				    c->event.fde, NULL, port != 389);
 	if (!conn->tls) {
 		ldapsrv_terminate_connection(conn, "ldapsrv_accept: tls_init_server() failed");
-		return;
+		goto done;
 	}
 
 	/* Connections start out anonymous */
 	if (!NT_STATUS_IS_OK(auth_anonymous_session_info(conn, &conn->session_info))) {
 		ldapsrv_terminate_connection(conn, "failed to setup anonymous session info");
-		return;
+		goto done;
 	}
 
 	rootDSE_part = talloc(conn, struct ldapsrv_partition);
 	if (rootDSE_part == NULL) {
 		ldapsrv_terminate_connection(conn, "talloc failed");
-		return;
 	}
 
 	rootDSE_part->base_dn = ""; /* RootDSE */
 	rootDSE_part->ops = ldapsrv_get_rootdse_partition_ops();
 	if (!NT_STATUS_IS_OK(rootDSE_part->ops->Init(rootDSE_part, conn))) {
 		ldapsrv_terminate_connection(conn, "rootDSE Init failed");
+		goto done;
 	}
 
 	conn->rootDSE = rootDSE_part;
@@ -412,19 +414,29 @@
 	part = talloc(conn, struct ldapsrv_partition);
 	if (part == NULL) {
 		ldapsrv_terminate_connection(conn, "talloc failed");
-		return;
+		goto done;
 	}
 
 	part->base_dn = "*"; /* default partition */
 	part->ops = ldapsrv_get_sldb_partition_ops();
 	if (!NT_STATUS_IS_OK(part->ops->Init(part, conn))) {
 		ldapsrv_terminate_connection(conn, "default partition Init failed");
+		goto done;
 	}
 
 	conn->default_partition = part;
 	DLIST_ADD_END(conn->partitions, part, struct ldapsrv_partition *);
 
 	irpc_add_name(c->msg_ctx, "ldap_server");
+
+done:
+	if (conn->terminate) {
+		if (conn->tls) {
+			talloc_free(conn->tls);
+			conn->tls = NULL;
+		}
+		stream_terminate_connection(conn->connection, conn->terminate);
+	}
 }
 
 static const struct stream_server_ops ldap_stream_ops = {



More information about the samba-cvs mailing list