diff options
author | Michael Adam <obnox@samba.org> | 2008-07-08 17:10:01 +0200 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2008-07-08 17:10:01 +0200 |
commit | 70d8e57c174d2dddf8d05ab81cf2edf31d10aebd (patch) | |
tree | beb2d973e2b2ea96ae4214f8e6fc3c3a8d2d337e /source3/registry | |
parent | fddf606651a41c011e4df06115696f535e3dea09 (diff) | |
download | samba-70d8e57c174d2dddf8d05ab81cf2edf31d10aebd.tar.gz samba-70d8e57c174d2dddf8d05ab81cf2edf31d10aebd.tar.bz2 samba-70d8e57c174d2dddf8d05ab81cf2edf31d10aebd.zip |
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
(This used to be commit f329aaf0452cc9bbad9fb6f67dac00bf8d1ef128)
Diffstat (limited to 'source3/registry')
-rw-r--r-- | source3/registry/reg_backend_db.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 0d976be10d..b1e3e2b5a3 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/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<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; } |