From: Michael Adam Date: Tue, 8 Jul 2008 15:10:01 +0000 (+0200) Subject: registry: fetch regdb_fetch_keys() when a key exists but not its subkey-record. X-Git-Tag: samba-3.3.0pre1~611 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f329aaf0452cc9bbad9fb6f67dac00bf8d1ef128;p=thirdparty%2Fsamba.git registry: fetch regdb_fetch_keys() when a key exists but not its subkey-record. 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 --- diff --git a/source/registry/reg_backend_db.c b/source/registry/reg_backend_db.c index 0d976be10d4..b1e3e2b5a3c 100644 --- a/source/registry/reg_backend_db.c +++ b/source/registry/reg_backend_db.c @@ -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