[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Wed May 30 18:51:04 MDT 2012


The branch, master has been updated
       via  5e5f569 lib/dbwrap: make it possible to delete/store the current record during traverse
       via  39ac945 lib/dbwrap: don't alter the record on failure in db_rbt_store()
       via  a06b9b4 lib/dbwrap: fix db_rbt_store and update the per record node pointer
       via  5b8cb6b lib/dbwrap: remove unused per db_record pointer in dbwrap_rbt
      from  fc7e111 Fix bad bugfix for bug #8910 - resolve_ads() code can return zero addresses and miss valid DC IP addresses

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


- Log -----------------------------------------------------------------
commit 5e5f5692b8061e7151f80b155a229ce9bbb31ef9
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed May 30 15:06:12 2012 +0200

    lib/dbwrap: make it possible to delete/store the current record during traverse
    
    metze
    
    Autobuild-User: Stefan Metzmacher <metze at samba.org>
    Autobuild-Date: Thu May 31 02:50:09 CEST 2012 on sn-devel-104

commit 39ac9457a3d75a344b6ca41a7df3122eb9c5b26e
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed May 30 16:50:06 2012 +0200

    lib/dbwrap: don't alter the record on failure in db_rbt_store()
    
    metze

commit a06b9b413e6e739310d6f0e95ad5d31f9503482a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed May 30 16:48:39 2012 +0200

    lib/dbwrap: fix db_rbt_store and update the per record node pointer
    
    metze

commit 5b8cb6b2be4008d3f985e304f6c7cf259672e616
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed May 30 16:05:03 2012 +0200

    lib/dbwrap: remove unused per db_record pointer in dbwrap_rbt
    
    metze

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

Summary of changes:
 lib/dbwrap/dbwrap_rbt.c |  117 ++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 90 insertions(+), 27 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/dbwrap/dbwrap_rbt.c b/lib/dbwrap/dbwrap_rbt.c
index d468953..3dca3ba 100644
--- a/lib/dbwrap/dbwrap_rbt.c
+++ b/lib/dbwrap/dbwrap_rbt.c
@@ -30,7 +30,6 @@ struct db_rbt_ctx {
 };
 
 struct db_rbt_rec {
-	struct db_rbt_ctx *db_ctx;
 	struct db_rbt_node *node;
 };
 
@@ -92,6 +91,8 @@ static void db_rbt_parse_node(struct db_rbt_node *node,
 
 static NTSTATUS db_rbt_store(struct db_record *rec, TDB_DATA data, int flag)
 {
+	struct db_rbt_ctx *db_ctx = talloc_get_type_abort(
+		rec->db->private_data, struct db_rbt_ctx);
 	struct db_rbt_rec *rec_priv = (struct db_rbt_rec *)rec->private_data;
 	struct db_rbt_node *node;
 
@@ -120,13 +121,23 @@ static NTSTATUS db_rbt_store(struct db_record *rec, TDB_DATA data, int flag)
 			rec_priv->node->valuesize = data.dsize;
 			return NT_STATUS_OK;
 		}
+	}
+
+	node = (struct db_rbt_node *)talloc_size(db_ctx,
+		offsetof(struct db_rbt_node, data) + rec->key.dsize
+		+ data.dsize);
+
+	if (node == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
 
+	if (rec_priv->node != NULL) {
 		/*
 		 * We need to delete the key from the tree and start fresh,
 		 * there's not enough space in the existing record
 		 */
 
-		rb_erase(&rec_priv->node->rb_node, &rec_priv->db_ctx->tree);
+		rb_erase(&rec_priv->node->rb_node, &db_ctx->tree);
 
 		/*
 		 * Keep the existing node around for a while: If the record
@@ -134,15 +145,6 @@ static NTSTATUS db_rbt_store(struct db_record *rec, TDB_DATA data, int flag)
 		 */
 	}
 
-	node = (struct db_rbt_node *)talloc_size(rec_priv->db_ctx,
-		offsetof(struct db_rbt_node, data) + rec->key.dsize
-		+ data.dsize);
-
-	if (node == NULL) {
-		TALLOC_FREE(rec_priv->node);
-		return NT_STATUS_NO_MEMORY;
-	}
-
 	ZERO_STRUCT(node->rb_node);
 
 	node->keysize = rec->key.dsize;
@@ -152,11 +154,12 @@ static NTSTATUS db_rbt_store(struct db_record *rec, TDB_DATA data, int flag)
 
 	memcpy(this_key.dptr, rec->key.dptr, node->keysize);
 	TALLOC_FREE(rec_priv->node);
+	rec_priv->node = node;
 
 	memcpy(this_val.dptr, data.dptr, node->valuesize);
 
 	parent = NULL;
-	p = &rec_priv->db_ctx->tree.rb_node;
+	p = &db_ctx->tree.rb_node;
 
 	while (*p) {
 		struct db_rbt_node *r;
@@ -183,24 +186,37 @@ static NTSTATUS db_rbt_store(struct db_record *rec, TDB_DATA data, int flag)
 	}
 
 	rb_link_node(&node->rb_node, parent, p);
-	rb_insert_color(&node->rb_node, &rec_priv->db_ctx->tree);
+	rb_insert_color(&node->rb_node, &db_ctx->tree);
 
 	return NT_STATUS_OK;
 }
 
 static NTSTATUS db_rbt_delete(struct db_record *rec)
 {
+	struct db_rbt_ctx *db_ctx = talloc_get_type_abort(
+		rec->db->private_data, struct db_rbt_ctx);
 	struct db_rbt_rec *rec_priv = (struct db_rbt_rec *)rec->private_data;
 
 	if (rec_priv->node == NULL) {
 		return NT_STATUS_OK;
 	}
 
-	rb_erase(&rec_priv->node->rb_node, &rec_priv->db_ctx->tree);
+	rb_erase(&rec_priv->node->rb_node, &db_ctx->tree);
 	TALLOC_FREE(rec_priv->node);
 
 	return NT_STATUS_OK;
 }
+
+static NTSTATUS db_rbt_store_deny(struct db_record *rec, TDB_DATA data, int flag)
+{
+	return NT_STATUS_MEDIA_WRITE_PROTECTED;
+}
+
+static NTSTATUS db_rbt_delete_deny(struct db_record *rec)
+{
+	return NT_STATUS_MEDIA_WRITE_PROTECTED;
+}
+
 struct db_rbt_search_result {
 	TDB_DATA key;
 	TDB_DATA val;
@@ -256,9 +272,6 @@ static struct db_record *db_rbt_fetch_locked(struct db_context *db_ctx,
 					     TALLOC_CTX *mem_ctx,
 					     TDB_DATA key)
 {
-	struct db_rbt_ctx *ctx = talloc_get_type_abort(
-		db_ctx->private_data, struct db_rbt_ctx);
-
 	struct db_rbt_rec *rec_priv;
 	struct db_record *result;
 	size_t size;
@@ -290,7 +303,6 @@ static struct db_record *db_rbt_fetch_locked(struct db_context *db_ctx,
 
 	rec_priv = (struct db_rbt_rec *)
 		((char *)result + DBWRAP_RBT_ALIGN(sizeof(struct db_record)));
-	rec_priv->db_ctx = ctx;
 
 	result->store = db_rbt_store;
 	result->delete_rec = db_rbt_delete;
@@ -345,27 +357,47 @@ static NTSTATUS db_rbt_parse_record(struct db_context *db, TDB_DATA key,
 	return NT_STATUS_OK;
 }
 
-static int db_rbt_traverse_internal(struct rb_node *n,
+static int db_rbt_traverse_internal(struct db_context *db,
+				    struct rb_node *n,
 				    int (*f)(struct db_record *db,
 					     void *private_data),
-				    void *private_data, uint32_t* count)
+				    void *private_data, uint32_t* count,
+				    bool rw)
 {
-	struct db_rbt_node *r;
+	struct rb_node *rb_right;
+	struct rb_node *rb_left;
 	struct db_record rec;
+	struct db_rbt_rec rec_priv;
 	int ret;
 
 	if (n == NULL) {
 		return 0;
 	}
 
-	ret = db_rbt_traverse_internal(n->rb_left, f, private_data, count);
+	rb_left = n->rb_left;
+	rb_right = n->rb_right;
+
+	ret = db_rbt_traverse_internal(db, rb_left, f, private_data, count, rw);
 	if (ret != 0) {
 		return ret;
 	}
 
-	r = db_rbt2node(n);
+	ZERO_STRUCT(rec_priv);
+	rec_priv.node = db_rbt2node(n);
+	/* n might be altered by the callback function */
+	n = NULL;
+
 	ZERO_STRUCT(rec);
-	db_rbt_parse_node(r, &rec.key, &rec.value);
+	rec.db = db;
+	rec.private_data = &rec_priv;
+	if (rw) {
+		rec.store = db_rbt_store;
+		rec.delete_rec = db_rbt_delete;
+	} else {
+		rec.store = db_rbt_store_deny;
+		rec.delete_rec = db_rbt_delete_deny;
+	}
+	db_rbt_parse_node(rec_priv.node, &rec.key, &rec.value);
 
 	ret = f(&rec, private_data);
 	(*count) ++;
@@ -373,7 +405,15 @@ static int db_rbt_traverse_internal(struct rb_node *n,
 		return ret;
 	}
 
-	return db_rbt_traverse_internal(n->rb_right, f, private_data, count);
+	if (rec_priv.node != NULL) {
+		/*
+		 * If the current record is still there
+		 * we should take the current rb_right.
+		 */
+		rb_right = rec_priv.node->rb_node.rb_right;
+	}
+
+	return db_rbt_traverse_internal(db, rb_right, f, private_data, count, rw);
 }
 
 static int db_rbt_traverse(struct db_context *db,
@@ -385,7 +425,30 @@ static int db_rbt_traverse(struct db_context *db,
 		db->private_data, struct db_rbt_ctx);
 	uint32_t count = 0;
 
-	int ret =  db_rbt_traverse_internal(ctx->tree.rb_node, f, private_data, &count);
+	int ret = db_rbt_traverse_internal(db, ctx->tree.rb_node,
+					   f, private_data, &count,
+					   true /* rw */);
+	if (ret != 0) {
+		return -1;
+	}
+	if (count > INT_MAX) {
+		return -1;
+	}
+	return count;
+}
+
+static int db_rbt_traverse_read(struct db_context *db,
+				int (*f)(struct db_record *db,
+					 void *private_data),
+				void *private_data)
+{
+	struct db_rbt_ctx *ctx = talloc_get_type_abort(
+		db->private_data, struct db_rbt_ctx);
+	uint32_t count = 0;
+
+	int ret = db_rbt_traverse_internal(db, ctx->tree.rb_node,
+					   f, private_data, &count,
+					   false /* rw */);
 	if (ret != 0) {
 		return -1;
 	}
@@ -434,7 +497,7 @@ struct db_context *db_open_rbt(TALLOC_CTX *mem_ctx)
 	result->fetch_locked = db_rbt_fetch_locked;
 	result->try_fetch_locked = NULL;
 	result->traverse = db_rbt_traverse;
-	result->traverse_read = db_rbt_traverse;
+	result->traverse_read = db_rbt_traverse_read;
 	result->get_seqnum = db_rbt_get_seqnum;
 	result->transaction_start = db_rbt_trans_dummy;
 	result->transaction_commit = db_rbt_trans_dummy;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list