Author: jelmer Date: 2007-08-26 14:03:29 +0000 (Sun, 26 Aug 2007) New Revision: 24664
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=24664 Log: Fix last test. Modified: branches/4.0-regwrite/ branches/4.0-regwrite/source/lib/registry/hive.c branches/4.0-regwrite/source/lib/registry/ldb.c branches/4.0-regwrite/source/lib/registry/local.c branches/4.0-regwrite/source/lib/registry/samba.c branches/4.0-regwrite/source/lib/registry/tests/registry.c branches/4.0-regwrite/source/lib/registry/util.c Changeset: Property changes on: branches/4.0-regwrite ___________________________________________________________________ Name: bzr:revision-info ...skipped... Name: bzr:revision-id:v3-trunk0 ...skipped... Modified: branches/4.0-regwrite/source/lib/registry/hive.c =================================================================== --- branches/4.0-regwrite/source/lib/registry/hive.c 2007-08-26 12:46:40 UTC (rev 24663) +++ branches/4.0-regwrite/source/lib/registry/hive.c 2007-08-26 14:03:29 UTC (rev 24664) @@ -71,6 +71,8 @@ const char *name, const char *classname, struct security_descriptor *desc, struct hive_key **key) { + SMB_ASSERT(strchr(name, '\\') == NULL); + return parent_key->ops->add_key(ctx, parent_key, name, classname, desc, key); } @@ -83,8 +85,7 @@ const struct hive_key *key, const char *name, struct hive_key **subkey) { - return key->ops->get_key_by_name(mem_ctx, key, name, - subkey); + return key->ops->get_key_by_name(mem_ctx, key, name, subkey); } WERROR hive_enum_key(TALLOC_CTX *mem_ctx, Modified: branches/4.0-regwrite/source/lib/registry/ldb.c =================================================================== --- branches/4.0-regwrite/source/lib/registry/ldb.c 2007-08-26 12:46:40 UTC (rev 24663) +++ branches/4.0-regwrite/source/lib/registry/ldb.c 2007-08-26 14:03:29 UTC (rev 24664) @@ -295,11 +295,13 @@ ret = ldb_search(c, ldap_path, LDB_SCOPE_BASE, "(key=*)", NULL, &res); if (ret != LDB_SUCCESS) { - DEBUG(0, ("Error opening key '%s': %s\n", ldb_dn_get_linearized(ldap_path), ldb_errstring(c))); + DEBUG(0, ("Error opening key '%s': %s\n", + ldb_dn_get_linearized(ldap_path), ldb_errstring(c))); return WERR_FOOBAR; } else if (res->count == 0) { + DEBUG(0, ("Key '%s' not found\n", ldb_dn_get_linearized(ldap_path))); talloc_free(res); - return WERR_BADFILE; + return WERR_NOT_FOUND; } newkd = talloc_zero(mem_ctx, struct ldb_key_data); @@ -328,7 +330,7 @@ wrap = ldb_wrap_connect(parent_ctx, location, session_info, credentials, 0, NULL); - if(!wrap) { + if (wrap == NULL) { DEBUG(1, (__FILE__": unable to connect\n")); return WERR_FOOBAR; } @@ -368,8 +370,10 @@ if (ret < 0) { DEBUG(1, ("ldb_msg_add: %s\n", ldb_errstring(parentkd->ldb))); return WERR_FOOBAR; - } + } + DEBUG(2, ("key added: %s\n", ldb_dn_get_linearized(msg->dn))); + newkd = talloc_zero(mem_ctx, struct ldb_key_data); newkd->ldb = talloc_reference(newkd, parentkd->ldb); newkd->key.ops = ®_backend_ldb; Modified: branches/4.0-regwrite/source/lib/registry/local.c =================================================================== --- branches/4.0-regwrite/source/lib/registry/local.c 2007-08-26 12:46:40 UTC (rev 24663) +++ branches/4.0-regwrite/source/lib/registry/local.c 2007-08-26 14:03:29 UTC (rev 24664) @@ -76,18 +76,19 @@ { char *orig = talloc_strdup(mem_ctx, path), *curbegin = orig, - *curend = strchr(path, '\\'); + *curend = strchr(orig, '\\'); struct local_key *local_parent = talloc_get_type(parent, struct local_key); struct hive_key *curkey = local_parent->hive_key; WERROR error; const char **elements = NULL; int el; - if (elements != NULL) { + if (local_parent->path.elements != NULL) { elements = talloc_array(mem_ctx, const char *, str_list_length(local_parent->path.elements) + 1); - for (el = 0; local_parent->path.elements[el]; el++) { - elements[el] = local_parent->path.elements[el]; + for (el = 0; local_parent->path.elements[el] != NULL; el++) { + elements[el] = talloc_reference(elements, + local_parent->path.elements[el]); } elements[el] = NULL; } else { @@ -101,8 +102,10 @@ elements = talloc_realloc(mem_ctx, elements, const char *, el+2); elements[el] = talloc_strdup(elements, curbegin); el++; + elements[el] = NULL; error = hive_get_key_by_name(mem_ctx, curkey, curbegin, &curkey); if (!W_ERROR_IS_OK(error)) { + DEBUG(2, ("Opening key %s failed: %s\n", curbegin, win_errstr(error))); talloc_free(orig); return error; } @@ -167,15 +170,17 @@ const char **elements; int i; + SMB_ASSERT(strchr(name, '\\') == NULL); + W_ERROR_NOT_OK_RETURN(hive_key_add_name(mem_ctx, local_parent->hive_key, name, key_class, security, &hivekey)); if (local_parent->path.elements != NULL) { elements = talloc_array(hivekey, const char *, - str_list_length(local_parent->path.elements)+2); + str_list_length(local_parent->path.elements)+2); for (i = 0; local_parent->path.elements[i] != NULL; i++) { elements[i] = talloc_reference(elements, - local_parent->path.elements[i]); + local_parent->path.elements[i]); } } else { elements = talloc_array(hivekey, const char *, 2); Modified: branches/4.0-regwrite/source/lib/registry/samba.c =================================================================== --- branches/4.0-regwrite/source/lib/registry/samba.c 2007-08-26 12:46:40 UTC (rev 24663) +++ branches/4.0-regwrite/source/lib/registry/samba.c 2007-08-26 14:03:29 UTC (rev 24664) @@ -62,6 +62,8 @@ mount_samba_hive(*ctx, session_info, credentials, "hkcr", HKEY_CLASSES_ROOT); + /* FIXME: Should be mounted from NTUSER.DAT in the home directory of the + * current user */ mount_samba_hive(*ctx, session_info, credentials, "hkcu", HKEY_CURRENT_USER); Modified: branches/4.0-regwrite/source/lib/registry/tests/registry.c =================================================================== --- branches/4.0-regwrite/source/lib/registry/tests/registry.c 2007-08-26 12:46:40 UTC (rev 24663) +++ branches/4.0-regwrite/source/lib/registry/tests/registry.c 2007-08-26 14:03:29 UTC (rev 24664) @@ -96,17 +96,19 @@ error = reg_key_add_abs(tctx, rctx, "HKEY_CLASSES_ROOT\\bloe", 0, NULL, &result1); torture_assert_werr_ok(tctx, error, "create lowest"); - error = reg_key_add_abs(tctx, rctx, "HKEY_CLASSES_ROOT\\bla\\bloe", 0, NULL, &result1); + error = reg_key_add_abs(tctx, rctx, "HKEY_CLASSES_ROOT\\bloe\\bla", 0, NULL, &result1); torture_assert_werr_ok(tctx, error, "create nested"); error = reg_get_predefined_key(rctx, HKEY_CLASSES_ROOT, &root); torture_assert_werr_ok(tctx, error, "getting predefined key failed"); - error = reg_open_key(tctx, root, "bla\\bloe", &result2); - torture_assert_werr_ok(tctx, error, - "opening key"); + error = reg_open_key(tctx, root, "bloe", &result2); + torture_assert_werr_ok(tctx, error, "opening key"); + error = reg_open_key(tctx, root, "bloe\\bla", &result2); + torture_assert_werr_ok(tctx, error, "opening key"); + return true; } Modified: branches/4.0-regwrite/source/lib/registry/util.c =================================================================== --- branches/4.0-regwrite/source/lib/registry/util.c 2007-08-26 12:46:40 UTC (rev 24663) +++ branches/4.0-regwrite/source/lib/registry/util.c 2007-08-26 14:03:29 UTC (rev 24664) @@ -151,14 +151,16 @@ int predeflength; char *predefname; - if(strchr(name, '\\')) predeflength = strchr(name, '\\')-name; - else predeflength = strlen(name); + if (strchr(name, '\\') != NULL) + predeflength = strchr(name, '\\')-name; + else + predeflength = strlen(name); predefname = talloc_strndup(mem_ctx, name, predeflength); error = reg_get_predefined_key_by_name(handle, predefname, &predef); talloc_free(predefname); - if(!W_ERROR_IS_OK(error)) { + if (!W_ERROR_IS_OK(error)) { return error; } @@ -181,14 +183,14 @@ return WERR_FOOBAR; } - parent_name = talloc_strndup(mem_ctx, path, strrchr(path, '\\')-1-path); + parent_name = talloc_strndup(mem_ctx, path, strrchr(path, '\\')-path); error = reg_open_key_abs(mem_ctx, ctx, parent_name, parent); if (!W_ERROR_IS_OK(error)) { return error; } - *name = talloc_strdup(mem_ctx, strchr(path, '\\')+1); + *name = talloc_strdup(mem_ctx, strrchr(path, '\\')+1); return WERR_OK; } @@ -215,7 +217,9 @@ } WERROR reg_key_add_abs(TALLOC_CTX *mem_ctx, struct registry_context *ctx, - const char *path, uint32_t access_mask, struct security_descriptor *sec_desc, struct registry_key **result) + const char *path, uint32_t access_mask, + struct security_descriptor *sec_desc, + struct registry_key **result) { struct registry_key *parent; const char *n; @@ -226,9 +230,13 @@ } error = get_abs_parent(mem_ctx, ctx, path, &parent, &n); - if (W_ERROR_IS_OK(error)) { - error = reg_key_add_name(mem_ctx, parent, n, NULL, sec_desc, result); + if (!W_ERROR_IS_OK(error)) { + DEBUG(2, ("Opening parent of %s failed with %s\n", path, + win_errstr(error))); + return error; } + error = reg_key_add_name(mem_ctx, parent, n, NULL, sec_desc, result); + return error; }