r5680: Don't crash if none of the predefined keys is available (reported by Alexander)
authorJelmer Vernooij <jelmer@samba.org>
Mon, 7 Mar 2005 12:02:48 +0000 (12:02 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:10:59 +0000 (13:10 -0500)
(This used to be commit 0d789872a890062b0b95aa039bb853bb6c07b2d0)

source4/lib/registry/tools/regshell.c

index ac7dbca49bd3081b759d3ec3a23d4621ef5db369..ee80837babd844f3ee8a187887a80d81f30e6c85 100644 (file)
@@ -408,8 +408,34 @@ static char **reg_completion(const char *text, int start, int end)
        }
 
        if (h) {
-               /*FIXME: What if HKEY_CLASSES_ROOT is not present ? */
-               reg_get_predefined_key(h, HKEY_CLASSES_ROOT, &curkey);
+               enum reg_predefined_key try_hkeys[] = {
+                       HKEY_CLASSES_ROOT,
+                       HKEY_CURRENT_USER,
+                       HKEY_LOCAL_MACHINE,
+                       HKEY_USERS,
+                       HKEY_PERFORMANCE_DATA,
+                       HKEY_CURRENT_CONFIG,
+                       HKEY_DYN_DATA,
+                       HKEY_PERFORMANCE_TEXT,
+                       HKEY_PERFORMANCE_NLSTEXT,
+                       0
+               };
+               int i;
+
+               for (i = 0; try_hkeys[i]; i++) {
+                       WERROR err;
+                       err = reg_get_predefined_key(h, HKEY_CLASSES_ROOT, &curkey);
+                       if (W_ERROR_IS_OK(err)) {
+                               break;
+                       } else {
+                               curkey = NULL;
+                       }
+               }
+       }
+
+       if (!curkey) {
+               fprintf(stderr, "Unable to access any of the predefined keys\n");
+               return -1;
        }
        
        poptFreeContext(pc);