]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
registry: fetch regdb_fetch_keys() when a key exists but not its subkey-record.
authorMichael Adam <obnox@samba.org>
Tue, 8 Jul 2008 15:10:01 +0000 (17:10 +0200)
committerMichael Adam <obnox@samba.org>
Tue, 8 Jul 2008 15:10:01 +0000 (17:10 +0200)
According to the new policy a key (that is not a base key) exists,
iff it exists in the subkey list of its parent key.

Usually this subkeylist is present, but in a transaction-less
dbwrap backend (ctdb), a failing write can leave an "incomplete"
key without its own subkeylist-record. (Otherwise such an
incomplete key can be generated with e.g. tdbtool.)
For such a key net registry enumerate (e.g.) would fail.
This commit fixes this behaviour of regdb_fetch_keys().

Michael

source/registry/reg_backend_db.c

index 0d976be10d47adb4364e757c47546f561c1102e8..b1e3e2b5a3c7b536658704d88f2ff403157eaa8d 100644 (file)
@@ -929,21 +929,22 @@ int regdb_fetch_keys(const char *key, REGSUBKEY_CTR *ctr)
        DEBUG(11,("regdb_fetch_keys: Enter key => [%s]\n", key ? key : "NULL"));
 
        if (!regdb_key_exists(key)) {
-               goto fail;
+               goto done;
        }
 
        ctr->seqnum = regdb_get_seqnum();
 
        value = regdb_fetch_key_internal(frame, key);
 
-       buf = value.dptr;
-       buflen = value.dsize;
-
-       if ( !buf ) {
-               DEBUG(5,("regdb_fetch_keys: tdb lookup failed to locate key [%s]\n", key));
-               goto fail;
+       if (value.dptr == NULL) {
+               DEBUG(10, ("regdb_fetch_keys: no subkeys found for key [%s]\n",
+                          key));
+               ret = 0;
+               goto done;
        }
 
+       buf = value.dptr;
+       buflen = value.dsize;
        len = tdb_unpack( buf, buflen, "d", &num_items);
 
        for (i=0; i<num_items; i++) {
@@ -952,14 +953,14 @@ int regdb_fetch_keys(const char *key, REGSUBKEY_CTR *ctr)
                if (!W_ERROR_IS_OK(werr)) {
                        DEBUG(5, ("regdb_fetch_keys: regsubkey_ctr_addkey "
                                  "failed: %s\n", dos_errstr(werr)));
-                       goto fail;
+                       goto done;
                }
        }
 
        DEBUG(11,("regdb_fetch_keys: Exit [%d] items\n", num_items));
 
        ret = num_items;
- fail:
+done:
        TALLOC_FREE(frame);
        return ret;
 }