summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Adam <obnox@samba.org>2008-07-08 17:10:01 +0200
committerMichael Adam <obnox@samba.org>2008-07-08 17:10:01 +0200
commit70d8e57c174d2dddf8d05ab81cf2edf31d10aebd (patch)
treebeb2d973e2b2ea96ae4214f8e6fc3c3a8d2d337e
parentfddf606651a41c011e4df06115696f535e3dea09 (diff)
downloadsamba-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)
-rw-r--r--source3/registry/reg_backend_db.c19
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;
}