s4/registry/py: use unsigned ParseTuple format for unsigned value
[sfrench/samba-autobuild/.git] / source4 / lib / registry / ldb.c
index 541d658444a03d2ed5965fa5aef78ca9546fbe36..8bb6fd5c10f2006352e846552026d6d1745311b1 100644 (file)
@@ -20,8 +20,8 @@
 
 #include "includes.h"
 #include "registry.h"
-#include "lib/ldb/include/ldb.h"
-#include "lib/ldb/include/ldb_errors.h"
+#include <ldb.h>
+#include <ldb_errors.h>
 #include "ldb_wrap.h"
 #include "librpc/gen_ndr/winreg.h"
 #include "param/param.h"
@@ -65,7 +65,7 @@ static void reg_ldb_unpack_value(TALLOC_CTX *mem_ctx,
                        /* The data should be provided as UTF16 string */
                        convert_string_talloc(mem_ctx, CH_UTF8, CH_UTF16,
                                              val->data, val->length,
-                                             (void **)&data->data, &data->length, false);
+                                             (void **)&data->data, &data->length);
                } else {
                        data->data = NULL;
                        data->length = 0;
@@ -159,8 +159,7 @@ static struct ldb_message *reg_ldb_pack_value(struct ldb_context *ctx,
                        /* The data is provided as UTF16 string */
                        ret2 = convert_string_talloc(mem_ctx, CH_UTF16, CH_UTF8,
                                                     (void *)data.data, data.length,
-                                                    (void **)&val->data, &val->length,
-                                                    false);
+                                                    (void **)&val->data, &val->length);
                        if (ret2) {
                                ret = ldb_msg_add_value(msg, "data", val, NULL);
                        } else {
@@ -201,7 +200,7 @@ static struct ldb_message *reg_ldb_pack_value(struct ldb_context *ctx,
                                char *conv_str;
 
                                conv_str = talloc_asprintf(msg, "0x%16.16llx",
-                                                          BVAL(data.data, 0));
+                                                          (unsigned long long)BVAL(data.data, 0));
                                if (conv_str == NULL) {
                                        talloc_free(msg);
                                        return NULL;
@@ -277,44 +276,46 @@ static struct ldb_dn *reg_path_to_ldb(TALLOC_CTX *mem_ctx,
                                      const char *path, const char *add)
 {
        struct ldb_dn *ret;
-       char *mypath = talloc_strdup(mem_ctx, path);
+       char *mypath;
        char *begin;
        struct ldb_key_data *kd = talloc_get_type(from, struct ldb_key_data);
        struct ldb_context *ldb = kd->ldb;
 
+       mypath = talloc_strdup(mem_ctx, path);
+       if (mypath == NULL) {
+               return NULL;
+       }
+
        ret = ldb_dn_new(mem_ctx, ldb, add);
        if (!ldb_dn_validate(ret)) {
                talloc_free(ret);
                return NULL;
        }
 
-       while (mypath) {
-               char *keyname;
-
-               begin = strrchr(mypath, '\\');
+       if (!ldb_dn_add_base(ret, kd->dn)) {
+               talloc_free(ret);
+               return NULL;
+       }
 
-               if (begin) keyname = begin + 1;
-               else keyname = mypath;
+       while (mypath[0] != '\0') {
+               begin = strchr(mypath, '\\');
+               if (begin != NULL) {
+                       *begin = '\0';
+               }
 
-               if (keyname[0] != '\0') {
-                       if (!ldb_dn_add_base_fmt(ret, "key=%s",
-                                                reg_ldb_escape(mem_ctx,
-                                                               keyname)))
-                       {
-                               talloc_free(ret);
-                               return NULL;
-                       }
+               if (!ldb_dn_add_child_fmt(ret, "key=%s",
+                                         reg_ldb_escape(mem_ctx, mypath))) {
+                       talloc_free(ret);
+                       return NULL;
                }
 
-               if(begin) {
-                       *begin = '\0';
+               if (begin != NULL) {
+                       mypath = begin + 1;
                } else {
                        break;
                }
        }
 
-       ldb_dn_add_base(ret, kd->dn);
-
        return ret;
 }
 
@@ -407,7 +408,8 @@ static WERROR ldb_get_default_value(TALLOC_CTX *mem_ctx,
        struct ldb_result *res;
        int ret;
 
-       ret = ldb_search(c, mem_ctx, &res, kd->dn, LDB_SCOPE_BASE, attrs, "(dn=*)");
+       ret = ldb_search(c, mem_ctx, &res, kd->dn, LDB_SCOPE_BASE, attrs,
+                        NULL);
 
        if (ret != LDB_SUCCESS) {
                DEBUG(0, ("Error getting default value for '%s': %s\n",
@@ -415,8 +417,10 @@ static WERROR ldb_get_default_value(TALLOC_CTX *mem_ctx,
                return WERR_FOOBAR;
        }
 
-       if (res->count == 0 || res->msgs[0]->num_elements == 0)
-               return WERR_BADFILE;
+       if (res->count == 0 || res->msgs[0]->num_elements == 0) {
+               talloc_free(res);
+               return WERR_FILE_NOT_FOUND;
+       }
 
        if ((data_type != NULL) && (data != NULL)) {
                reg_ldb_unpack_value(mem_ctx, res->msgs[0], name, data_type,
@@ -464,10 +468,6 @@ static WERROR ldb_get_value(TALLOC_CTX *mem_ctx, struct hive_key *k,
        const char *res_name;
        uint32_t idx;
 
-       if (name == NULL) {
-               return WERR_INVALID_PARAM;
-       }
-
        /* the default value was requested, give it back */
        if (name[0] == '\0') {
                return ldb_get_default_value(mem_ctx, k, NULL, data_type, data);
@@ -488,7 +488,7 @@ static WERROR ldb_get_value(TALLOC_CTX *mem_ctx, struct hive_key *k,
                }
        }
 
-       return WERR_BADFILE;
+       return WERR_FILE_NOT_FOUND;
 }
 
 static WERROR ldb_open_key(TALLOC_CTX *mem_ctx, const struct hive_key *h,
@@ -501,14 +501,11 @@ static WERROR ldb_open_key(TALLOC_CTX *mem_ctx, const struct hive_key *h,
        struct ldb_key_data *kd = talloc_get_type(h, struct ldb_key_data);
        struct ldb_context *c = kd->ldb;
 
-       if (name == NULL) {
-               return WERR_INVALID_PARAM;
-       }
-
        ldb_path = reg_path_to_ldb(mem_ctx, h, name, NULL);
        W_ERROR_HAVE_NO_MEMORY(ldb_path);
 
-       ret = ldb_search(c, mem_ctx, &res, ldb_path, LDB_SCOPE_BASE, NULL, "(key=*)");
+       ret = ldb_search(c, mem_ctx, &res, ldb_path, LDB_SCOPE_BASE, NULL,
+                        NULL);
 
        if (ret != LDB_SUCCESS) {
                DEBUG(3, ("Error opening key '%s': %s\n",
@@ -518,7 +515,7 @@ static WERROR ldb_open_key(TALLOC_CTX *mem_ctx, const struct hive_key *h,
                DEBUG(3, ("Key '%s' not found\n",
                        ldb_dn_get_linearized(ldb_path)));
                talloc_free(res);
-               return WERR_BADFILE;
+               return WERR_FILE_NOT_FOUND;
        }
 
        newkd = talloc_zero(mem_ctx, struct ldb_key_data);
@@ -548,7 +545,7 @@ WERROR reg_open_ldb_file(TALLOC_CTX *parent_ctx, const char *location,
        struct ldb_message *attrs_msg;
 
        if (location == NULL)
-               return WERR_INVALID_PARAM;
+               return WERR_INVALID_PARAMETER;
 
        wrap = ldb_wrap_connect(parent_ctx, ev_ctx, lp_ctx,
                                location, session_info, credentials, 0);
@@ -591,10 +588,6 @@ static WERROR ldb_add_key(TALLOC_CTX *mem_ctx, const struct hive_key *parent,
        struct ldb_key_data *newkd;
        int ret;
 
-       if (name == NULL) {
-               return WERR_INVALID_PARAM;
-       }
-
        ldb_path = reg_path_to_ldb(mem_ctx, parent, name, NULL);
        W_ERROR_HAVE_NO_MEMORY(ldb_path);
 
@@ -647,21 +640,29 @@ static WERROR ldb_del_value(TALLOC_CTX *mem_ctx, struct hive_key *key,
        struct ldb_message *msg;
        struct ldb_dn *childdn;
 
-       if (child == NULL) {
-               return WERR_INVALID_PARAM;
-       }
-
        if (child[0] == '\0') {
                /* default value */
                msg = talloc_zero(mem_ctx, struct ldb_message);
                W_ERROR_HAVE_NO_MEMORY(msg);
                msg->dn = ldb_dn_copy(msg, kd->dn);
                W_ERROR_HAVE_NO_MEMORY(msg->dn);
-               ldb_msg_add_empty(msg, "data", LDB_FLAG_MOD_DELETE, NULL);
-               ldb_msg_add_empty(msg, "type", LDB_FLAG_MOD_DELETE, NULL);
+               ret = ldb_msg_add_empty(msg, "data", LDB_FLAG_MOD_DELETE, NULL);
+               if (ret != LDB_SUCCESS) {
+                       return WERR_FOOBAR;
+               }
+               ret = ldb_msg_add_empty(msg, "type", LDB_FLAG_MOD_DELETE,
+                                       NULL);
+               if (ret != LDB_SUCCESS) {
+                       return WERR_FOOBAR;
+               }
 
                ret = ldb_modify(kd->ldb, msg);
-               if (ret != LDB_SUCCESS) {
+
+               talloc_free(msg);
+
+               if (ret == LDB_ERR_NO_SUCH_ATTRIBUTE) {
+                       return WERR_FILE_NOT_FOUND;
+               } else if (ret != LDB_SUCCESS) {
                        DEBUG(1, ("ldb_del_value: %s\n", ldb_errstring(kd->ldb)));
                        return WERR_FOOBAR;
                }
@@ -680,7 +681,7 @@ static WERROR ldb_del_value(TALLOC_CTX *mem_ctx, struct hive_key *key,
                talloc_free(childdn);
 
                if (ret == LDB_ERR_NO_SUCH_OBJECT) {
-                       return WERR_BADFILE;
+                       return WERR_FILE_NOT_FOUND;
                } else if (ret != LDB_SUCCESS) {
                        DEBUG(1, ("ldb_del_value: %s\n", ldb_errstring(kd->ldb)));
                        return WERR_FOOBAR;
@@ -707,10 +708,6 @@ static WERROR ldb_del_key(TALLOC_CTX *mem_ctx, const struct hive_key *key,
        WERROR werr;
        struct hive_key *hk;
 
-       if (name == NULL) {
-               return WERR_INVALID_PARAM;
-       }
-
        /* Verify key exists by opening it */
        werr = ldb_open_key(mem_ctx, key, name, &hk);
        if (!W_ERROR_IS_OK(werr)) {
@@ -776,6 +773,8 @@ static WERROR ldb_del_key(TALLOC_CTX *mem_ctx, const struct hive_key *key,
                        }
                }
        }
+       talloc_free(res_keys);
+       talloc_free(res_vals);
 
        /* Delete the key itself */
        ret = ldb_delete(c, ldb_path);
@@ -814,10 +813,6 @@ static WERROR ldb_set_value(struct hive_key *parent,
        int ret;
        TALLOC_CTX *mem_ctx = talloc_init("ldb_set_value");
 
-       if (name == NULL) {
-               return WERR_INVALID_PARAM;
-       }
-
        msg = reg_ldb_pack_value(kd->ldb, mem_ctx, name, type, data);
        W_ERROR_HAVE_NO_MEMORY(msg);
 
@@ -845,7 +840,7 @@ static WERROR ldb_set_value(struct hive_key *parent,
        if (ret == LDB_ERR_NO_SUCH_OBJECT) {
                i = 0;
                while (i < msg->num_elements) {
-                       if (msg->elements[i].flags == LDB_FLAG_MOD_DELETE) {
+                       if (LDB_FLAG_MOD_TYPE(msg->elements[i].flags) == LDB_FLAG_MOD_DELETE) {
                                ldb_msg_remove_element(msg, &msg->elements[i]);
                        } else {
                                ++i;
@@ -858,6 +853,8 @@ static WERROR ldb_set_value(struct hive_key *parent,
                ret = LDB_SUCCESS;
        }
 
+       talloc_free(msg);
+
        if (ret != LDB_SUCCESS) {
                DEBUG(1, ("ldb_set_value: %s\n", ldb_errstring(kd->ldb)));
                talloc_free(mem_ctx);
@@ -909,7 +906,7 @@ static WERROR ldb_get_key_info(TALLOC_CTX *mem_ctx,
         * remain { NULL, 0 }. */
        werr = ldb_get_default_value(mem_ctx, key, NULL, &default_value_type,
                                     &default_value);
-       if ((!W_ERROR_IS_OK(werr)) && (!W_ERROR_EQUAL(werr, WERR_BADFILE))) {
+       if ((!W_ERROR_IS_OK(werr)) && (!W_ERROR_EQUAL(werr, WERR_FILE_NOT_FOUND))) {
                return werr;
        }