ldb_get_value_by_id: Fix the return of the default value
authorMatthias Dieter Wallnöfer <mwallnoefer@yahoo.de>
Sat, 13 Sep 2008 10:10:00 +0000 (12:10 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Tue, 21 Oct 2008 12:40:41 +0000 (14:40 +0200)
The return of the values of a certain key has been broken since I've introduced the default value.
Now the behaviour is correct: If no default value exists, start with index zero to fetch the other values. Otherwise let zero be the default value and enumerate the others starting with one.

source4/lib/registry/ldb.c

index 18054ac89b6cd19f39c4fe7351927f26923c798e..42c99fbb247f0a7a44351be84032d3dedf873806 100644 (file)
@@ -1,7 +1,8 @@
 /*
    Unix SMB/CIFS implementation.
    Registry interface
-   Copyright (C) Jelmer Vernooij  2004-2007.
+   Copyright (C) 2004-2007, Jelmer Vernooij, jelmer@samba.org
+   Copyright (C) 2008 Matthias Dieter Wallnöfer, mwallnoefer@yahoo.de
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -318,23 +319,23 @@ static WERROR ldb_get_value_by_id(TALLOC_CTX *mem_ctx, struct hive_key *k,
 {
        struct ldb_key_data *kd = talloc_get_type(k, struct ldb_key_data);
 
-       if (idx == 0) {
-               /* default value */
-               return ldb_get_default_value(mem_ctx, k, name, data_type, data);
-       } else {
-               /* normal value */
+       /* if default value exists, give it back */
+       if (W_ERROR_IS_OK(ldb_get_default_value(mem_ctx, k, name, data_type, data)))
+               if (idx == 0)
+                       return WERR_OK;
+               else
+                       --idx;
 
-               /* Do the search if necessary */
-               if (kd->values == NULL) {
-                       W_ERROR_NOT_OK_RETURN(cache_values(kd));
-               }
+       /* Do the search if necessary */
+       if (kd->values == NULL) {
+               W_ERROR_NOT_OK_RETURN(cache_values(kd));
+       }
 
-               if (idx >= kd->value_count)
-                       return WERR_NO_MORE_ITEMS;
+       if (idx >= kd->value_count)
+               return WERR_NO_MORE_ITEMS;
 
-               reg_ldb_unpack_value(mem_ctx, lp_iconv_convenience(global_loadparm),
+       reg_ldb_unpack_value(mem_ctx, lp_iconv_convenience(global_loadparm),
                         kd->values[idx], name, data_type, data);
-       }
 
        return WERR_OK;
 }