[SCM] Samba Shared Repository - branch master updated

Michael Adam obnox at samba.org
Mon Jul 4 13:12:01 MDT 2011


The branch, master has been updated
       via  399c0db s3:registry: remove unused function regdb_key_is_base_key()
       via  86f8eb9 s3:registry: replace use of deprecated talloc_destroy by talloc_free.
       via  17b091b s3:registry: remove superfluous check for success of talloc_stackframe()
       via  cc384c1 s3:registry: add debug-level-10 verbosity to regdb_upgrade_v2_v3_fn()
       via  340be35 s3:registry: adapt a debug message to be more systematic
       via  c8c5d8c s3:registry: set registry version to 3 and add upgrade code
       via  f36ee63 s3:registry: add db_context argument to regdb_upgrade_v1_to_v2()
       via  1621aab s3:registry: wrap the whole db upgrade in one transaction
       via  caf9c99 s3:registry: change regdb_store_regdb_version() to take db_context argument.
       via  2273650 s3:registry: fix a comment typo
       via  a836071 s3:registry: remove unused regdb_delete_sorted_subkeys()
       via  a0f83ec s3:registry: don't delete the unused subkeys cache record any more
       via  50add40 s3:registry: remove the code to create and search the sorted subkeys cache records
       via  18973fa s3:registry: adapt the comment explaining the definition of the existence of a key.
       via  a255630 s3:registry: regdb_key_exists now checks only for the list-of-subkeys-record
       via  9e2b2c1 s3:registry: rewrite init_registry_key_internal
       via  747c67c s3:registry: add regdb_create_basekey()
       via  144c8d7 s3:registry: add regdb_create_subkey_internal() taking additional db context argument
       via  15a50ef s3:registry: add new mode to regdb_store_subkey_list() for handing in NULL parent key
       via  fc4d79d s3:registry: create the empty list of subkeys of the new key in regdb_create_subkey
       via  322eaf1 s3:registry: refactor creation of subkey list out into regdb_store_subkey_list()
       via  394ca14 s3:registry: remove redundant write of zero-lentgh subkey list record
       via  eb797bd s3:registry: don't update the sorted subkeys cache any more in regdb_store_keys_internal2()
       via  5b01a34 s3:registry: don't skip base key in existence check in regdb_store_keys_internal()
       via  da2e64b s3:registry: don't skip base keys from existence check in regdb_create_subkey()
       via  6b99aa4 s3:registry: don't skip base keys from existence check in regdb_delete_subkey()
       via  a60c94d selftest: remove invalid use of the globbing operator <>
       via  b6f2565 selftest: eliminate perl warnings (my $cmd masks earlier definition...)
       via  65f4d33 selftest: eliminate a perl warning
      from  ad4a10d s3:smb2 fix smbd crash on premature end of smb2 conn (Bug 8286)

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


- Log -----------------------------------------------------------------
commit 399c0dba01b4337f5483bf03c99d28a3486e7981
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 17:45:30 2011 +0200

    s3:registry: remove unused function regdb_key_is_base_key()
    
    Autobuild-User: Michael Adam <obnox at samba.org>
    Autobuild-Date: Mon Jul  4 21:11:32 CEST 2011 on sn-devel-104

commit 86f8eb98fe76b4b65f903e1792cdb2eb9b195ee5
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 17:22:01 2011 +0200

    s3:registry: replace use of deprecated talloc_destroy by talloc_free.

commit 17b091b7c7f57a041c5e90c653f1ee46572d4668
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 17:21:23 2011 +0200

    s3:registry: remove superfluous check for success of talloc_stackframe()

commit cc384c15969cdc395bfd3fcee10b5c04233df290
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 17:20:28 2011 +0200

    s3:registry: add debug-level-10 verbosity to regdb_upgrade_v2_v3_fn()

commit 340be35b9b068360b5fec5a0ea43dc8a3b294ba4
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 17:13:58 2011 +0200

    s3:registry: adapt a debug message to be more systematic

commit c8c5d8c89e3cf9b71a917de83ad68d4d3c18b117
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 16:23:08 2011 +0200

    s3:registry: set registry version to 3 and add upgrade code
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit f36ee63df28a2c49e8661a28237b97fe60f872c4
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 16:21:26 2011 +0200

    s3:registry: add db_context argument to regdb_upgrade_v1_to_v2()

commit 1621aab139f0104cb2c7183c28c52cb6605abb09
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 16:15:11 2011 +0200

    s3:registry: wrap the whole db upgrade in one transaction
    
    The purpose of this is to prepare for multiple upgrade steps
    to be performed in a single transaction, so that no change
    at all is made to that database if one step fails.
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit caf9c9996952e72e61f9c9f0efd27936f38eefda
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 16:09:33 2011 +0200

    s3:registry: change regdb_store_regdb_version() to take db_context argument.

commit 2273650ca89c4042d073257383d0e5d28a8a555f
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 15:23:39 2011 +0200

    s3:registry: fix a comment typo

commit a8360712e1356a347f49a5208c1388dc5ab96d31
Author: Michael Adam <obnox at samba.org>
Date:   Fri Jul 1 13:49:12 2011 +0200

    s3:registry: remove unused regdb_delete_sorted_subkeys()
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit a0f83ecbb9697d4aa9c47b7b61001996a934ecee
Author: Michael Adam <obnox at samba.org>
Date:   Fri Jul 1 13:48:16 2011 +0200

    s3:registry: don't delete the unused subkeys cache record any more
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit 50add4091aff69e70263fbb46d30bad8f420759c
Author: Michael Adam <obnox at samba.org>
Date:   Fri Jul 1 13:37:41 2011 +0200

    s3:registry: remove the code to create and search the sorted subkeys cache records
    
    This is not needed any more.
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit 18973fa109132bab8cb22a6757dbe4a206ea1a33
Author: Michael Adam <obnox at samba.org>
Date:   Fri Jul 1 13:33:44 2011 +0200

    s3:registry: adapt the comment explaining the definition of the existence of a key.
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit a25563035823e720a068c3021e01b0556feb7f18
Author: Michael Adam <obnox at samba.org>
Date:   Fri Jul 1 13:18:51 2011 +0200

    s3:registry: regdb_key_exists now checks only for the list-of-subkeys-record
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit 9e2b2c1fcc6d0bd852df715fdae7854b3ae77027
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 13:19:13 2011 +0200

    s3:registry: rewrite init_registry_key_internal
    
    This rewrites init_registry_key_internal() to correctly also create
    base keys. It makes use of the existing create functions instead of
    duplicating the code.
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit 747c67cf309a5127e78bd78f0d17e3fc094115d2
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 13:14:43 2011 +0200

    s3:registry: add regdb_create_basekey()
    
    Function to create a base key in the registry db, i.e. one that
    has no parent key.
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit 144c8d77d8dcde0b85cef28b6515360aa0c55b85
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 13:09:31 2011 +0200

    s3:registry: add regdb_create_subkey_internal() taking additional db context argument
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit 15a50ef8f856d83508ece3a8294dfaffbadc3b41
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 13:06:20 2011 +0200

    s3:registry: add new mode to regdb_store_subkey_list() for handing in NULL parent key
    
    Standard behaviour is to concatenate parent and key path (parent\key).
    This new mode allows for storing subkey lists for base keys using a NULL
    parent argument.
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit fc4d79d41a18ed3c2a2f8a831e5dcc3002423ab1
Author: Michael Adam <obnox at samba.org>
Date:   Fri Jul 1 15:50:05 2011 +0200

    s3:registry: create the empty list of subkeys of the new key in regdb_create_subkey
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit 322eaf1e9ef927bdec7fca947e894470196c1049
Author: Michael Adam <obnox at samba.org>
Date:   Fri Jul 1 15:47:50 2011 +0200

    s3:registry: refactor creation of subkey list out into regdb_store_subkey_list()
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit 394ca1446e712c9cb3649c8a2c4fd2ebe638d8cd
Author: Michael Adam <obnox at samba.org>
Date:   Fri Jul 1 15:18:12 2011 +0200

    s3:registry: remove redundant write of zero-lentgh subkey list record
    
    In this case, the zero-lenght list has already been written in step #2.
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit eb797bd2060732bca06cda3dfd5eabec5e7c8ab0
Author: Michael Adam <obnox at samba.org>
Date:   Fri Jul 1 14:34:08 2011 +0200

    s3:registry: don't update the sorted subkeys cache any more in regdb_store_keys_internal2()
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit 5b01a34ad734a772e52c50ccd8ffbb461f986af7
Author: Michael Adam <obnox at samba.org>
Date:   Fri Jul 1 14:23:19 2011 +0200

    s3:registry: don't skip base key in existence check in regdb_store_keys_internal()
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit da2e64b63f6bbb2faa93f621e14992e38aa37354
Author: Michael Adam <obnox at samba.org>
Date:   Fri Jul 1 13:58:45 2011 +0200

    s3:registry: don't skip base keys from existence check in regdb_create_subkey()
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit 6b99aa496fe653f6bb7dcd7720f5a2c736779af6
Author: Michael Adam <obnox at samba.org>
Date:   Fri Jul 1 13:57:19 2011 +0200

    s3:registry: don't skip base keys from existence check in regdb_delete_subkey()
    
    Pair-Programmed-With: Gregor Beck <gbeck at sernet.de>

commit a60c94d55980c62ca281507c8d1960b5ab233dba
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 17:01:29 2011 +0200

    selftest: remove invalid use of the globbing operator <>

commit b6f25650f1adcc75f0a97e31c31c9980326b7ab6
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 10:28:43 2011 +0200

    selftest: eliminate perl warnings (my $cmd masks earlier definition...)

commit 65f4d33d9b5ee80ef768c0479a6782807b18e518
Author: Michael Adam <obnox at samba.org>
Date:   Mon Jul 4 10:24:19 2011 +0200

    selftest: eliminate a perl warning
    
    In perl, %binary_mapping should be initialized as a hash, not a hash reference.

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

Summary of changes:
 selftest/selftest.pl              |    6 +-
 selftest/target/Samba4.pm         |    4 +-
 source3/registry/reg_backend_db.c |  795 ++++++++++++++-----------------------
 source3/registry/reg_db.h         |    2 +
 4 files changed, 305 insertions(+), 502 deletions(-)


Changeset truncated at 500 lines:

diff --git a/selftest/selftest.pl b/selftest/selftest.pl
index af45c71..d72c409 100755
--- a/selftest/selftest.pl
+++ b/selftest/selftest.pl
@@ -463,7 +463,7 @@ if ($opt_socket_wrapper) {
 my $target;
 my $testenv_default = "none";
 
-my %binary_mapping = {};
+my %binary_mapping = ();
 if ($opt_binary_mapping) {
     my @binmapping_list = split(/,/, $opt_binary_mapping);
     foreach my $mapping (@binmapping_list) {
@@ -603,11 +603,11 @@ sub write_clientconf($$$)
 	umask 0022;
 	if ( -d "$clientdir/ncalrpcdir/np" ) {
 	        unlink <$clientdir/ncalrpcdir/np/*>;
-		rmdir <$clientdir/ncalrpcdir/np>;
+		rmdir "$clientdir/ncalrpcdir/np";
 	}
 	if ( -d "$clientdir/ncalrpcdir" ) {
 	        unlink <$clientdir/ncalrpcdir/*>;
-		rmdir <$clientdir/ncalrpcdir>;
+		rmdir "$clientdir/ncalrpcdir";
 	}
 	mkdir("$clientdir/ncalrpcdir", 0755);
 	umask $mask;
diff --git a/selftest/target/Samba4.pm b/selftest/target/Samba4.pm
index 70e3cf7..f238e14 100644
--- a/selftest/target/Samba4.pm
+++ b/selftest/target/Samba4.pm
@@ -929,7 +929,7 @@ sub provision_rpc_proxy($$$)
 	}
 
 	# Setting up delegation runs in the context of the DC for now
-	my $cmd = "";
+	$cmd = "";
 	$cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$dcvars->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
 	$cmd .= "KRB5_CONFIG=\"$dcvars->{KRB5_CONFIG}\" ";
 	$cmd .= "$samba_tool delegation for-any-protocol '$ret->{NETBIOSNAME}\$' on";
@@ -941,7 +941,7 @@ sub provision_rpc_proxy($$$)
 	}
 
 	# Setting up delegation runs in the context of the DC for now
-	my $cmd = "";
+	$cmd = "";
 	$cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$dcvars->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
 	$cmd .= "KRB5_CONFIG=\"$dcvars->{KRB5_CONFIG}\" ";
 	$cmd .= "$samba_tool delegation add-service '$ret->{NETBIOSNAME}\$' cifs/$dcvars->{SERVER}";
diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c
index 2fda238..88ac393 100644
--- a/source3/registry/reg_backend_db.c
+++ b/source3/registry/reg_backend_db.c
@@ -39,7 +39,6 @@ static struct db_context *regdb = NULL;
 static int regdb_refcount;
 
 static bool regdb_key_exists(struct db_context *db, const char *key);
-static bool regdb_key_is_base_key(const char *key);
 static WERROR regdb_fetch_keys_internal(struct db_context *db, const char *key,
 					struct regsubkey_ctr *ctr);
 static bool regdb_store_keys_internal(struct db_context *db, const char *key,
@@ -48,8 +47,13 @@ static int regdb_fetch_values_internal(struct db_context *db, const char* key,
 				       struct regval_ctr *values);
 static bool regdb_store_values_internal(struct db_context *db, const char *key,
 					struct regval_ctr *values);
+static WERROR regdb_store_subkey_list(struct db_context *db, const char *parent,
+				      const char *key);
 
-static NTSTATUS create_sorted_subkeys(const char *key);
+static WERROR regdb_create_basekey(struct db_context *db, const char *key);
+static WERROR regdb_create_subkey_internal(struct db_context *db,
+					   const char *key,
+					   const char *subkey);
 
 /* List the deepest path into the registry.  All part components will be created.*/
 
@@ -114,113 +118,72 @@ static struct builtin_regkey_value builtin_registry_values[] = {
 	{ NULL, NULL, 0, { NULL } }
 };
 
-/**
- * Initialize a key in the registry:
- * create each component key of the specified path.
- */
-static WERROR init_registry_key_internal(struct db_context *db,
-					 const char *add_path)
+static WERROR create_key_recursive(struct db_context *db,
+				   char *path,
+				   const char *subkey)
 {
 	WERROR werr;
-	TALLOC_CTX *frame = talloc_stackframe();
-	char *path = NULL;
-	char *base = NULL;
-	char *remaining = NULL;
-	char *keyname;
-	char *subkeyname;
-	struct regsubkey_ctr *subkeys;
-	const char *p, *p2;
-
-	DEBUG(6, ("init_registry_key: Adding [%s]\n", add_path));
+	char *p;
 
-	path = talloc_strdup(frame, add_path);
-	base = talloc_strdup(frame, "");
-	if (!path || !base) {
-		werr = WERR_NOMEM;
-		goto fail;
+	if (subkey == NULL) {
+		return WERR_INVALID_PARAM;
 	}
-	p = path;
-
-	while (next_token_talloc(frame, &p, &keyname, "\\")) {
 
-		/* build up the registry path from the components */
+	if (path == NULL) {
+		return regdb_create_basekey(db, subkey);
+	}
 
-		if (*base) {
-			base = talloc_asprintf(frame, "%s\\", base);
-			if (!base) {
-				werr = WERR_NOMEM;
-				goto fail;
-			}
-		}
-		base = talloc_asprintf_append(base, "%s", keyname);
-		if (!base) {
-			werr = WERR_NOMEM;
-			goto fail;
-		}
+	p = strrchr_m(path, '\\');
 
-		/* get the immediate subkeyname (if we have one ) */
+	if (p == NULL) {
+		werr = create_key_recursive(db, NULL, path);
+	} else {
+		*p = '\0';
+		werr = create_key_recursive(db, path, p+1);
+		*p = '\\';
+	}
 
-		subkeyname = talloc_strdup(frame, "");
-		if (!subkeyname) {
-			werr = WERR_NOMEM;
-			goto fail;
-		}
-		if (*p) {
-			remaining = talloc_strdup(frame, p);
-			if (!remaining) {
-				werr = WERR_NOMEM;
-				goto fail;
-			}
-			p2 = remaining;
+	if (!W_ERROR_IS_OK(werr)) {
+		goto done;
+	}
 
-			if (!next_token_talloc(frame, &p2,
-						&subkeyname, "\\"))
-			{
-				subkeyname = talloc_strdup(frame,p2);
-				if (!subkeyname) {
-					werr = WERR_NOMEM;
-					goto fail;
-				}
-			}
-		}
+	werr = regdb_create_subkey_internal(db, path, subkey);
 
-		DEBUG(10,("init_registry_key: Storing key [%s] with "
-			  "subkey [%s]\n", base,
-			  *subkeyname ? subkeyname : "NULL"));
+done:
+	return werr;
+}
 
-		/* we don't really care if the lookup succeeds or not
-		 * since we are about to update the record.
-		 * We just want any subkeys already present */
+/**
+ * Initialize a key in the registry:
+ * create each component key of the specified path.
+ */
+static WERROR init_registry_key_internal(struct db_context *db,
+					 const char *add_path)
+{
+	char *subkey, *key;
+	WERROR werr;
+	TALLOC_CTX *frame = talloc_stackframe();
 
-		werr = regsubkey_ctr_init(frame, &subkeys);
-		if (!W_ERROR_IS_OK(werr)) {
-			DEBUG(0,("talloc() failure!\n"));
-			goto fail;
-		}
+	if (add_path == NULL) {
+		werr = WERR_INVALID_PARAM;
+		goto done;
+	}
 
-		werr = regdb_fetch_keys_internal(db, base, subkeys);
-		if (!W_ERROR_IS_OK(werr) &&
-		    !W_ERROR_EQUAL(werr, WERR_NOT_FOUND))
-		{
-			goto fail;
-		}
+	key = talloc_strdup(frame, add_path);
 
-		if (*subkeyname) {
-			werr = regsubkey_ctr_addkey(subkeys, subkeyname);
-			if (!W_ERROR_IS_OK(werr)) {
-				goto fail;
-			}
-		}
-		if (!regdb_store_keys_internal(db, base, subkeys)) {
-			werr = WERR_CAN_NOT_COMPLETE;
-			goto fail;
-		}
+	subkey = strrchr_m(key, '\\');
+	if (subkey == NULL) {
+		subkey = key;
+		key = NULL;
+	} else {
+		*subkey = '\0';
+		subkey++;
 	}
 
-	werr = WERR_OK;
+	werr = create_key_recursive(db, key, subkey);
 
-fail:
-	TALLOC_FREE(frame);
+done:
+	talloc_free(frame);
 	return werr;
 }
 
@@ -446,16 +409,16 @@ static int regdb_normalize_keynames_fn(struct db_record *rec,
 	return 0;
 }
 
-static WERROR regdb_store_regdb_version(uint32_t version)
+static WERROR regdb_store_regdb_version(struct db_context *db, uint32_t version)
 {
 	NTSTATUS status;
 	const char *version_keyname = "INFO/version";
 
-	if (!regdb) {
+	if (db == NULL) {
 		return WERR_CAN_NOT_COMPLETE;
 	}
 
-	status = dbwrap_trans_store_int32(regdb, version_keyname, version);
+	status = dbwrap_trans_store_int32(db, version_keyname, version);
 	if (!NT_STATUS_IS_OK(status)) {
 		DEBUG(1, ("regdb_store_regdb_version: error storing %s = %d: %s\n",
 			  version_keyname, version, nt_errstr(status)));
@@ -467,26 +430,119 @@ static WERROR regdb_store_regdb_version(uint32_t version)
 	}
 }
 
-static WERROR regdb_upgrade_v1_to_v2(void)
+static WERROR regdb_upgrade_v1_to_v2(struct db_context *db)
 {
 	TALLOC_CTX *mem_ctx;
 	int rc;
 	WERROR werr;
 
 	mem_ctx = talloc_stackframe();
-	if (mem_ctx == NULL) {
-		return WERR_NOMEM;
-	}
 
-	rc = regdb->traverse(regdb, regdb_normalize_keynames_fn, mem_ctx);
+	rc = regdb->traverse(db, regdb_normalize_keynames_fn, mem_ctx);
 
-	talloc_destroy(mem_ctx);
+	talloc_free(mem_ctx);
 
 	if (rc < 0) {
 		return WERR_REG_IO_FAILURE;
 	}
 
-	werr = regdb_store_regdb_version(REGVER_V2);
+	werr = regdb_store_regdb_version(db, REGVER_V2);
+	return werr;
+}
+
+static int regdb_upgrade_v2_to_v3_fn(struct db_record *rec, void *private_data)
+{
+	const char *keyname;
+	fstring subkeyname;
+	NTSTATUS status;
+	WERROR werr;
+	uint8_t *buf;
+	uint32_t buflen, len;
+	uint32_t num_items;
+	uint32_t i;
+
+	if (rec->key.dptr == NULL || rec->key.dsize == 0) {
+		return 0;
+	}
+
+	keyname = (const char *)rec->key.dptr;
+
+	if (strncmp(keyname, REG_SORTED_SUBKEYS_PREFIX,
+		    strlen(REG_SORTED_SUBKEYS_PREFIX)) == 0)
+	{
+		/* Delete the deprecated sorted subkeys cache. */
+
+		DEBUG(10, ("regdb_upgrade_v2_to_v3: deleting [%s]\n", keyname));
+
+		status = rec->delete_rec(rec);
+		if (!NT_STATUS_IS_OK(status)) {
+			DEBUG(0, ("regdb_upgrade_v2_to_v3: tdb_delete for [%s] "
+				  "failed!\n", keyname));
+			return 1;
+		}
+
+		return 0;
+	}
+
+	if (strncmp(keyname, REG_VALUE_PREFIX, strlen(REG_VALUE_PREFIX)) == 0) {
+		DEBUG(10, ("regdb_upgrade_v2_to_v3: skipping [%s]\n", keyname));
+		return 0;
+	}
+
+	if (strncmp(keyname, REG_SECDESC_PREFIX,
+		    strlen(REG_SECDESC_PREFIX)) == 0)
+	{
+		DEBUG(10, ("regdb_upgrade_v2_to_v3: skipping [%s]\n", keyname));
+		return 0;
+	}
+
+	/*
+	 * Found a regular subkey list record.
+	 * Walk the list and create the list record for those
+	 * subkeys that don't already have one.
+	 */
+	DEBUG(10, ("regdb_upgrade_v2_to_v3: scanning subkey list of [%s]\n",
+		   keyname));
+
+	buf = rec->value.dptr;
+	buflen = rec->value.dsize;
+
+	len = tdb_unpack(buf, buflen, "d", &num_items);
+	if (len == (uint32_t)-1) {
+		/* invalid or empty - skip */
+		return 0;
+	}
+
+	for (i=0; i<num_items; i++) {
+		len += tdb_unpack(buf+len, buflen-len, "f", subkeyname);
+		DEBUG(10, ("regdb_upgrade_v2_to_v3: "
+			   "writing subkey list for [%s\\%s]\n",
+			   keyname, subkeyname));
+		werr = regdb_store_subkey_list(regdb, keyname, subkeyname);
+		if (!W_ERROR_IS_OK(werr)) {
+			return 1;
+		}
+	}
+
+	return 0;
+}
+
+static WERROR regdb_upgrade_v2_to_v3(struct db_context *db)
+{
+	int rc;
+	WERROR werr;
+	TALLOC_CTX *frame = talloc_stackframe();
+
+	rc = regdb->traverse(db, regdb_upgrade_v2_to_v3_fn, frame);
+	if (rc < 0) {
+		werr = WERR_REG_IO_FAILURE;
+		goto done;
+	}
+
+	werr = regdb_store_regdb_version(db, REGVER_V3);
+
+done:
+	talloc_free(frame);
 	return werr;
 }
 
@@ -526,7 +582,7 @@ WERROR regdb_init(void)
 	DEBUG(10, ("regdb_init: registry db openend. refcount reset (%d)\n",
 		   regdb_refcount));
 
-	expected_version = REGVER_V2;
+	expected_version = REGVER_V3;
 
 	vers_id = dbwrap_fetch_int32(regdb, vstring);
 	if (vers_id == -1) {
@@ -534,7 +590,7 @@ WERROR regdb_init(void)
 			   "(got %d), initializing to version %d\n",
 			   vers_id, expected_version));
 
-		werr = regdb_store_regdb_version(expected_version);
+		werr = regdb_store_regdb_version(regdb, expected_version);
 		return werr;
 	}
 
@@ -545,29 +601,42 @@ WERROR regdb_init(void)
 		return WERR_CAN_NOT_COMPLETE;
 	}
 
-	if (vers_id == REGVER_V1) {
-		DEBUG(10, ("regdb_init: got registry db version %d, upgrading "
-			   "to version %d\n", REGVER_V1, REGVER_V2));
+	if (regdb->transaction_start(regdb) != 0) {
+		return WERR_REG_IO_FAILURE;
+	}
 
-		if (regdb->transaction_start(regdb) != 0) {
-			return WERR_REG_IO_FAILURE;
-		}
+	if (vers_id == REGVER_V1) {
+		DEBUG(10, ("regdb_init: upgrading registry fromversion %d "
+			   "to %d\n", REGVER_V1, REGVER_V2));
 
-		werr = regdb_upgrade_v1_to_v2();
+		werr = regdb_upgrade_v1_to_v2(regdb);
 		if (!W_ERROR_IS_OK(werr)) {
 			regdb->transaction_cancel(regdb);
 			return werr;
 		}
 
-		if (regdb->transaction_commit(regdb) != 0) {
-			return WERR_REG_IO_FAILURE;
+		vers_id = REGVER_V2;
+	}
+
+	if (vers_id == REGVER_V2) {
+		DEBUG(10, ("regdb_init: upgrading registry from version %d "
+			   "to %d\n", REGVER_V2, REGVER_V3));
+
+		werr = regdb_upgrade_v2_to_v3(regdb);
+		if (!W_ERROR_IS_OK(werr)) {
+			regdb->transaction_cancel(regdb);
+			return werr;
 		}
 
-		vers_id = REGVER_V2;
+		vers_id = REGVER_V3;
 	}
 
 	/* future upgrade code should go here */
 
+	if (regdb->transaction_commit(regdb) != 0) {
+		return WERR_REG_IO_FAILURE;
+	}
+
 	return WERR_OK;
 }
 
@@ -686,7 +755,7 @@ static WERROR regdb_delete_key_with_prefix(struct db_context *db,
 
 	werr = ntstatus_to_werror(dbwrap_delete_bystring(db, path));
 
-	/* treat "not" found" as ok */
+	/* treat "not found" as ok */
 	if (W_ERROR_EQUAL(werr, WERR_NOT_FOUND)) {
 		werr = WERR_OK;
 	}
@@ -712,12 +781,6 @@ static WERROR regdb_delete_subkeylist(struct db_context *db, const char *keyname
 	return regdb_delete_key_with_prefix(db, keyname, NULL);
 }
 
-static WERROR regdb_delete_sorted_subkeys(struct db_context *db,
-					  const char *keyname)
-{
-	return regdb_delete_key_with_prefix(db, keyname, REG_SORTED_SUBKEYS_PREFIX);
-}
-
 
 static WERROR regdb_delete_key_lists(struct db_context *db, const char *keyname)
 {
@@ -737,14 +800,6 @@ static WERROR regdb_delete_key_lists(struct db_context *db, const char *keyname)
 		goto done;
 	}
 
-	werr = regdb_delete_sorted_subkeys(db, keyname);
-	if (!W_ERROR_IS_OK(werr)) {
-		DEBUG(1, (__location__ " Deleting %s\\%s failed: %s\n",
-			  REG_SORTED_SUBKEYS_PREFIX, keyname,
-			  win_errstr(werr)));
-		goto done;
-	}
-
 	werr = regdb_delete_subkeylist(db, keyname);
 	if (!W_ERROR_IS_OK(werr)) {
 		DEBUG(1, (__location__ " Deleting %s failed: %s\n",
@@ -847,12 +902,6 @@ static WERROR regdb_store_keys_internal2(struct db_context *db,
 	dbuf.dsize = len;
 	werr = ntstatus_to_werror(dbwrap_store_bystring(db, keyname, dbuf,
 							TDB_REPLACE));
-	W_ERROR_NOT_OK_GOTO_DONE(werr);
-


-- 
Samba Shared Repository


More information about the samba-cvs mailing list