[SCM] Samba Shared Repository - branch v3-2-test updated - release-3-2-0pre2-601-g888c280

Stefan Metzmacher metze at samba.org
Tue Apr 1 12:05:07 GMT 2008


The branch, v3-2-test has been updated
       via  888c2802b7bda92baae2dd0c1596f5e04bc3bfaa (commit)
       via  b1d63c8c1116f3429fb73aa6842105073385d1e8 (commit)
       via  0b36871a0d795183f0e9dc78b654788b1988f06e (commit)
       via  d70a8e9c413a7d3993e0d11db5ae9cbc7fdb12c7 (commit)
       via  9e739b4c99a9aba5c5bb58f3b6a9fb949e24c581 (commit)
       via  2cf2684a11027431e6a93992413a5a5a697a4ba0 (commit)
       via  dead193f46c2b19955ab3e5ac5ba343694f4858a (commit)
       via  5f4de856af1abe63b13059bbe1615cb5877770d0 (commit)
       via  f1dd915ce802645166e0c8fc79d18d5ad41cfe7a (commit)
       via  1c59142ccc46616c10b98c51601361f203d542d6 (commit)
       via  bc9b4c43b8824cd53f9ab613bcbb94cd5193f43e (commit)
       via  0d221a3f0a948e173b22585b7833a5441d860a57 (commit)
       via  16d18df0d069aec645c41e38e8c926ccdaac9388 (commit)
       via  d702ed73c1b986ded9deaa3abed92c39d71949fc (commit)
       via  d4826a01369c00b5e83cd62c2412a4eb826e216d (commit)
       via  9322442510d9c2cf16c25f5109fe81b277c44881 (commit)
       via  986bc7e8b260265da019b67ec751509eb589d24b (commit)
       via  983fd58805a429792fc8eaa816e2dd908643414e (commit)
       via  c214107bd9bbf9b17936757437ec211d7de3048e (commit)
       via  924acd7f695d7514b1a4628468137cf632c8f1f0 (commit)
      from  1cb3b2f065566f981f6cfb8b5efdfad7db49c719 (commit)

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


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

    account_pol: use db_open_trans()
    
    metze

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

    account_pol: use dbwrap_trans_store_uint32()
    
    metze

commit 0b36871a0d795183f0e9dc78b654788b1988f06e
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>

commit d70a8e9c413a7d3993e0d11db5ae9cbc7fdb12c7
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

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

    dbwrap: add dbwrap_trans_store_uint32()
    
    metze

commit 2cf2684a11027431e6a93992413a5a5a697a4ba0
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>

commit dead193f46c2b19955ab3e5ac5ba343694f4858a
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>

commit 5f4de856af1abe63b13059bbe1615cb5877770d0
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>

commit f1dd915ce802645166e0c8fc79d18d5ad41cfe7a
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>

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

    sharesec: use db_open_trans()
    
    metze

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

    Convert share_info.tdb to dbwrap

commit 0d221a3f0a948e173b22585b7833a5441d860a57
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

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

    mapping_tdb: use db_open_trans()
    
    metze

commit d702ed73c1b986ded9deaa3abed92c39d71949fc
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>

commit d4826a01369c00b5e83cd62c2412a4eb826e216d
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

commit 9322442510d9c2cf16c25f5109fe81b277c44881
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

commit 986bc7e8b260265da019b67ec751509eb589d24b
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

commit 983fd58805a429792fc8eaa816e2dd908643414e
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

commit c214107bd9bbf9b17936757437ec211d7de3048e
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

commit 924acd7f695d7514b1a4628468137cf632c8f1f0
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

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

Summary of changes:
 source/groupdb/mapping_tdb.c     |   84 +++++++++++++++++++++++++------
 source/lib/account_pol.c         |   78 ++++++++++++++++++++++-------
 source/lib/dbwrap_util.c         |  101 ++++++++++++++++++++++++++++++++------
 source/lib/privileges.c          |   39 ++++++++-------
 source/lib/sharesec.c            |   90 ++++++++++++++++++++++++++--------
 source/passdb/machine_sid.c      |   26 +++++++++-
 source/passdb/pdb_tdb.c          |    2 +-
 source/passdb/secrets.c          |   23 +++++++--
 source/registry/reg_backend_db.c |   67 +++++++++++++------------
 9 files changed, 382 insertions(+), 128 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/groupdb/mapping_tdb.c b/source/groupdb/mapping_tdb.c
index d4ee523..05a473c 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/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_util.c b/source/lib/dbwrap_util.c
index 1572f01..eea7ca7 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,22 +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 res;
+		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;
 	}
 
@@ -147,18 +187,22 @@ 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;
 }
 
-int dbwrap_trans_delete(struct db_context *db, TDB_DATA key)
+NTSTATUS dbwrap_trans_delete(struct db_context *db, TDB_DATA key)
 {
 	int res;
 	struct db_record *rec;
@@ -167,12 +211,13 @@ int dbwrap_trans_delete(struct db_context *db, TDB_DATA key)
 	res = db->transaction_start(db);
 	if (res != 0) {
 		DEBUG(5, ("transaction_start failed\n"));
-		return res;
+		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;
 	}
 
@@ -187,28 +232,52 @@ int dbwrap_trans_delete(struct db_context *db, TDB_DATA key)
 	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:
 	if (db->transaction_cancel(db) != 0) {
 		smb_panic("Cancelling transaction failed");
 	}
-	return -1;
+	return status;
 }
 
-int dbwrap_trans_store_int32(struct db_context *db, const char *keystr, int32_t v)
+NTSTATUS dbwrap_trans_store_int32(struct db_context *db, const char *keystr,
+				  int32_t v)
 {
-	int ret;
 	int32 v_store;
 
 	SIVAL(&v_store, 0, v);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list