[SCM] Samba Shared Repository - branch v3-2-stable updated - release-3-2-0pre2-680-g618de2b

Karolin Seeger kseeger at samba.org
Sat Apr 12 05:53:11 GMT 2008


The branch, v3-2-stable has been updated
       via  618de2b3f29f035ee99f74f8239a81c1e443e5f5 (commit)
       via  a9ecc125f8e4226967ad5828e493110a3176e5f7 (commit)
       via  fe987e5c62cbd2787454e58a464013f5cfa6e51b (commit)
       via  e5b90b8b526685182708d909f0fb8247618e6e86 (commit)
       via  848a3ac11384272e4a264e99efa92ea994976612 (commit)
       via  da57558ce133b7b5df89610ac02d053c3da6b58e (commit)
       via  d5996db8aa2dd66a7b16087d064f4c6ac3b526fb (commit)
       via  5923136308231bb8f285cd8d31a034517437555a (commit)
       via  603421903f7e6687171c1032e032dfc5e88b9abf (commit)
       via  de1b287f0b44729ed202f49453c12f1e76a3d2bc (commit)
       via  ef2a66947632cd5c2f2c0705cadd1319eee3816f (commit)
       via  7b5c3fe9a4cc73089f727eeb398f175b19cd749a (commit)
       via  0c736149eee918ea432d1644c37731f1b007a67e (commit)
       via  7e34011c0fdf59cdddc4da8c716db2f6ce9201fe (commit)
       via  70d7bbb688ea0b7a1d1bd4aeb4b5f424ddff15ef (commit)
       via  e84be843f24c51756fff71dd9f18b5d29a81d7f3 (commit)
       via  5388dbdf0aa1737a3b89401be939ac210066091a (commit)
       via  b446f57b350aa6cc193fe62a71204abb276916bb (commit)
       via  37da7773547cc85862f764dc965fbd7868f0dd5b (commit)
       via  f8bd28e3cd6d0acb007c00cbb1af327a72535eef (commit)
       via  4fa0481df70e99f7c353b4364b93af8dd359f453 (commit)
       via  120818ceb107f45ea865d311536b1b6e853d5b72 (commit)
       via  37c20c52b0a01a0874af257814d8ebfce760d2ab (commit)
       via  3a5c4aac177978ea42a8a491d4ab24c325b58b49 (commit)
       via  ed0d48be14a9be9b981e3f4931d805c59a540410 (commit)
       via  71dc26bc1ab2c63968dc343391b2d70468b6c896 (commit)
       via  8213cb9b8be0ea8ab2a10c7b441be850dd675bf7 (commit)
       via  a3cb130f9bbda44790cbf2a238ce34cf9eb4e449 (commit)
       via  26df5ce824b2c83370809df952010c1e30e70800 (commit)
       via  0dacb7a1ce9da5b0aff9b67a7e872981179be9d3 (commit)
       via  2df155429fe4acd94c46de7a8c8dfbd2832ae9f5 (commit)
       via  9fb165b8bf40bccfc219a564662d961620877d94 (commit)
       via  9d6ccc422409839a7f92085b92e966a99e3d68c9 (commit)
       via  7cc276a6d648e8bc82c58fdcbfa6bc669f073804 (commit)
       via  7aeb352197069c8adb2e05e670b3f4b806f1e2ad (commit)
      from  7f6b35f20c8906ca2bc7fa14d96ce17c793eb0bf (commit)

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


- Log -----------------------------------------------------------------
commit 618de2b3f29f035ee99f74f8239a81c1e443e5f5
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Apr 1 11:26:29 2008 +0200

    account_pol: use db_open_trans()
    
    metze
    (cherry picked from commit 888c2802b7bda92baae2dd0c1596f5e04bc3bfaa)

commit a9ecc125f8e4226967ad5828e493110a3176e5f7
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Mar 28 20:04:35 2008 +0100

    account_pol: use dbwrap_trans_store_uint32()
    
    metze
    (cherry picked from commit b1d63c8c1116f3429fb73aa6842105073385d1e8)

commit fe987e5c62cbd2787454e58a464013f5cfa6e51b
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Mar 28 12:09:56 2008 +0100

    Convert account_pol.tdb to dbwrap
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit 0b36871a0d795183f0e9dc78b654788b1988f06e)

commit e5b90b8b526685182708d909f0fb8247618e6e86
Author: Michael Adam <obnox at samba.org>
Date:   Mon Apr 7 23:36:29 2008 +0200

    dbwrap: fix more "tdb_chainunlock failed" messages
    
    TALLOC_FREE(rec) before transaction_cancel also in dbwrap_trans_delete().
    
    Michael
    (cherry picked from commit 04cd914a1f12691d27ddc67887a757cd813848a7)

commit 848a3ac11384272e4a264e99efa92ea994976612
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sun Mar 30 13:11:22 2008 +0200

    dbwrap: fix a confusing "tdb_chainunlock failed" message
    
    Unlock before we cancel the transaction...
    
    metze
    (cherry picked from commit d70a8e9c413a7d3993e0d11db5ae9cbc7fdb12c7)

commit da57558ce133b7b5df89610ac02d053c3da6b58e
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Mar 28 20:03:30 2008 +0100

    dbwrap: add dbwrap_trans_store_uint32()
    
    metze
    (cherry picked from commit 9e739b4c99a9aba5c5bb58f3b6a9fb949e24c581)

commit d5996db8aa2dd66a7b16087d064f4c6ac3b526fb
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Mar 28 12:02:28 2008 +0100

    Add dbwrap_trans_*_bystring
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit 2cf2684a11027431e6a93992413a5a5a697a4ba0)

commit 5923136308231bb8f285cd8d31a034517437555a
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Mar 28 11:57:54 2008 +0100

    Convert dbwrap_trans_delete to NTSTATUS
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit dead193f46c2b19955ab3e5ac5ba343694f4858a)

commit 603421903f7e6687171c1032e032dfc5e88b9abf
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Mar 28 11:53:00 2008 +0100

    Convert dbwrap_trans_store to NTSTATUS
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit 5f4de856af1abe63b13059bbe1615cb5877770d0)

commit de1b287f0b44729ed202f49453c12f1e76a3d2bc
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Mar 28 09:42:37 2008 +0100

    Add dbwrap_[fetch|store]_uint32
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit f1dd915ce802645166e0c8fc79d18d5ad41cfe7a)

commit ef2a66947632cd5c2f2c0705cadd1319eee3816f
Author: Michael Adam <obnox at samba.org>
Date:   Thu Mar 27 18:00:25 2008 +0100

    dbwrap: fix dbwrap_trans_[delete|store]() to stop when transaction_start() failed.
    
    Michael
    (cherry picked from commit ab0aaed907fef233998ff0841d30eabef3263ee8)

commit 7b5c3fe9a4cc73089f727eeb398f175b19cd749a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Mar 28 08:27:11 2008 +0100

    sharesec: use db_open_trans()
    
    metze
    (cherry picked from commit 1c59142ccc46616c10b98c51601361f203d542d6)

commit 0c736149eee918ea432d1644c37731f1b007a67e
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Mar 27 23:10:57 2008 +0100

    Convert share_info.tdb to dbwrap
    (cherry picked from commit bc9b4c43b8824cd53f9ab613bcbb94cd5193f43e)

commit 7e34011c0fdf59cdddc4da8c716db2f6ce9201fe
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Mar 28 12:20:06 2008 +0100

    mapping_tdb: use the correct sid for the key creation
    
    metze
    (cherry picked from commit 0d221a3f0a948e173b22585b7833a5441d860a57)

commit 70d7bbb688ea0b7a1d1bd4aeb4b5f424ddff15ef
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 27 17:39:58 2008 +0100

    mapping_tdb: use db_open_trans()
    
    metze
    (cherry picked from commit 16d18df0d069aec645c41e38e8c926ccdaac9388)

commit e84be843f24c51756fff71dd9f18b5d29a81d7f3
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Mar 27 17:10:31 2008 +0100

    Protect group_mapping.tdb ops with transactions
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit d702ed73c1b986ded9deaa3abed92c39d71949fc)

commit 5388dbdf0aa1737a3b89401be939ac210066091a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 27 16:55:35 2008 +0100

    pdb_tdb: use != 0 instead off == -1 for dbwrap functions
    
    metze
    (cherry picked from commit d4826a01369c00b5e83cd62c2412a4eb826e216d)

commit b446f57b350aa6cc193fe62a71204abb276916bb
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Apr 1 11:02:01 2008 +0200

    passdb: guard pdb_generate_sam_sid() with a transaction
    
    This prevents possible races with some dbwrap backends
    
    metze
    (cherry picked from commit 9322442510d9c2cf16c25f5109fe81b277c44881)

commit 37da7773547cc85862f764dc965fbd7868f0dd5b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Apr 1 11:00:59 2008 +0200

    passdb/secrets: add secrets_db_ctx() to get the db_context
    
    metze
    (cherry picked from commit 986bc7e8b260265da019b67ec751509eb589d24b)

commit f8bd28e3cd6d0acb007c00cbb1af327a72535eef
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Apr 1 12:56:38 2008 +0200

    regdb: let regdb_fetch_keys() handle NULL and failure cases in the same way and return -1
    
    metze
    (cherry picked from commit 983fd58805a429792fc8eaa816e2dd908643414e)

commit 4fa0481df70e99f7c353b4364b93af8dd359f453
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Apr 1 12:48:08 2008 +0200

    regdb: get the seqnum before the record, to not miss something
    
    metze
    (cherry picked from commit c214107bd9bbf9b17936757437ec211d7de3048e)

commit 120818ceb107f45ea865d311536b1b6e853d5b72
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Apr 1 12:38:54 2008 +0200

    regdb: use dbwrap->fetch() instead of fetch_locked() for readonly access"
    
    This is the fixed version of commit 5c28c74aa06a82559f498373b3d6e9892d5c2cbe.
    
    metze
    (cherry picked from commit 924acd7f695d7514b1a4628468137cf632c8f1f0)

commit 37c20c52b0a01a0874af257814d8ebfce760d2ab
Author: Michael Adam <obnox at samba.org>
Date:   Sun Mar 30 01:25:45 2008 +0100

    Revert "regdb: use dbwrap->fetch() instead of fetch_locked() for readonly access"
    
    This reverts commit 4e2be189e97f653b75bd88135a631ce0f42db267.
    
    Metze, this broke the registry (reg_api layer), but I don't yet know
    exactly how and why. By the way, the locks there had the purpose of
    fetching the seqnum that really matches the data.
    
    This needs some more thought / debugging. But I wanted to have
    the tree in a working state again.
    
    Michael
    (cherry picked from commit 5c28c74aa06a82559f498373b3d6e9892d5c2cbe)

commit 3a5c4aac177978ea42a8a491d4ab24c325b58b49
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 27 16:57:10 2008 +0100

    pdb_tdb: use db_open_trans()
    
    metze
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit 9925cc01a2a4739d6cde5991eb0d0b79ae13353b)

commit ed0d48be14a9be9b981e3f4931d805c59a540410
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 27 16:55:35 2008 +0100

    pdb_tdb: use db_sam->transaction_start(db_sam) != 0 consistent
    
    metze
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit 3bf9ab640e9a79157fcfee0b5d0cde5badc92755)

commit 71dc26bc1ab2c63968dc343391b2d70468b6c896
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 27 16:57:30 2008 +0100

    passdb/secrets: use db_open_trans()
    
    metze
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit b61b8ca4944f399216d8e67a48ea7d259258b432)

commit 8213cb9b8be0ea8ab2a10c7b441be850dd675bf7
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 20 14:26:46 2008 +0100

    passdb/secrets: it's enough to use traverse_read() in secrets_trusted_domains()
    
    metze
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit 729f7b9ff30e81537a7257daeaa1728c7ae96853)

commit a3cb130f9bbda44790cbf2a238ce34cf9eb4e449
Author: Michael Adam <obnox at samba.org>
Date:   Thu Mar 27 18:01:43 2008 +0100

    regdb: use == 0 (instead of != -1) as indicator for success of dbwrap_trans_[delete|store]()
    
    Michael
    (cherry picked from commit 7dcd0c1e539df9ff1768a9c878b6687b9e1bfeac)

commit 26df5ce824b2c83370809df952010c1e30e70800
Author: Michael Adam <obnox at samba.org>
Date:   Thu Mar 27 17:44:36 2008 +0100

    regdb: use != 0 instead of == -1 check for transaction_[commit|cancel]
    
    Michael
    (cherry picked from commit b6ceeaabae94b86fe79d6a60e497fb472ca23021)

commit 0dacb7a1ce9da5b0aff9b67a7e872981179be9d3
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 27 16:57:51 2008 +0100

    regdb: use db_open_trans()
    
    metze
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit a77b5b91dd439b5965fef17f2b2ff98fefd77dbb)

commit 2df155429fe4acd94c46de7a8c8dfbd2832ae9f5
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 27 16:56:38 2008 +0100

    regdb: use regdb->transaction_start(regdb) != 0 consistent
    
    metze
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit 093c3bced96c934419af69cc065a240368027dcf)

commit 9fb165b8bf40bccfc219a564662d961620877d94
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Mar 26 21:24:17 2008 +0100

    regdb: use dbwrap->fetch() instead of fetch_locked() for readonly access
    
    metze
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit 4e2be189e97f653b75bd88135a631ce0f42db267)

commit 9d6ccc422409839a7f92085b92e966a99e3d68c9
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Mar 26 21:25:06 2008 +0100

    regdb: use dbwrap_trans_store_int32
    
    metze
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit 9620696083473e3a98b46dd90b3b4aa287580940)

commit 7cc276a6d648e8bc82c58fdcbfa6bc669f073804
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 27 16:08:21 2008 +0100

    dbwrap: add db_open_trans()
    
    This should be used when transactions are wanted.
    For now it's just a wrapper of db_open(), but this
    will change.
    
    metze
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit 74a070b8a24fea1009e557f711b76fc14e8961dc)

commit 7aeb352197069c8adb2e05e670b3f4b806f1e2ad
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Mar 27 15:59:58 2008 +0100

    dbwrap: add dbwrap_trans_store_int32()
    
    metze
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit f05e889bc05a816aef5b9ce4f22267e977dade01)

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

Summary of changes:
 source/groupdb/mapping_tdb.c     |   84 ++++++++++++++++++++++++------
 source/include/dbwrap.h          |    5 ++
 source/lib/account_pol.c         |   78 +++++++++++++++++++++------
 source/lib/dbwrap.c              |   15 +++++
 source/lib/dbwrap_util.c         |  106 ++++++++++++++++++++++++++++++++++---
 source/lib/privileges.c          |   39 +++++++-------
 source/lib/sharesec.c            |   90 +++++++++++++++++++++++++-------
 source/passdb/machine_sid.c      |   26 +++++++++-
 source/passdb/pdb_tdb.c          |    6 +-
 source/passdb/secrets.c          |   28 ++++++++--
 source/registry/reg_backend_db.c |   98 ++++++++++++++++++----------------
 11 files changed, 435 insertions(+), 140 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/groupdb/mapping_tdb.c b/source/groupdb/mapping_tdb.c
index 2f0981e..aadab6a 100644
--- a/source/groupdb/mapping_tdb.c
+++ b/source/groupdb/mapping_tdb.c
@@ -38,8 +38,8 @@ static bool init_group_mapping(void)
 		return true;
 	}
 
-	db = db_open(NULL, state_path("group_mapping.tdb"), 0, TDB_DEFAULT,
-		     O_RDWR|O_CREAT, 0600);
+	db = db_open_trans(NULL, state_path("group_mapping.tdb"), 0,
+			   TDB_DEFAULT, O_RDWR|O_CREAT, 0600);
 	if (db == NULL) {
 		DEBUG(0, ("Failed to open group mapping database: %s\n",
 			  strerror(errno)));
@@ -141,8 +141,9 @@ static bool add_mapping_entry(GROUP_MAP *map, int flag)
 	len = tdb_pack((uint8 *)buf, len, "ddff", map->gid,
 		       map->sid_name_use, map->nt_name, map->comment);
 
-	status = dbwrap_store_bystring(
-		db, key, make_tdb_data((uint8_t *)buf, len), flag);
+	status = dbwrap_trans_store(
+		db, string_term_tdb_data(key),
+		make_tdb_data((uint8_t *)buf, len), flag);
 
 	TALLOC_FREE(key);
 
@@ -162,7 +163,7 @@ static bool get_group_map_from_sid(DOM_SID sid, GROUP_MAP *map)
 
 	/* the key is the SID, retrieving is direct */
 
-	key = group_mapping_key(talloc_tos(), &map->sid);
+	key = group_mapping_key(talloc_tos(), &sid);
 	if (key == NULL) {
 		return false;
 	}
@@ -281,17 +282,17 @@ static bool get_group_map_from_ntname(const char *name, GROUP_MAP *map)
 static bool group_map_remove(const DOM_SID *sid)
 {
 	char *key;
-	bool result;
+	NTSTATUS status;
 
 	key = group_mapping_key(talloc_tos(), sid);
 	if (key == NULL) {
 		return false;
 	}
 
-	result = NT_STATUS_IS_OK(dbwrap_delete_bystring(db, key));
+	status = dbwrap_trans_delete(db, string_term_tdb_data(key));
 
 	TALLOC_FREE(key);
-	return result;
+	return NT_STATUS_IS_OK(status);
 }
 
 /****************************************************************************
@@ -479,12 +480,18 @@ static NTSTATUS add_aliasmem(const DOM_SID *alias, const DOM_SID *member)
 		return NT_STATUS_NO_MEMORY;
 	}
 
+	if (db->transaction_start(db) != 0) {
+		DEBUG(0, ("transaction_start failed\n"));
+		return NT_STATUS_INTERNAL_DB_CORRUPTION;
+	}
+
 	rec = db->fetch_locked(db, key, string_term_tdb_data(key));
 
 	if (rec == NULL) {
 		DEBUG(10, ("fetch_lock failed\n"));
 		TALLOC_FREE(key);
-		return NT_STATUS_INTERNAL_DB_CORRUPTION;
+		status = NT_STATUS_INTERNAL_DB_CORRUPTION;
+		goto cancel;
 	}
 
 	sid_to_fstring(string_sid, alias);
@@ -498,7 +505,8 @@ static NTSTATUS add_aliasmem(const DOM_SID *alias, const DOM_SID *member)
 
 	if (new_memberstring == NULL) {
 		TALLOC_FREE(key);
-		return NT_STATUS_NO_MEMORY;
+		status = NT_STATUS_NO_MEMORY;
+		goto cancel;
 	}
 
 	status = rec->store(rec, string_term_tdb_data(new_memberstring), 0);
@@ -507,6 +515,20 @@ static NTSTATUS add_aliasmem(const DOM_SID *alias, const DOM_SID *member)
 
 	if (!NT_STATUS_IS_OK(status)) {
 		DEBUG(10, ("Could not store record: %s\n", nt_errstr(status)));
+		goto cancel;
+	}
+
+	if (db->transaction_commit(db) != 0) {
+		DEBUG(0, ("transaction_commit failed\n"));
+		status = NT_STATUS_INTERNAL_DB_CORRUPTION;
+		goto cancel;
+	}
+
+	return NT_STATUS_OK;
+
+ cancel:
+	if (db->transaction_cancel(db) != 0) {
+		smb_panic("transaction_cancel failed");
 	}
 
 	return status;
@@ -604,10 +626,16 @@ static NTSTATUS del_aliasmem(const DOM_SID *alias, const DOM_SID *member)
 	char *key;
 	fstring sid_string;
 
+	if (db->transaction_start(db) != 0) {
+		DEBUG(0, ("transaction_start failed\n"));
+		return NT_STATUS_INTERNAL_DB_CORRUPTION;
+	}
+
 	status = alias_memberships(member, 1, &sids, &num);
 
-	if (!NT_STATUS_IS_OK(status))
-		return status;
+	if (!NT_STATUS_IS_OK(status)) {
+		goto cancel;
+	}
 
 	for (i=0; i<num; i++) {
 		if (sid_compare(&sids[i], alias) == 0) {
@@ -618,7 +646,8 @@ static NTSTATUS del_aliasmem(const DOM_SID *alias, const DOM_SID *member)
 
 	if (!found) {
 		TALLOC_FREE(sids);
-		return NT_STATUS_MEMBER_NOT_IN_ALIAS;
+		status = NT_STATUS_MEMBER_NOT_IN_ALIAS;
+		goto cancel;
 	}
 
 	if (i < num)
@@ -631,19 +660,21 @@ static NTSTATUS del_aliasmem(const DOM_SID *alias, const DOM_SID *member)
 	key = talloc_asprintf(sids, "%s%s", MEMBEROF_PREFIX, sid_string);
 	if (key == NULL) {
 		TALLOC_FREE(sids);
-		return NT_STATUS_NO_MEMORY;
+		status = NT_STATUS_NO_MEMORY;
+		goto cancel;
 	}
 
 	if (num == 0) {
 		status = dbwrap_delete_bystring(db, key);
 		TALLOC_FREE(sids);
-		return status;
+		goto cancel;
 	}
 
 	member_string = talloc_strdup(sids, "");
 	if (member_string == NULL) {
 		TALLOC_FREE(sids);
-		return NT_STATUS_NO_MEMORY;
+		status = NT_STATUS_NO_MEMORY;
+		goto cancel;
 	}
 
 	for (i=0; i<num; i++) {
@@ -655,7 +686,8 @@ static NTSTATUS del_aliasmem(const DOM_SID *alias, const DOM_SID *member)
 
 		if (member_string == NULL) {
 			TALLOC_FREE(sids);
-			return NT_STATUS_NO_MEMORY;
+			status = NT_STATUS_NO_MEMORY;
+			goto cancel;
 		}
 	}
 
@@ -664,6 +696,24 @@ static NTSTATUS del_aliasmem(const DOM_SID *alias, const DOM_SID *member)
 
 	TALLOC_FREE(sids);
 
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(10, ("dbwrap_store_bystring failed: %s\n",
+			   nt_errstr(status)));
+		goto cancel;
+	}
+
+	if (db->transaction_commit(db) != 0) {
+		DEBUG(0, ("transaction_commit failed\n"));
+		status = NT_STATUS_INTERNAL_DB_CORRUPTION;
+		goto cancel;
+	}
+
+	return NT_STATUS_OK;
+
+ cancel:
+	if (db->transaction_cancel(db) != 0) {
+		smb_panic("transaction_cancel failed");
+	}
 	return status;
 }
 
diff --git a/source/include/dbwrap.h b/source/include/dbwrap.h
index 095719a..654c7a4 100644
--- a/source/include/dbwrap.h
+++ b/source/include/dbwrap.h
@@ -54,6 +54,11 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx,
 			   int hash_size, int tdb_flags,
 			   int open_flags, mode_t mode);
 
+struct db_context *db_open_trans(TALLOC_CTX *mem_ctx,
+				 const char *name,
+				 int hash_size, int tdb_flags,
+				 int open_flags, mode_t mode);
+
 struct db_context *db_open_rbt(TALLOC_CTX *mem_ctx);
 
 struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx,
diff --git a/source/lib/account_pol.c b/source/lib/account_pol.c
index 2540b49..067f346 100644
--- a/source/lib/account_pol.c
+++ b/source/lib/account_pol.c
@@ -20,7 +20,7 @@
  */
 
 #include "includes.h"
-static TDB_CONTEXT *tdb; 
+static struct db_context *db;
 
 /* cache all entries for 60 seconds for to save ldap-queries (cache is updated
  * after this period if admins do not use pdbedit or usermanager but manipulate
@@ -208,36 +208,62 @@ bool init_account_policy(void)
 	uint32 version;
 	int i;
 
-	if (tdb) {
+	if (db != NULL) {
 		return True;
 	}
 
-	tdb = tdb_open_log(state_path("account_policy.tdb"), 0, TDB_DEFAULT, O_RDWR, 0600);
-	if (!tdb) { /* the account policies files does not exist or open failed, try to create a new one */
-		tdb = tdb_open_log(state_path("account_policy.tdb"), 0, TDB_DEFAULT, O_RDWR|O_CREAT, 0600);
-		if (!tdb) {
+	db = db_open_trans(NULL, state_path("account_policy.tdb"), 0, TDB_DEFAULT,
+		     O_RDWR, 0600);
+
+	if (db == NULL) { /* the account policies files does not exist or open
+			   * failed, try to create a new one */
+		db = db_open_trans(NULL, state_path("account_policy.tdb"), 0,
+			     TDB_DEFAULT, O_RDWR|O_CREAT, 0600);
+		if (db == NULL) {
 			DEBUG(0,("Failed to open account policy database\n"));
 			return False;
 		}
 	}
 
+	version = dbwrap_fetch_int32(db, vstring);
+	if (version == DATABASE_VERSION) {
+		return true;
+	}
+
 	/* handle a Samba upgrade */
-	tdb_lock_bystring(tdb, vstring);
-	if (!tdb_fetch_uint32(tdb, vstring, &version) || version != DATABASE_VERSION) {
 
-		tdb_store_uint32(tdb, vstring, DATABASE_VERSION);
+	if (db->transaction_start(db) != 0) {
+		DEBUG(0, ("transaction_start failed\n"));
+		TALLOC_FREE(db);
+		return false;
+	}
+
+	version = dbwrap_fetch_int32(db, vstring);
+	if (version == DATABASE_VERSION) {
+		/*
+		 * Race condition
+		 */
+		if (db->transaction_cancel(db)) {
+			smb_panic("transaction_cancel failed");
+		}
+		return true;
+	}
+
+	if (version != DATABASE_VERSION) {
+		if (dbwrap_store_uint32(db, vstring, DATABASE_VERSION) != 0) {
+			DEBUG(0, ("dbwrap_store_uint32 failed\n"));
+			goto cancel;
+		}
 
 		for (i=0; account_policy_names[i].field; i++) {
 
 			if (!account_policy_set_default_on_empty(account_policy_names[i].field)) {
 				DEBUG(0,("failed to set default value in account policy tdb\n"));
-				return False;
+				goto cancel;
 			}
 		}
 	}
 
-	tdb_unlock_bystring(tdb, vstring);
-
 	/* These exist by default on NT4 in [HKLM\SECURITY\Policy\Accounts] */
 
 	privilege_create_account( &global_sid_World );
@@ -255,7 +281,20 @@ bool init_account_policy(void)
 		}
 	}
 
+	if (db->transaction_commit(db) != 0) {
+		DEBUG(0, ("transaction_commit failed\n"));
+		goto cancel;
+	}
+
 	return True;
+
+ cancel:
+	if (db->transaction_cancel(db)) {
+		smb_panic("transaction_cancel failed");
+	}
+	TALLOC_FREE(db);
+
+	return false;
 }
 
 /*****************************************************************************
@@ -281,7 +320,7 @@ bool account_policy_get(int field, uint32 *value)
 		return False;
 	}
 	
-	if (!tdb_fetch_uint32(tdb, name, &regval)) {
+	if (!dbwrap_fetch_uint32(db, name, &regval)) {
 		DEBUG(1, ("account_policy_get: tdb_fetch_uint32 failed for field %d (%s), returning 0\n", field, name));
 		return False;
 	}
@@ -302,6 +341,7 @@ Set an account policy (in tdb)
 bool account_policy_set(int field, uint32 value)
 {
 	const char *name;
+	NTSTATUS status;
 
 	if (!init_account_policy()) {
 		return False;
@@ -313,8 +353,10 @@ bool account_policy_set(int field, uint32 value)
 		return False;
 	}
 
-	if (!tdb_store_uint32(tdb, name, value)) {
-		DEBUG(1, ("tdb_store_uint32 failed for field %d (%s) on value %u\n", field, name, value));
+	status = dbwrap_trans_store_uint32(db, name, value);
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(1, ("store_uint32 failed for field %d (%s) on value "
+			  "%u: %s\n", field, name, value, nt_errstr(status)));
 		return False;
 	}
 
@@ -397,15 +439,15 @@ bool cache_account_policy_get(int field, uint32 *value)
 /****************************************************************************
 ****************************************************************************/
 
-TDB_CONTEXT *get_account_pol_tdb( void )
+struct db_context *get_account_pol_db( void )
 {
 
-	if ( !tdb ) {
+	if ( db != NULL ) {
 		if ( !init_account_policy() ) {
 			return NULL;
 		}
 	}
 
-	return tdb;
+	return db;
 }
 
diff --git a/source/lib/dbwrap.c b/source/lib/dbwrap.c
index 001424a..fd92463 100644
--- a/source/lib/dbwrap.c
+++ b/source/lib/dbwrap.c
@@ -42,6 +42,9 @@ static int dbwrap_fallback_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
 	return 0;
 }
 
+/**
+ * If you need transaction support use db_open_trans()
+ */
 struct db_context *db_open(TALLOC_CTX *mem_ctx,
 			   const char *name,
 			   int hash_size, int tdb_flags,
@@ -93,6 +96,18 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx,
 	return result;
 }
 
+/**
+ * If you use this you can only modify with a transaction
+ */
+struct db_context *db_open_trans(TALLOC_CTX *mem_ctx,
+				 const char *name,
+				 int hash_size, int tdb_flags,
+				 int open_flags, mode_t mode)
+{
+	/* TODO: implement this differently */
+	return db_open(mem_ctx, name, hash_size, tdb_flags, open_flags, mode);
+}
+
 NTSTATUS dbwrap_delete_bystring(struct db_context *db, const char *key)
 {
 	struct db_record *rec;
diff --git a/source/lib/dbwrap_util.c b/source/lib/dbwrap_util.c
index 0bafbe6..07e5082 100644
--- a/source/lib/dbwrap_util.c
+++ b/source/lib/dbwrap_util.c
@@ -59,6 +59,45 @@ int dbwrap_store_int32(struct db_context *db, const char *keystr, int32_t v)
 	return NT_STATUS_IS_OK(status) ? 0 : -1;
 }
 
+bool dbwrap_fetch_uint32(struct db_context *db, const char *keystr,
+			 uint32_t *val)
+{
+	TDB_DATA dbuf;
+
+	if (db->fetch(db, NULL, string_term_tdb_data(keystr), &dbuf) != 0) {
+		return false;
+	}
+
+	if ((dbuf.dptr == NULL) || (dbuf.dsize != sizeof(uint32_t))) {
+		TALLOC_FREE(dbuf.dptr);
+		return false;
+	}
+
+	*val = IVAL(dbuf.dptr, 0);
+	TALLOC_FREE(dbuf.dptr);
+	return true;
+}
+
+bool dbwrap_store_uint32(struct db_context *db, const char *keystr, uint32_t v)
+{
+	struct db_record *rec;
+	uint32 v_store;
+	NTSTATUS status;
+
+	rec = db->fetch_locked(db, NULL, string_term_tdb_data(keystr));
+	if (rec == NULL) {
+		return false;
+	}
+
+	SIVAL(&v_store, 0, v);
+
+	status = rec->store(rec, make_tdb_data((const uint8 *)&v_store,
+					       sizeof(v_store)),
+			    TDB_REPLACE);
+	TALLOC_FREE(rec);
+	return NT_STATUS_IS_OK(status) ? 0 : -1;
+}
+
 uint32_t dbwrap_change_uint32_atomic(struct db_context *db, const char *keystr,
 				     uint32_t *oldval, uint32_t change_val)
 {
@@ -117,21 +156,23 @@ int32 dbwrap_change_int32_atomic(struct db_context *db, const char *keystr,
 	return 0;
 }
 
-int dbwrap_trans_store(struct db_context *db, TDB_DATA key, TDB_DATA dbuf,
-		       int flag)
+NTSTATUS dbwrap_trans_store(struct db_context *db, TDB_DATA key, TDB_DATA dbuf,
+			    int flag)
 {
 	int res;
-	struct db_record *rec;
+	struct db_record *rec = NULL;
 	NTSTATUS status;
 
 	res = db->transaction_start(db);
 	if (res != 0) {
 		DEBUG(5, ("transaction_start failed\n"));
+		return NT_STATUS_INTERNAL_DB_CORRUPTION;
 	}
 
 	rec = db->fetch_locked(db, talloc_tos(), key);
 	if (rec == NULL) {
 		DEBUG(5, ("fetch_locked failed\n"));
+		status = NT_STATUS_NO_MEMORY;
 		goto cancel;
 	}
 
@@ -146,31 +187,37 @@ int dbwrap_trans_store(struct db_context *db, TDB_DATA key, TDB_DATA dbuf,
 	res = db->transaction_commit(db);
 	if (res != 0) {
 		DEBUG(5, ("tdb_transaction_commit failed\n"));
+		status = NT_STATUS_INTERNAL_DB_CORRUPTION;
+		goto cancel;
 	}
 
-	return res;
+	return NT_STATUS_OK;
 
  cancel:
+	TALLOC_FREE(rec);
+
 	if (db->transaction_cancel(db) != 0) {
 		smb_panic("Cancelling transaction failed");
 	}
-	return -1;
+	return status;
 }


-- 
Samba Shared Repository


More information about the samba-cvs mailing list