[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha6-523-g2c1d980

Michael Adam obnox at samba.org
Fri Feb 6 09:21:56 GMT 2009


The branch, master has been updated
       via  2c1d980abebef1748627bd953b0661f6d711b5cb (commit)
       via  e0f91c89300a737f774d806d6c5ec3de3486d7f7 (commit)
       via  2125777803cf4b9f259391e34847aafa4ce7668c (commit)
       via  30d08223e65d4b610dbfa59e2486a41c37b3b8b1 (commit)
       via  9c626e37cf74f94a35c0b03feaf6bec6e3604811 (commit)
       via  77b4437b123f50612e40d521fe3d5faf5932808b (commit)
       via  e4035ab304208ebb1876b1485291a048564b0c27 (commit)
       via  a9184d5c62c2c89cf473e189c8beeed6fa7da1b2 (commit)
      from  61f1747441ff43c1d9c99bbf69e218c1984834c7 (commit)

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


- Log -----------------------------------------------------------------
commit 2c1d980abebef1748627bd953b0661f6d711b5cb
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jan 26 13:28:15 2009 +0100

    s3:idmap_tdb2: untangle assignment and check in idmap_tdb2_alloc_load()
    
    Michael

commit e0f91c89300a737f774d806d6c5ec3de3486d7f7
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jan 26 13:12:41 2009 +0100

    s3:idmap_tdb2: factor lodaing of ranges out into idmap_tdb2_load_ranges()
    
    Michael

commit 2125777803cf4b9f259391e34847aafa4ce7668c
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jan 26 13:07:59 2009 +0100

    s3:idmap_tdb2: move together code that belongs together in idmap_tdb2_alloc_load
    
    Michael

commit 30d08223e65d4b610dbfa59e2486a41c37b3b8b1
Author: Michael Adam <obnox at samba.org>
Date:   Sat Jan 24 23:52:23 2009 +0100

    s3:idmap_tdb2: streamline idmap_tdb2_sid_to_id,
    
    adding tmp talloc ctx and removing a variable
    
    Michael

commit 9c626e37cf74f94a35c0b03feaf6bec6e3604811
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jan 26 13:17:49 2009 +0100

    s3:idmap_tdb: simplify talloc usage with temp context from talloc_stackframe
    
    Michael

commit 77b4437b123f50612e40d521fe3d5faf5932808b
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jan 26 13:03:28 2009 +0100

    s3:idmap_tdb: refactor out new function idmap_tdb_load_ranges()
    
    Michael

commit e4035ab304208ebb1876b1485291a048564b0c27
Author: Michael Adam <obnox at samba.org>
Date:   Sun Jan 25 00:48:34 2009 +0100

    s3:idmap_tdb: use transactions in idmap_tdb_allocate_id()
    
    Michael

commit a9184d5c62c2c89cf473e189c8beeed6fa7da1b2
Author: Michael Adam <obnox at samba.org>
Date:   Fri Jan 23 00:52:28 2009 +0100

    s3:idmap_tdb: add tmp talloc ctx to idmap_tdb_sid_to_id and remove an fstring
    
    Michael

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

Summary of changes:
 source3/winbindd/idmap_tdb.c  |   91 +++++++++++++++++++++++++----------------
 source3/winbindd/idmap_tdb2.c |   90 ++++++++++++++++++++++++-----------------
 2 files changed, 108 insertions(+), 73 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/winbindd/idmap_tdb.c b/source3/winbindd/idmap_tdb.c
index 481ac1b..3a64979 100644
--- a/source3/winbindd/idmap_tdb.c
+++ b/source3/winbindd/idmap_tdb.c
@@ -203,29 +203,21 @@ static bool idmap_tdb_upgrade(struct db_context *db)
 	return True;
 }
 
-static NTSTATUS idmap_tdb_open_db(TALLOC_CTX *memctx,
-				  bool check_config,
-				  struct db_context **dbctx)
+static NTSTATUS idmap_tdb_load_ranges(void)
 {
-	NTSTATUS ret;
-	TALLOC_CTX *ctx;
-	char *tdbfile = NULL;
-	struct db_context *db = NULL;
-	int32_t version;
 	uid_t low_uid = 0;
 	uid_t high_uid = 0;
 	gid_t low_gid = 0;
 	gid_t high_gid = 0;
-	bool config_error = false;
 
-	/* load ranges */
-	if (!lp_idmap_uid(&low_uid, &high_uid)
-	    || !lp_idmap_gid(&low_gid, &high_gid)) {
-		DEBUG(1, ("idmap uid or idmap gid missing\n"));
-		config_error = true;
-		if (check_config) {
-			return NT_STATUS_UNSUCCESSFUL;
-		}
+	if (!lp_idmap_uid(&low_uid, &high_uid)) {
+		DEBUG(1, ("idmap uid missing\n"));
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	if (!lp_idmap_gid(&low_gid, &high_gid)) {
+		DEBUG(1, ("idmap gid missing\n"));
+		return NT_STATUS_UNSUCCESSFUL;
 	}
 
 	idmap_tdb_state.low_uid = low_uid;
@@ -235,29 +227,41 @@ static NTSTATUS idmap_tdb_open_db(TALLOC_CTX *memctx,
 
 	if (idmap_tdb_state.high_uid <= idmap_tdb_state.low_uid) {
 		DEBUG(1, ("idmap uid range missing or invalid\n"));
-		config_error = true;
-		if (check_config) {
-			return NT_STATUS_UNSUCCESSFUL;
-		}
+		return NT_STATUS_UNSUCCESSFUL;
 	}
 
 	if (idmap_tdb_state.high_gid <= idmap_tdb_state.low_gid) {
 		DEBUG(1, ("idmap gid range missing or invalid\n"));
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return NT_STATUS_OK;
+}
+
+static NTSTATUS idmap_tdb_open_db(TALLOC_CTX *memctx,
+				  bool check_config,
+				  struct db_context **dbctx)
+{
+	NTSTATUS ret;
+	TALLOC_CTX *ctx;
+	char *tdbfile = NULL;
+	struct db_context *db = NULL;
+	int32_t version;
+	bool config_error = false;
+
+	ret = idmap_tdb_load_ranges();
+	if (!NT_STATUS_IS_OK(ret)) {
 		config_error = true;
 		if (check_config) {
-			return NT_STATUS_UNSUCCESSFUL;
+			return ret;
 		}
 	}
 
 	/* use our own context here */
-	ctx = talloc_new(memctx);
-	if (!ctx) {
-		DEBUG(0, ("Out of memory!\n"));
-		return NT_STATUS_NO_MEMORY;
-	}
+	ctx = talloc_stackframe();
 
 	/* use the old database if present */
-	tdbfile = talloc_strdup(ctx, state_path("winbindd_idmap.tdb"));
+	tdbfile = state_path("winbindd_idmap.tdb");
 	if (!tdbfile) {
 		DEBUG(0, ("Out of memory!\n"));
 		ret = NT_STATUS_NO_MEMORY;
@@ -402,6 +406,7 @@ static NTSTATUS idmap_tdb_allocate_id(struct unixid *xid)
 	const char *hwmtype;
 	uint32_t high_hwm;
 	uint32_t hwm;
+	int res;
 
 	/* Get current high water mark */
 	switch (xid->type) {
@@ -423,7 +428,14 @@ static NTSTATUS idmap_tdb_allocate_id(struct unixid *xid)
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
+	res = idmap_alloc_db->transaction_start(idmap_alloc_db);
+	if (res != 0) {
+		DEBUG(1, (__location__ " Failed to start transaction.\n"));
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
 	if ((hwm = dbwrap_fetch_int32(idmap_alloc_db, hwmkey)) == -1) {
+		idmap_alloc_db->transaction_cancel(idmap_alloc_db);
 		return NT_STATUS_INTERNAL_DB_ERROR;
 	}
 
@@ -431,6 +443,7 @@ static NTSTATUS idmap_tdb_allocate_id(struct unixid *xid)
 	if (hwm > high_hwm) {
 		DEBUG(1, ("Fatal Error: %s range full!! (max: %lu)\n", 
 			  hwmtype, (unsigned long)high_hwm));
+		idmap_alloc_db->transaction_cancel(idmap_alloc_db);
 		return NT_STATUS_UNSUCCESSFUL;
 	}
 
@@ -438,6 +451,7 @@ static NTSTATUS idmap_tdb_allocate_id(struct unixid *xid)
 	ret = dbwrap_change_uint32_atomic(idmap_alloc_db, hwmkey, &hwm, 1);
 	if (ret != 0) {
 		DEBUG(0, ("Fatal error while fetching a new %s value\n!", hwmtype));
+		idmap_alloc_db->transaction_cancel(idmap_alloc_db);
 		return NT_STATUS_UNSUCCESSFUL;
 	}
 
@@ -445,9 +459,16 @@ static NTSTATUS idmap_tdb_allocate_id(struct unixid *xid)
 	if (hwm > high_hwm) {
 		DEBUG(1, ("Fatal Error: %s range full!! (max: %lu)\n", 
 			  hwmtype, (unsigned long)high_hwm));
+		idmap_alloc_db->transaction_cancel(idmap_alloc_db);
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	res = idmap_alloc_db->transaction_commit(idmap_alloc_db);
+	if (res != 0) {
+		DEBUG(1, (__location__ " Failed to commit transaction.\n"));
 		return NT_STATUS_UNSUCCESSFUL;
 	}
-	
+
 	xid->id = hwm;
 	DEBUG(10,("New %s = %d\n", hwmtype, hwm));
 
@@ -694,10 +715,10 @@ static NTSTATUS idmap_tdb_sid_to_id(struct idmap_tdb_context *ctx, struct id_map
 	TDB_DATA data;
 	char *keystr;
 	unsigned long rec_id = 0;
-	fstring tmp;
+	TALLOC_CTX *tmp_ctx = talloc_stackframe();
 
-	if ((keystr = talloc_asprintf(
-		     ctx, "%s", sid_to_fstring(tmp, map->sid))) == NULL) {
+	keystr = sid_string_talloc(tmp_ctx, map->sid);
+	if (keystr == NULL) {
 		DEBUG(0, ("Out of memory!\n"));
 		ret = NT_STATUS_NO_MEMORY;
 		goto done;
@@ -706,7 +727,7 @@ static NTSTATUS idmap_tdb_sid_to_id(struct idmap_tdb_context *ctx, struct id_map
 	DEBUG(10,("Fetching record %s\n", keystr));
 
 	/* Check if sid is present in database */
-	data = dbwrap_fetch_bystring(ctx->db, NULL, keystr);
+	data = dbwrap_fetch_bystring(ctx->db, tmp_ctx, keystr);
 	if (!data.dptr) {
 		DEBUG(10,("Record %s not found\n", keystr));
 		ret = NT_STATUS_NONE_MAPPED;
@@ -730,8 +751,6 @@ static NTSTATUS idmap_tdb_sid_to_id(struct idmap_tdb_context *ctx, struct id_map
 		DEBUG(2, ("Found INVALID record %s -> %s\n", keystr, (const char *)data.dptr));
 		ret = NT_STATUS_INTERNAL_DB_ERROR;
 	}
-	
-	TALLOC_FREE(data.dptr);
 
 	/* apply filters before returning result */
 	if ((ctx->filter_low_id && (map->xid.id < ctx->filter_low_id)) ||
@@ -742,7 +761,7 @@ static NTSTATUS idmap_tdb_sid_to_id(struct idmap_tdb_context *ctx, struct id_map
 	}
 
 done:
-	talloc_free(keystr);
+	talloc_free(tmp_ctx);
 	return ret;
 }
 
diff --git a/source3/winbindd/idmap_tdb2.c b/source3/winbindd/idmap_tdb2.c
index 8bde963..fb90dd0 100644
--- a/source3/winbindd/idmap_tdb2.c
+++ b/source3/winbindd/idmap_tdb2.c
@@ -54,6 +54,43 @@ static struct db_context *idmap_tdb2;
 
 static NTSTATUS idmap_tdb2_alloc_load(void);
 
+static NTSTATUS idmap_tdb2_load_ranges(void)
+{
+	uid_t low_uid = 0;
+	uid_t high_uid = 0;
+	gid_t low_gid = 0;
+	gid_t high_gid = 0;
+
+	if (!lp_idmap_uid(&low_uid, &high_uid)) {
+		DEBUG(1, ("idmap uid missing\n"));
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	if (!lp_idmap_gid(&low_gid, &high_gid)) {
+		DEBUG(1, ("idmap gid missing\n"));
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	idmap_tdb2_state.low_uid = low_uid;
+	idmap_tdb2_state.high_uid = high_uid;
+	idmap_tdb2_state.low_gid = low_gid;
+	idmap_tdb2_state.high_gid = high_gid;
+
+	if (idmap_tdb2_state.high_uid <= idmap_tdb2_state.low_uid) {
+		DEBUG(1, ("idmap uid range missing or invalid\n"));
+		DEBUGADD(1, ("idmap will be unable to map foreign SIDs\n"));
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	if (idmap_tdb2_state.high_gid <= idmap_tdb2_state.low_gid) {
+		DEBUG(1, ("idmap gid range missing or invalid\n"));
+		DEBUGADD(1, ("idmap will be unable to map foreign SIDs\n"));
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return NT_STATUS_OK;
+}
+
 /*
   open the permanent tdb
  */
@@ -94,10 +131,7 @@ static NTSTATUS idmap_tdb2_open_db(void)
 */
 static NTSTATUS idmap_tdb2_alloc_load(void)
 {
-	uid_t low_uid = 0;
-	uid_t high_uid = 0;
-	gid_t low_gid = 0;
-	gid_t high_gid = 0;
+	NTSTATUS status;
 	uint32 low_id;
 
 	/* see if a idmap script is configured */
@@ -111,27 +145,15 @@ static NTSTATUS idmap_tdb2_alloc_load(void)
 
 	/* load ranges */
 
-	/* Create high water marks for group and user id */
-	if (!lp_idmap_uid(&low_uid, &high_uid)
-	    || !lp_idmap_gid(&low_gid, &high_gid)) {
-		DEBUG(1, ("idmap uid or idmap gid missing\n"));
-		return NT_STATUS_UNSUCCESSFUL;
+	status = idmap_tdb2_load_ranges();
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
 	}
 
-	idmap_tdb2_state.low_uid = low_uid;
-	idmap_tdb2_state.high_uid = high_uid;
-	idmap_tdb2_state.low_gid = low_gid;
-	idmap_tdb2_state.high_gid = high_gid;
-
-	if (idmap_tdb2_state.high_uid <= idmap_tdb2_state.low_uid) {
-		DEBUG(1, ("idmap uid range missing or invalid\n"));
-		DEBUGADD(1, ("idmap will be unable to map foreign SIDs\n"));
-		return NT_STATUS_UNSUCCESSFUL;
-	}
+	/* Create high water marks for group and user id */
 
-	if (((low_id = dbwrap_fetch_int32(idmap_tdb2,
-					  HWM_USER)) == -1) ||
-	    (low_id < idmap_tdb2_state.low_uid)) {
+	low_id = dbwrap_fetch_int32(idmap_tdb2, HWM_USER);
+	if ((low_id == -1) || (low_id < idmap_tdb2_state.low_uid)) {
 		if (!NT_STATUS_IS_OK(dbwrap_trans_store_int32(
 					     idmap_tdb2, HWM_USER,
 					     idmap_tdb2_state.low_uid))) {
@@ -141,15 +163,8 @@ static NTSTATUS idmap_tdb2_alloc_load(void)
 		}
 	}
 
-	if (idmap_tdb2_state.high_gid <= idmap_tdb2_state.low_gid) {
-		DEBUG(1, ("idmap gid range missing or invalid\n"));
-		DEBUGADD(1, ("idmap will be unable to map foreign SIDs\n"));
-		return NT_STATUS_UNSUCCESSFUL;
-	}
-
-	if (((low_id = dbwrap_fetch_int32(idmap_tdb2,
-					  HWM_GROUP)) == -1) ||
-	    (low_id < idmap_tdb2_state.low_gid)) {
+	low_id = dbwrap_fetch_int32(idmap_tdb2, HWM_GROUP);
+	if ((low_id == -1) || (low_id < idmap_tdb2_state.low_gid)) {
 		if (!NT_STATUS_IS_OK(dbwrap_trans_store_int32(
 					     idmap_tdb2, HWM_GROUP,
 					     idmap_tdb2_state.low_gid))) {
@@ -557,12 +572,13 @@ static NTSTATUS idmap_tdb2_sid_to_id(struct idmap_tdb2_context *ctx, struct id_m
 	TDB_DATA data;
 	char *keystr;
 	unsigned long rec_id = 0;
-	NTSTATUS status;
+	TALLOC_CTX *tmp_ctx = talloc_stackframe();
 
-	status = idmap_tdb2_open_db();
-	NT_STATUS_NOT_OK_RETURN(status);
+	ret = idmap_tdb2_open_db();
+	NT_STATUS_NOT_OK_RETURN(ret);
 
-	if ((keystr = sid_string_talloc(ctx, map->sid)) == NULL) {
+	keystr = sid_string_talloc(tmp_ctx, map->sid);
+	if (keystr == NULL) {
 		DEBUG(0, ("Out of memory!\n"));
 		ret = NT_STATUS_NO_MEMORY;
 		goto done;
@@ -571,7 +587,7 @@ static NTSTATUS idmap_tdb2_sid_to_id(struct idmap_tdb2_context *ctx, struct id_m
 	DEBUG(10,("Fetching record %s\n", keystr));
 
 	/* Check if sid is present in database */
-	data = dbwrap_fetch_bystring(idmap_tdb2, keystr, keystr);
+	data = dbwrap_fetch_bystring(idmap_tdb2, tmp_ctx, keystr);
 	if (!data.dptr) {
 		fstring idstr;
 
@@ -626,7 +642,7 @@ static NTSTATUS idmap_tdb2_sid_to_id(struct idmap_tdb2_context *ctx, struct id_m
 	}
 
 done:
-	talloc_free(keystr);
+	talloc_free(tmp_ctx);
 	return ret;
 }
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list