[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Tue Nov 3 20:59:32 MST 2009


The branch, master has been updated
       via  c9571f7... s4:provisioning - Fixed minor bugs in provisioning tool and partition module.
       via  b5ce975... libcli/nbt Move more of lmhosts lookup into common code
       via  5a8f21c... lib/util Fix comments in rfc1738.c.
      from  ccdd146... s3-netlogon: make sure we protect some function codes in _netr_LogonControl2Ex().

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit c9571f7277b1cf68e034ec3482c5474885d9381f
Author: Endi S. Dewata <edewata at redhat.com>
Date:   Tue Nov 3 19:45:22 2009 -0600

    s4:provisioning - Fixed minor bugs in provisioning tool and partition module.

commit b5ce97511aa33aa439a371f114ba7bb0cf822a16
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Nov 3 14:15:07 2009 +1100

    libcli/nbt Move more of lmhosts lookup into common code
    
    This aims to eventually share this with Samba4.
    
    Andrew Bartlett

commit 5a8f21cb88e7579c12b3d97299f355bb64957a87
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Mon Nov 2 16:39:31 2009 +1100

    lib/util Fix comments in rfc1738.c.
    
    The Samba version does not use static buffers
    
    Andrew Bartlett

-----------------------------------------------------------------------

Summary of changes:
 lib/util/rfc1738.c                                 |    6 +-
 libcli/nbt/libnbt.h                                |    6 ++
 libcli/nbt/lmhosts.c                               |   79 ++++++++++++++++++++
 source3/libsmb/namequery.c                         |   60 ++++-----------
 source4/dsdb/samdb/ldb_modules/partition_init.c    |    4 +-
 source4/scripting/python/samba/provisionbackend.py |    3 +-
 6 files changed, 107 insertions(+), 51 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/util/rfc1738.c b/lib/util/rfc1738.c
index 1de3193..b45310a 100644
--- a/lib/util/rfc1738.c
+++ b/lib/util/rfc1738.c
@@ -158,7 +158,7 @@ rfc1738_do_escape(TALLOC_CTX *mem_ctx, const char *url, int encode_reserved)
 }
 
 /*
- * rfc1738_escape - Returns a static buffer that contains the RFC
+ * rfc1738_escape - Returns a buffer that contains the RFC
  * 1738 compliant, escaped version of the given url. (escapes unsafe and % characters)
  */
 char *
@@ -168,7 +168,7 @@ rfc1738_escape(TALLOC_CTX *mem_ctx, const char *url)
 }
 
 /*
- * rfc1738_escape_unescaped - Returns a static buffer that contains
+ * rfc1738_escape_unescaped - Returns a buffer that contains
  * the RFC 1738 compliant, escaped version of the given url (escapes unsafe chars only)
  */
 char *
@@ -178,7 +178,7 @@ rfc1738_escape_unescaped(TALLOC_CTX *mem_ctx, const char *url)
 }
 
 /*
- * rfc1738_escape_part - Returns a static buffer that contains the RFC
+ * rfc1738_escape_part - Returns a buffer that contains the RFC
  * 1738 compliant, escaped version of the given url segment. (escapes
  * unsafe, reserved and % chars) It would mangle the :// in http://,
  * and mangle paths (because of /).
diff --git a/libcli/nbt/libnbt.h b/libcli/nbt/libnbt.h
index 2abcb56..6d6a4a4 100644
--- a/libcli/nbt/libnbt.h
+++ b/libcli/nbt/libnbt.h
@@ -360,4 +360,10 @@ bool getlmhostsent(TALLOC_CTX *ctx, XFILE *fp, char **pp_name, int *name_type,
 		struct sockaddr_storage *pss);
 void endlmhosts(XFILE *fp);
 
+NTSTATUS resolve_lmhosts_file_as_sockaddr(const char *lmhosts_file, 
+					  const char *name, int name_type,
+					  TALLOC_CTX *mem_ctx, 
+					  struct sockaddr_storage **return_iplist,
+					  int *return_count);
+
 #endif /* __LIBNBT_H__ */
diff --git a/libcli/nbt/lmhosts.c b/libcli/nbt/lmhosts.c
index 11703a2..317ccc5 100644
--- a/libcli/nbt/lmhosts.c
+++ b/libcli/nbt/lmhosts.c
@@ -155,3 +155,82 @@ void endlmhosts(XFILE *fp)
 	x_fclose(fp);
 }
 
+/********************************************************
+ Resolve via "lmhosts" method.
+*********************************************************/
+
+NTSTATUS resolve_lmhosts_file_as_sockaddr(const char *lmhosts_file, 
+					  const char *name, int name_type,
+					  TALLOC_CTX *mem_ctx, 
+					  struct sockaddr_storage **return_iplist,
+					  int *return_count)
+{
+	/*
+	 * "lmhosts" means parse the local lmhosts file.
+	 */
+
+	XFILE *fp;
+	char *lmhost_name = NULL;
+	int name_type2;
+	struct sockaddr_storage return_ss;
+	NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND;
+	TALLOC_CTX *ctx = NULL;
+
+	*return_iplist = NULL;
+	*return_count = 0;
+
+	DEBUG(3,("resolve_lmhosts: "
+		"Attempting lmhosts lookup for name %s<0x%x>\n",
+		name, name_type));
+
+	fp = startlmhosts(lmhosts_file);
+
+	if ( fp == NULL )
+		return NT_STATUS_NO_SUCH_FILE;
+
+	ctx = talloc_new(mem_ctx);
+	if (!ctx) {
+		endlmhosts(fp);
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	while (getlmhostsent(ctx, fp, &lmhost_name, &name_type2, &return_ss)) {
+
+		if (!strequal(name, lmhost_name)) {
+			TALLOC_FREE(lmhost_name);
+			continue;
+		}
+
+		if ((name_type2 != -1) && (name_type != name_type2)) {
+			TALLOC_FREE(lmhost_name);
+			continue;
+		}
+		
+		*return_iplist = talloc_realloc(ctx, (*return_iplist), 
+						struct sockaddr_storage,
+						(*return_count)+1);
+
+		if ((*return_iplist) == NULL) {
+			TALLOC_FREE(ctx);
+			endlmhosts(fp);
+			DEBUG(3,("resolve_lmhosts: talloc_realloc fail !\n"));
+			return NT_STATUS_NO_MEMORY;
+		}
+
+		(*return_iplist)[*return_count] = return_ss;
+		*return_count += 1;
+
+		/* we found something */
+		status = NT_STATUS_OK;
+
+		/* Multiple names only for DC lookup */
+		if (name_type != 0x1c)
+			break;
+	}
+
+	talloc_steal(mem_ctx, *return_iplist);
+	TALLOC_FREE(ctx);
+	endlmhosts(fp);
+	return status;
+}
+
diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
index 930f0a5..a6fc612 100644
--- a/source3/libsmb/namequery.c
+++ b/source3/libsmb/namequery.c
@@ -1101,11 +1101,7 @@ static NTSTATUS resolve_lmhosts(const char *name, int name_type,
 	/*
 	 * "lmhosts" means parse the local lmhosts file.
 	 */
-
-	XFILE *fp;
-	char *lmhost_name = NULL;
-	int name_type2;
-	struct sockaddr_storage return_ss;
+	struct sockaddr_storage *ss_list;
 	NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND;
 	TALLOC_CTX *ctx = NULL;
 
@@ -1116,54 +1112,28 @@ static NTSTATUS resolve_lmhosts(const char *name, int name_type,
 		"Attempting lmhosts lookup for name %s<0x%x>\n",
 		name, name_type));
 
-	fp = startlmhosts(get_dyn_LMHOSTSFILE());
-
-	if ( fp == NULL )
-		return NT_STATUS_NO_SUCH_FILE;
-
 	ctx = talloc_init("resolve_lmhosts");
 	if (!ctx) {
-		endlmhosts(fp);
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	while (getlmhostsent(ctx, fp, &lmhost_name, &name_type2, &return_ss)) {
-
-		if (!strequal(name, lmhost_name)) {
-			TALLOC_FREE(lmhost_name);
-			continue;
-		}
-
-		if ((name_type2 != -1) && (name_type != name_type2)) {
-			TALLOC_FREE(lmhost_name);
-			continue;
-		}
-
-		*return_iplist = SMB_REALLOC_ARRAY((*return_iplist),
-					struct ip_service,
-					(*return_count)+1);
-
-		if ((*return_iplist) == NULL) {
-			TALLOC_FREE(ctx);
-			endlmhosts(fp);
-			DEBUG(3,("resolve_lmhosts: malloc fail !\n"));
+	status = resolve_lmhosts_file_as_sockaddr(get_dyn_LMHOSTSFILE(), 
+						  name, name_type, 
+						  ctx, 
+						  &ss_list, 
+						  return_count);
+	if (NT_STATUS_IS_OK(status)) {
+		if (convert_ss2service(return_iplist, 
+				       ss_list,
+				       *return_count)) {
+			talloc_free(ctx);
+			return NT_STATUS_OK;
+		} else {
+			talloc_free(ctx);
 			return NT_STATUS_NO_MEMORY;
 		}
-
-		(*return_iplist)[*return_count].ss = return_ss;
-		(*return_iplist)[*return_count].port = PORT_NONE;
-		*return_count += 1;
-
-		/* we found something */
-		status = NT_STATUS_OK;
-
-		/* Multiple names only for DC lookup */
-		if (name_type != 0x1c)
-			break;
 	}
-
-	TALLOC_FREE(ctx);
-	endlmhosts(fp);
+	talloc_free(ctx);
 	return status;
 }
 
diff --git a/source4/dsdb/samdb/ldb_modules/partition_init.c b/source4/dsdb/samdb/ldb_modules/partition_init.c
index f98b1d8..db99b75 100644
--- a/source4/dsdb/samdb/ldb_modules/partition_init.c
+++ b/source4/dsdb/samdb/ldb_modules/partition_init.c
@@ -132,7 +132,7 @@ static int partition_reload_metadata(struct ldb_module *module, struct partition
 	struct ldb_message *msg;
 	struct ldb_result *res;
 	struct ldb_context *ldb = ldb_module_get_ctx(module);
-	const char *attrs[] = { "partition", "replicateEntries", "modules", NULL };
+	const char *attrs[] = { "partition", "replicateEntries", "modules", "ldapBackend", NULL };
 	/* perform search for @PARTITION, looking for module, replicateEntries and ldapBackend */
 	ret = dsdb_module_search_dn(module, mem_ctx, &res, 
 				    ldb_dn_new(mem_ctx, ldb, DSDB_PARTITION_DN),
@@ -239,7 +239,7 @@ static int new_partition_from_dn(struct ldb_context *ldb, struct partition_priva
 	ctrl->version = DSDB_CONTROL_CURRENT_PARTITION_VERSION;
 	ctrl->dn = talloc_steal(ctrl, dn);
 	
-	ret = ldb_connect_backend(ldb, backend_url, NULL, &backend_module);
+	ret = ldb_connect_backend(ldb, (*partition)->backend_url, NULL, &backend_module);
 	if (ret != LDB_SUCCESS) {
 		return ret;
 	}
diff --git a/source4/scripting/python/samba/provisionbackend.py b/source4/scripting/python/samba/provisionbackend.py
index 8f1b94f..f809202 100644
--- a/source4/scripting/python/samba/provisionbackend.py
+++ b/source4/scripting/python/samba/provisionbackend.py
@@ -31,6 +31,7 @@ import sys
 import uuid
 import time
 import shutil
+import subprocess
 
 from samba import read_and_sub_file
 from samba import Ldb
@@ -203,7 +204,7 @@ class ProvisionBackend(object):
 
         self.slapd_command_escaped = "\'" + "\' \'".join(self.slapd_command) + "\'"
         setup_file(setup_path("ldap_backend_startup.sh"), paths.ldapdir + "/ldap_backend_startup.sh", {
-                "SLAPD_COMMAND" : slapd_command})
+                "SLAPD_COMMAND" : self.slapd_command_escaped})
 
         # Now start the slapd, so we can provision onto it.  We keep the
         # subprocess context around, to kill this off at the successful


-- 
Samba Shared Repository


More information about the samba-cvs mailing list