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