Alexandre Julliard : server: Make the standard registry key creation non-recursive.
Alexandre Julliard
julliard at winehq.org
Mon Mar 1 09:27:38 CST 2010
Module: wine
Branch: master
Commit: 8eca1da43c25d6bd3fa82d853e58933021f82d95
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8eca1da43c25d6bd3fa82d853e58933021f82d95
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Mar 1 14:14:50 2010 +0100
server: Make the standard registry key creation non-recursive.
---
server/registry.c | 41 +++++++++++++++++++----------------------
1 files changed, 19 insertions(+), 22 deletions(-)
diff --git a/server/registry.c b/server/registry.c
index 52b65a7..ea7ea20 100644
--- a/server/registry.c
+++ b/server/registry.c
@@ -656,9 +656,8 @@ static struct key *create_key( struct key *key, const struct unicode_str *name,
const struct unicode_str *class, unsigned int options,
unsigned int attributes, int *created )
{
- struct key *base;
int index;
- struct unicode_str token;
+ struct unicode_str token, next;
if (key->flags & KEY_DELETED) /* we cannot create a subkey under a deleted key */
{
@@ -676,16 +675,14 @@ static struct key *create_key( struct key *key, const struct unicode_str *name,
key = subkey;
get_path_token( name, &token );
if (!token.len) break;
- if (!(subkey = follow_symlink( subkey, 0 )))
+ if (!(key = follow_symlink( key, 0 )))
{
set_error( STATUS_OBJECT_NAME_NOT_FOUND );
return NULL;
}
}
- /* create the remaining part */
-
- if (!token.len)
+ if (!token.len) /* the key already exists */
{
if (options & REG_OPTION_CREATE_LINK)
{
@@ -697,8 +694,20 @@ static struct key *create_key( struct key *key, const struct unicode_str *name,
set_error( STATUS_OBJECT_NAME_NOT_FOUND );
return NULL;
}
- goto done;
+ if (debug_level > 1) dump_operation( key, NULL, "Open" );
+ grab_object( key );
+ return key;
}
+
+ /* token must be the last path component at this point */
+ next = token;
+ get_path_token( name, &next );
+ if (next.len)
+ {
+ set_error( STATUS_OBJECT_NAME_NOT_FOUND );
+ return NULL;
+ }
+
if ((key->flags & KEY_VOLATILE) && !(options & REG_OPTION_VOLATILE))
{
set_error( STATUS_CHILD_MUST_BE_VOLATILE );
@@ -707,23 +716,11 @@ static struct key *create_key( struct key *key, const struct unicode_str *name,
*created = 1;
make_dirty( key );
if (!(key = alloc_subkey( key, &token, index, current_time ))) return NULL;
- base = key;
- for (;;)
- {
- if (options & REG_OPTION_VOLATILE) key->flags |= KEY_VOLATILE;
- else key->flags |= KEY_DIRTY;
- get_path_token( name, &token );
- if (!token.len) break;
- /* we know the index is always 0 in a new key */
- if (!(key = alloc_subkey( key, &token, 0, current_time )))
- {
- free_subkey( base, index );
- return NULL;
- }
- }
+
if (options & REG_OPTION_CREATE_LINK) key->flags |= KEY_SYMLINK;
+ if (options & REG_OPTION_VOLATILE) key->flags |= KEY_VOLATILE;
+ else key->flags |= KEY_DIRTY;
- done:
if (debug_level > 1) dump_operation( key, NULL, "Create" );
if (class && class->len)
{
More information about the wine-cvs
mailing list