[SCM] SAMBA-CTDB repository - branch v3-2-ctdb updated - build_3.2.11_ctdb.61-5-g61e9d5f

Michael Adam obnox at samba.org
Wed May 27 23:33:00 GMT 2009


The branch, v3-2-ctdb has been updated
       via  61e9d5fbed30460dd0b014f5874d4a50eb5c2799 (commit)
       via  ddf426f231a5ecae0a42bef239242fba1c0d6183 (commit)
       via  95de020a231c6277fcedb6c6dc2e11949e528f13 (commit)
      from  6fc2ebd6f83dc8927cead6a4f67c410fdbadbdf9 (commit)

http://gitweb.samba.org/?p=obnox/samba-ctdb.git;a=shortlog;h=v3-2-ctdb


- Log -----------------------------------------------------------------
commit 61e9d5fbed30460dd0b014f5874d4a50eb5c2799
Author: Michael Adam <obnox at samba.org>
Date:   Wed May 27 19:25:44 2009 +0200

    s3:idmap_ldap: filter out of range mappings in default idmap config
    
    This fixes bug #6417
    
    Michael
    (cherry picked from commit e381c13b023f2b512b3f6aec133db9f323bc8132)

commit ddf426f231a5ecae0a42bef239242fba1c0d6183
Author: Michael Adam <obnox at samba.org>
Date:   Wed May 27 19:24:03 2009 +0200

    s3:idmap_tdb2: filter out of range mappings in default idmap config
    
    This fixes bug #6416
    
    Michael
    (cherry picked from commit e12670a1053edf57af137026bd3fdb9fc7dfb0b2)

commit 95de020a231c6277fcedb6c6dc2e11949e528f13
Author: Michael Adam <obnox at samba.org>
Date:   Wed May 27 19:12:28 2009 +0200

    s3:idmap_tdb: filter out of range mappings in default idmap config
    
    This fixes bug #6415
    
    Michael
    (cherry picked from commit 3d3f39838261ddc401053dadcc5bd8e6317a3a8e)

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

Summary of changes:
 source/winbindd/idmap_ldap.c |   71 +++++++++++++++++++++++++++++++---------
 source/winbindd/idmap_tdb.c  |   73 ++++++++++++++++++++++++++++++++---------
 source/winbindd/idmap_tdb2.c |   61 ++++++++++++++++++++++++++++-------
 3 files changed, 161 insertions(+), 44 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/winbindd/idmap_ldap.c b/source/winbindd/idmap_ldap.c
index 7224589..7a0e32b 100644
--- a/source/winbindd/idmap_ldap.c
+++ b/source/winbindd/idmap_ldap.c
@@ -765,7 +765,6 @@ static NTSTATUS idmap_ldap_db_init(struct idmap_domain *dom,
 	NTSTATUS ret;
 	struct idmap_ldap_context *ctx = NULL;
 	char *config_option = NULL;
-	const char *range = NULL;
 	const char *tmp = NULL;
 
 	/* Only do init if we are online */
@@ -779,23 +778,63 @@ static NTSTATUS idmap_ldap_db_init(struct idmap_domain *dom,
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	config_option = talloc_asprintf(ctx, "idmap config %s", dom->name);
-	if ( ! config_option) {
-		DEBUG(0, ("Out of memory!\n"));
-		ret = NT_STATUS_NO_MEMORY;
-		goto done;
-	}
+	if (strequal(dom->name, "*")) {
+		uid_t low_uid = 0;
+		uid_t high_uid = 0;
+		gid_t low_gid = 0;
+		gid_t high_gid = 0;
 
-	/* load ranges */
-	range = lp_parm_const_string(-1, config_option, "range", NULL);
-	if (range && range[0]) {
-		if ((sscanf(range, "%u - %u", &ctx->filter_low_id,
-						&ctx->filter_high_id) != 2) ||
-		    (ctx->filter_low_id > ctx->filter_high_id)) {
-			DEBUG(1, ("ERROR: invalid filter range [%s]", range));
-			ctx->filter_low_id = 0;
-			ctx->filter_high_id = 0;
+		ctx->filter_low_id = 0;
+		ctx->filter_high_id = 0;
+
+		if (lp_idmap_uid(&low_uid, &high_uid)) {
+			ctx->filter_low_id = low_uid;
+			ctx->filter_high_id = high_uid;
+		} else {
+			DEBUG(3, ("Warning: 'idmap uid' not set!\n"));
+		}
+
+		if (lp_idmap_gid(&low_gid, &high_gid)) {
+			if ((low_gid != low_uid) || (high_gid != high_uid)) {
+				DEBUG(1, ("Warning: 'idmap uid' and 'idmap gid'"
+				      " ranges do not agree -- building "
+				      "intersection\n"));
+				ctx->filter_low_id = MAX(ctx->filter_low_id,
+							 low_gid);
+				ctx->filter_high_id = MIN(ctx->filter_high_id,
+							  high_gid);
+			}
+		} else {
+			DEBUG(3, ("Warning: 'idmap gid' not set!\n"));
+		}
+	} else {
+		const char *range = NULL;
+
+		config_option = talloc_asprintf(ctx, "idmap config %s", dom->name);
+		if ( ! config_option) {
+			DEBUG(0, ("Out of memory!\n"));
+			ret = NT_STATUS_NO_MEMORY;
+			goto done;
 		}
+
+		/* load ranges */
+		range = lp_parm_const_string(-1, config_option, "range", NULL);
+		if (range && range[0]) {
+			if ((sscanf(range, "%u - %u", &ctx->filter_low_id,
+							&ctx->filter_high_id) != 2))
+			{
+				DEBUG(1, ("ERROR: invalid filter range [%s]", range));
+				ctx->filter_low_id = 0;
+				ctx->filter_high_id = 0;
+			}
+		}
+	}
+
+	if (ctx->filter_low_id > ctx->filter_high_id) {
+		DEBUG(1, ("ERROR: invalid filter range [%u-%u]",
+		      ctx->filter_low_id, ctx->filter_high_id));
+		ctx->filter_low_id = 0;
+		ctx->filter_high_id = 0;
 	}
 
 	if (params != NULL) {
diff --git a/source/winbindd/idmap_tdb.c b/source/winbindd/idmap_tdb.c
index 9e66eed..847b129 100644
--- a/source/winbindd/idmap_tdb.c
+++ b/source/winbindd/idmap_tdb.c
@@ -569,8 +569,6 @@ static NTSTATUS idmap_tdb_db_init(struct idmap_domain *dom, const char *params)
 {
 	NTSTATUS ret;
 	struct idmap_tdb_context *ctx;
-	char *config_option = NULL;
-	const char *range;
 
 	ctx = talloc(dom, struct idmap_tdb_context);
 	if ( ! ctx) {
@@ -578,29 +576,72 @@ static NTSTATUS idmap_tdb_db_init(struct idmap_domain *dom, const char *params)
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	config_option = talloc_asprintf(ctx, "idmap config %s", dom->name);
-	if ( ! config_option) {
-		DEBUG(0, ("Out of memory!\n"));
-		ret = NT_STATUS_NO_MEMORY;
-		goto failed;
-	}
+	if (strequal(dom->name, "*")) {
+		uid_t low_uid = 0;
+		uid_t high_uid = 0;
+		gid_t low_gid = 0;
+		gid_t high_gid = 0;
 
-	ret = idmap_tdb_open_db(ctx, &ctx->tdb);
-	if ( ! NT_STATUS_IS_OK(ret)) {
-		goto failed;
+		ctx->filter_low_id = 0;
+		ctx->filter_high_id = 0;
+
+		if (lp_idmap_uid(&low_uid, &high_uid)) {
+			ctx->filter_low_id = low_uid;
+			ctx->filter_high_id = high_uid;
+		} else {
+			DEBUG(3, ("Warning: 'idmap uid' not set!\n"));
+		}
+
+		if (lp_idmap_gid(&low_gid, &high_gid)) {
+			if ((low_gid != low_uid) || (high_gid != high_uid)) {
+				DEBUG(1, ("Warning: 'idmap uid' and 'idmap gid'"
+				      " ranges do not agree -- building "
+				      "intersection\n"));
+				ctx->filter_low_id = MAX(ctx->filter_low_id,
+							 low_gid);
+				ctx->filter_high_id = MIN(ctx->filter_high_id,
+							  high_gid);
+			}
+		} else {
+			DEBUG(3, ("Warning: 'idmap gid' not set!\n"));
+		}
+	} else {
+		char *config_option = NULL;
+		const char *range;
+
+		config_option = talloc_asprintf(ctx, "idmap config %s", dom->name);
+		if ( ! config_option) {
+			DEBUG(0, ("Out of memory!\n"));
+			ret = NT_STATUS_NO_MEMORY;
+			goto failed;
+		}
+
+		range = lp_parm_const_string(-1, config_option, "range", NULL);
+		if (( ! range) ||
+		    (sscanf(range, "%u - %u", &ctx->filter_low_id, &ctx->filter_high_id) != 2))
+		{
+			ctx->filter_low_id = 0;
+			ctx->filter_high_id = 0;
+		}
+
+		talloc_free(config_option);
 	}
 
-	range = lp_parm_const_string(-1, config_option, "range", NULL);
-	if (( ! range) ||
-	    (sscanf(range, "%u - %u", &ctx->filter_low_id, &ctx->filter_high_id) != 2) ||
-	    (ctx->filter_low_id > ctx->filter_high_id)) {
+	if (ctx->filter_low_id > ctx->filter_high_id) {
 		ctx->filter_low_id = 0;
 		ctx->filter_high_id = 0;
 	}
 
+	DEBUG(10, ("idmap_tdb_db_init: filter range %u-%u loaded for domain "
+	      "'%s'\n", ctx->filter_low_id, ctx->filter_high_id, dom->name));
+
+	ret = idmap_tdb_open_db(ctx, &ctx->tdb);
+	if ( ! NT_STATUS_IS_OK(ret)) {
+		goto failed;
+	}
+
 	dom->private_data = ctx;
 
-	talloc_free(config_option);
 	return NT_STATUS_OK;
 
 failed:
diff --git a/source/winbindd/idmap_tdb2.c b/source/winbindd/idmap_tdb2.c
index 8bde963..8301bf2 100644
--- a/source/winbindd/idmap_tdb2.c
+++ b/source/winbindd/idmap_tdb2.c
@@ -342,8 +342,6 @@ static NTSTATUS idmap_tdb2_db_init(struct idmap_domain *dom,
 {
 	NTSTATUS ret;
 	struct idmap_tdb2_context *ctx;
-	char *config_option = NULL;
-	const char *range;
 	NTSTATUS status;
 
 	status = idmap_tdb2_open_db();
@@ -355,24 +353,63 @@ static NTSTATUS idmap_tdb2_db_init(struct idmap_domain *dom,
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	config_option = talloc_asprintf(ctx, "idmap config %s", dom->name);
-	if ( ! config_option) {
-		DEBUG(0, ("Out of memory!\n"));
-		ret = NT_STATUS_NO_MEMORY;
-		goto failed;
+	if (strequal(dom->name, "*")) {
+		uid_t low_uid = 0;
+		uid_t high_uid = 0;
+		gid_t low_gid = 0;
+		gid_t high_gid = 0;
+
+		ctx->filter_low_id = 0;
+		ctx->filter_high_id = 0;
+
+		if (lp_idmap_uid(&low_uid, &high_uid)) {
+			ctx->filter_low_id = low_uid;
+			ctx->filter_high_id = high_uid;
+		} else {
+			DEBUG(3, ("Warning: 'idmap uid' not set!\n"));
+		}
+
+		if (lp_idmap_gid(&low_gid, &high_gid)) {
+			if ((low_gid != low_uid) || (high_gid != high_uid)) {
+				DEBUG(1, ("Warning: 'idmap uid' and 'idmap gid'"
+				      " ranges do not agree -- building "
+				      "intersection\n"));
+				ctx->filter_low_id = MAX(ctx->filter_low_id,
+							 low_gid);
+				ctx->filter_high_id = MIN(ctx->filter_high_id,
+							  high_gid);
+			}
+		} else {
+			DEBUG(3, ("Warning: 'idmap gid' not set!\n"));
+		}
+	} else {
+		char *config_option = NULL;
+		const char *range;
+		config_option = talloc_asprintf(ctx, "idmap config %s", dom->name);
+		if ( ! config_option) {
+			DEBUG(0, ("Out of memory!\n"));
+			ret = NT_STATUS_NO_MEMORY;
+			goto failed;
+		}
+
+		range = lp_parm_const_string(-1, config_option, "range", NULL);
+		if (( ! range) ||
+		    (sscanf(range, "%u - %u", &ctx->filter_low_id, &ctx->filter_high_id) != 2))
+		{
+			ctx->filter_low_id = 0;
+			ctx->filter_high_id = 0;
+		}
+
+		talloc_free(config_option);
 	}
 
-	range = lp_parm_const_string(-1, config_option, "range", NULL);
-	if (( ! range) ||
-	    (sscanf(range, "%u - %u", &ctx->filter_low_id, &ctx->filter_high_id) != 2) ||
-	    (ctx->filter_low_id > ctx->filter_high_id)) {
+	if (ctx->filter_low_id > ctx->filter_high_id) {
 		ctx->filter_low_id = 0;
 		ctx->filter_high_id = 0;
 	}
 
 	dom->private_data = ctx;
 
-	talloc_free(config_option);
 	return NT_STATUS_OK;
 
 failed:


-- 
SAMBA-CTDB repository


More information about the samba-cvs mailing list