svn commit: samba r20150 - in branches/SAMBA_3_0/source: nsswitch script/tests

idra at samba.org idra at samba.org
Wed Dec 13 16:39:51 GMT 2006


Author: idra
Date: 2006-12-13 16:39:50 +0000 (Wed, 13 Dec 2006)
New Revision: 20150

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

Log:

better memory handling for some functions, make sure we don't
leak memory by using the wrong(long lived)  mem context


Modified:
   branches/SAMBA_3_0/source/nsswitch/idmap_rid.c
   branches/SAMBA_3_0/source/nsswitch/winbindd_async.c
   branches/SAMBA_3_0/source/nsswitch/winbindd_group.c
   branches/SAMBA_3_0/source/nsswitch/winbindd_util.c
   branches/SAMBA_3_0/source/script/tests/selftest.sh


Changeset:
Modified: branches/SAMBA_3_0/source/nsswitch/idmap_rid.c
===================================================================
--- branches/SAMBA_3_0/source/nsswitch/idmap_rid.c	2006-12-13 11:19:51 UTC (rev 20149)
+++ branches/SAMBA_3_0/source/nsswitch/idmap_rid.c	2006-12-13 16:39:50 UTC (rev 20150)
@@ -81,12 +81,12 @@
 	return ret;
 }
 
-static NTSTATUS idmap_rid_id_to_sid(struct idmap_rid_context *ctx, struct id_map *map)
+static NTSTATUS idmap_rid_id_to_sid(TALLOC_CTX *memctx, struct idmap_rid_context *ctx, struct id_map *map)
 {
 	char *domname, *name;
 	enum lsa_SidType sid_type;
 
-	if (!ctx || !map) {
+	if (!memctx || !ctx || !map) {
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
@@ -99,7 +99,7 @@
 
 	sid_compose(map->sid, &ctx->dom_sid, map->xid.id - ctx->low_id + ctx->base_rid);
 
-	if (winbindd_lookup_name_by_sid(ctx, map->sid, &domname, &name, &sid_type)) {
+	if (winbindd_lookup_name_by_sid(memctx, map->sid, &domname, &name, &sid_type)) {
 		switch (sid_type) {
 		case SID_NAME_USER:
 			if (map->xid.type != ID_TYPE_UID) {
@@ -136,13 +136,13 @@
  Single sid to id lookup function. 
 **********************************/
 
-static NTSTATUS idmap_rid_sid_to_id(struct idmap_rid_context *ctx, struct id_map *map)
+static NTSTATUS idmap_rid_sid_to_id(TALLOC_CTX *memctx, struct idmap_rid_context *ctx, struct id_map *map)
 {
 	char *domname, *name;
 	enum lsa_SidType sid_type;
 	uint32_t rid;
 
-	if (!ctx || !map) {
+	if (!memctx || !ctx || !map) {
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
@@ -150,7 +150,7 @@
 	map->xid.id = rid - ctx->base_rid + ctx->low_id;
 
 	/* check if this is a valid SID and set the type */
-	if (winbindd_lookup_name_by_sid(ctx, map->sid, &domname, &name, &sid_type)) {
+	if (winbindd_lookup_name_by_sid(memctx, map->sid, &domname, &name, &sid_type)) {
 		switch (sid_type) {
 		case SID_NAME_USER:
 			map->xid.type = ID_TYPE_UID;
@@ -188,17 +188,24 @@
 
 static NTSTATUS idmap_rid_unixids_to_sids(struct idmap_domain *dom, struct id_map **ids)
 {
-	struct idmap_rid_context *ctx;
+	struct idmap_rid_context *ridctx;
+	TALLOC_CTX *ctx;
 	NTSTATUS ret;
 	int i;
 
-	ctx = talloc_get_type(dom->private_data, struct idmap_rid_context);
+	ridctx = talloc_get_type(dom->private_data, struct idmap_rid_context);
 
+	ctx = talloc_new(dom);
+	if ( ! ctx) {
+		DEBUG(0, ("Out of memory!\n"));
+		return NT_STATUS_NO_MEMORY;
+	}
+
 	for (i = 0; ids[i]; i++) {
 		/* make sure it is marked as unmapped before resolveing */
 		ids[i]->mapped = False;
 
-		ret = idmap_rid_id_to_sid(ctx, ids[i]);
+		ret = idmap_rid_id_to_sid(ctx, ridctx, ids[i]);
 
 		if (( ! NT_STATUS_IS_OK(ret)) &&
 		    ( ! NT_STATUS_EQUAL(ret, NT_STATUS_NONE_MAPPED))) {
@@ -207,6 +214,7 @@
 		}
 	}
 
+	talloc_free(ctx);
 	return NT_STATUS_OK;
 }
 
@@ -216,17 +224,24 @@
 
 static NTSTATUS idmap_rid_sids_to_unixids(struct idmap_domain *dom, struct id_map **ids)
 {
-	struct idmap_rid_context *ctx;
+	struct idmap_rid_context *ridctx;
+	TALLOC_CTX *ctx;
 	NTSTATUS ret;
 	int i;
 
-	ctx = talloc_get_type(dom->private_data, struct idmap_rid_context);
+	ridctx = talloc_get_type(dom->private_data, struct idmap_rid_context);
 
+	ctx = talloc_new(dom);
+	if ( ! ctx) {
+		DEBUG(0, ("Out of memory!\n"));
+		return NT_STATUS_NO_MEMORY;
+	}
+
 	for (i = 0; ids[i]; i++) {
 		/* make sure it is marked as unmapped before resolveing */
 		ids[i]->mapped = False;
 
-		ret = idmap_rid_sid_to_id(ctx, ids[i]);
+		ret = idmap_rid_sid_to_id(ctx, ridctx, ids[i]);
 
 		if (( ! NT_STATUS_IS_OK(ret)) &&
 		    ( ! NT_STATUS_EQUAL(ret, NT_STATUS_NONE_MAPPED))) {
@@ -236,6 +251,7 @@
 		}
 	}
 
+	talloc_free(ctx);
 	return NT_STATUS_OK;
 }
 

Modified: branches/SAMBA_3_0/source/nsswitch/winbindd_async.c
===================================================================
--- branches/SAMBA_3_0/source/nsswitch/winbindd_async.c	2006-12-13 11:19:51 UTC (rev 20149)
+++ branches/SAMBA_3_0/source/nsswitch/winbindd_async.c	2006-12-13 16:39:50 UTC (rev 20150)
@@ -738,8 +738,8 @@
 {
 	enum lsa_SidType type;
 	DOM_SID sid;
-	char *name = NULL;
-	char *dom_name = NULL;
+	char *name;
+	char *dom_name;
 
 	/* Ensure null termination */
 	state->request.data.sid[sizeof(state->request.data.sid)-1]='\0';

Modified: branches/SAMBA_3_0/source/nsswitch/winbindd_group.c
===================================================================
--- branches/SAMBA_3_0/source/nsswitch/winbindd_group.c	2006-12-13 11:19:51 UTC (rev 20149)
+++ branches/SAMBA_3_0/source/nsswitch/winbindd_group.c	2006-12-13 16:39:50 UTC (rev 20150)
@@ -442,8 +442,8 @@
 {
 	struct winbindd_domain *domain;
 	enum lsa_SidType name_type;
-	char *dom_name = NULL;
-	char *group_name = NULL;
+	char *dom_name;
+	char *group_name;
 	size_t gr_mem_len;
 	size_t num_gr_mem;
 	char *gr_mem;

Modified: branches/SAMBA_3_0/source/nsswitch/winbindd_util.c
===================================================================
--- branches/SAMBA_3_0/source/nsswitch/winbindd_util.c	2006-12-13 11:19:51 UTC (rev 20149)
+++ branches/SAMBA_3_0/source/nsswitch/winbindd_util.c	2006-12-13 16:39:50 UTC (rev 20150)
@@ -718,6 +718,9 @@
 	NTSTATUS result;
 	struct winbindd_domain *domain;
 
+	*dom_name = NULL;
+	*name = NULL;
+
 	domain = find_lookup_domain_from_sid(sid);
 
 	if (!domain) {
@@ -736,7 +739,6 @@
 	}
 
 	*type = SID_NAME_UNKNOWN;
-	*name = talloc_strdup(mem_ctx, name_deadbeef);
         
 	return False;
 }

Modified: branches/SAMBA_3_0/source/script/tests/selftest.sh
===================================================================
--- branches/SAMBA_3_0/source/script/tests/selftest.sh	2006-12-13 11:19:51 UTC (rev 20149)
+++ branches/SAMBA_3_0/source/script/tests/selftest.sh	2006-12-13 16:39:50 UTC (rev 20150)
@@ -95,8 +95,6 @@
 	log file = $LOGDIR/log.%m
 	log level = 0
 
-	passdb backend = tdbsam
-
 	name resolve order = bcast
 EOF
 
@@ -108,6 +106,8 @@
 	interfaces = $TORTURE_INTERFACES
 	panic action = $SCRIPTDIR/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
 	include = $COMMONCONFFILE
+
+	passdb backend = tdbsam
 EOF
 
 cat >$SAMBA4CONFFILE<<EOF
@@ -126,6 +126,8 @@
 	panic action = $SCRIPTDIR/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
 	include = $COMMONCONFFILE
 
+	passdb backend = tdbsam
+
 	; Necessary to add the build farm hacks
 	add user script = /bin/false
 	add machine script = /bin/false



More information about the samba-cvs mailing list