s4-ldb: use LDB_FLAG_MOD_TYPE() to extract element type from messages
authorAndrew Tridgell <tridge@samba.org>
Tue, 17 Aug 2010 01:21:11 +0000 (11:21 +1000)
committerAndrew Tridgell <tridge@samba.org>
Tue, 17 Aug 2010 11:21:50 +0000 (21:21 +1000)
The flags field of message elements is part of a set of flags. We had
LDB_FLAG_MOD_MASK for extracting the type, but it was only rarely
being used (only 1 call used it correctly). This adds
LDB_FLAG_MOD_MASK() to make it more obvious what is going on.

This will allow us to use some of the other flags bits for internal
markers on elements

Pair-Programmed-With: Andrew Bartlett <abartlet@samba.org>

source4/dsdb/common/util.c
source4/dsdb/samdb/ldb_modules/acl.c
source4/dsdb/samdb/ldb_modules/extended_dn_store.c
source4/dsdb/samdb/ldb_modules/password_hash.c
source4/dsdb/samdb/ldb_modules/samldb.c
source4/lib/ldb/include/ldb.h
source4/lib/registry/ldb.c
source4/rpc_server/lsa/dcesrv_lsa.c

index 701040f233b7be71b4fb3f9d4aecf1354874c3a3..7fcc3bf0a4396c9e6bf9d9d9a0e081ecae9c150b 100644 (file)
@@ -766,7 +766,7 @@ int samdb_msg_find_old_and_new_ldb_val(const struct ldb_message *msg,
 
        for (i = 0; i < msg->num_elements; i++) {
                if (ldb_attr_cmp(msg->elements[i].name, name) == 0) {
-                       if (msg->elements[i].flags == LDB_FLAG_MOD_DELETE) {
+                       if (LDB_FLAG_MOD_TYPE(msg->elements[i].flags) == LDB_FLAG_MOD_DELETE) {
                                *old_val = &msg->elements[i].values[0];
                        } else {
                                *new_val = &msg->elements[i].values[0];
@@ -874,7 +874,7 @@ int samdb_msg_add_addval(struct ldb_context *sam_ldb, TALLOC_CTX *mem_ctx,
        for (i = 0; i < msg->num_elements; i++) {
                el = &msg->elements[i];
                if ((ldb_attr_cmp(el->name, attr_name) == 0) &&
-                   (el->flags == LDB_FLAG_MOD_ADD)) {
+                   (LDB_FLAG_MOD_TYPE(el->flags) == LDB_FLAG_MOD_ADD)) {
                        found = true;
                        break;
                }
@@ -930,7 +930,7 @@ int samdb_msg_add_delval(struct ldb_context *sam_ldb, TALLOC_CTX *mem_ctx,
        for (i = 0; i < msg->num_elements; i++) {
                el = &msg->elements[i];
                if ((ldb_attr_cmp(el->name, attr_name) == 0) &&
-                   (el->flags == LDB_FLAG_MOD_DELETE)) {
+                   (LDB_FLAG_MOD_TYPE(el->flags) == LDB_FLAG_MOD_DELETE)) {
                        found = true;
                        break;
                }
index 11fffa4053cda48ad158f322a214893bf8146b22..4eb27e9d1efe72a2f9eda7eb1d5bce7eee388077 100644 (file)
@@ -761,13 +761,13 @@ static int acl_check_password_rights(TALLOC_CTX *mem_ctx,
        }
        for (l = passwordAttrs; *l != NULL; l++) {
                while ((el = ldb_msg_find_element(msg, *l)) != NULL) {
-                       if (el->flags == LDB_FLAG_MOD_DELETE) {
+                       if (LDB_FLAG_MOD_TYPE(el->flags) == LDB_FLAG_MOD_DELETE) {
                                ++del_attr_cnt;
                        }
-                       if (el->flags == LDB_FLAG_MOD_ADD) {
+                       if (LDB_FLAG_MOD_TYPE(el->flags) == LDB_FLAG_MOD_ADD) {
                                ++add_attr_cnt;
                        }
-                       if (el->flags == LDB_FLAG_MOD_REPLACE) {
+                       if (LDB_FLAG_MOD_TYPE(el->flags) == LDB_FLAG_MOD_REPLACE) {
                                ++rep_attr_cnt;
                        }
                        ldb_msg_remove_element(msg, el);
index 07d106e2225c4521e9bdf82e61d590714093646d..3f5f451f9467acf9af246716175131665b7ae3a8 100644 (file)
@@ -425,7 +425,7 @@ static int extended_dn_modify(struct ldb_module *module, struct ldb_request *req
                         * element, only do a lookup if
                         * extended_store_replace determines it's an
                         * input of an extended DN */
-                       bool is_delete = ((el->flags & LDB_FLAG_MOD_MASK) == LDB_FLAG_MOD_DELETE);
+                       bool is_delete = (LDB_FLAG_MOD_TYPE(el->flags) == LDB_FLAG_MOD_DELETE);
 
                        ret = extended_store_replace(ac, req->op.mod.message->elements, &el->values[j],
                                                     is_delete, schema_attr->syntax->ldap_oid);
index 60f0c3eb184e3372a1ab681ba4ca4b336b7079aa..a3c06b6f057bb4716043ee013ffc9b8bc0bd24d8 100644 (file)
@@ -2450,17 +2450,17 @@ static int password_hash_modify(struct ldb_module *module, struct ldb_request *r
        rep_attr_cnt = 0;
        for (l = passwordAttrs; *l != NULL; l++) {
                while ((passwordAttr = ldb_msg_find_element(msg, *l)) != NULL) {
-                       if (passwordAttr->flags == LDB_FLAG_MOD_DELETE) {
+                       if (LDB_FLAG_MOD_TYPE(passwordAttr->flags) == LDB_FLAG_MOD_DELETE) {
                                ++del_attr_cnt;
                        }
-                       if (passwordAttr->flags == LDB_FLAG_MOD_ADD) {
+                       if (LDB_FLAG_MOD_TYPE(passwordAttr->flags) == LDB_FLAG_MOD_ADD) {
                                ++add_attr_cnt;
                        }
-                       if (passwordAttr->flags == LDB_FLAG_MOD_REPLACE) {
+                       if (LDB_FLAG_MOD_TYPE(passwordAttr->flags) == LDB_FLAG_MOD_REPLACE) {
                                ++rep_attr_cnt;
                        }
                        if ((passwordAttr->num_values != 1) &&
-                           (passwordAttr->flags == LDB_FLAG_MOD_ADD)) {
+                           (LDB_FLAG_MOD_TYPE(passwordAttr->flags) == LDB_FLAG_MOD_ADD)) {
                                talloc_free(ac);
                                ldb_asprintf_errstring(ldb,
                                                       "'%s' attribute must have exactly one value on add operations!",
@@ -2468,7 +2468,7 @@ static int password_hash_modify(struct ldb_module *module, struct ldb_request *r
                                return LDB_ERR_CONSTRAINT_VIOLATION;
                        }
                        if ((passwordAttr->num_values > 1) &&
-                           (passwordAttr->flags == LDB_FLAG_MOD_DELETE)) {
+                           (LDB_FLAG_MOD_TYPE(passwordAttr->flags) == LDB_FLAG_MOD_DELETE)) {
                                talloc_free(ac);
                                ldb_asprintf_errstring(ldb,
                                                       "'%s' attribute must have zero or one value(s) on delete operations!",
index a7bb0f6db85650ed970a2ec12819f3a26b844614..2b46867b1ad37017e1c7ff09badbe2afb5e80363 100644 (file)
@@ -1421,7 +1421,7 @@ static int samldb_modify(struct ldb_module *module, struct ldb_request *req)
        /* TODO: do not modify original request, create a new one */
 
        el = ldb_msg_find_element(req->op.mod.message, "groupType");
-       if (el && (el->flags == LDB_FLAG_MOD_REPLACE) && el->num_values == 1) {
+       if (el && (LDB_FLAG_MOD_TYPE(el->flags) == LDB_FLAG_MOD_REPLACE) && el->num_values == 1) {
                uint32_t group_type;
 
                req->op.mod.message = msg = ldb_msg_copy_shallow(req,
@@ -1438,12 +1438,12 @@ static int samldb_modify(struct ldb_module *module, struct ldb_request *req)
                el2 = ldb_msg_find_element(msg, "sAMAccountType");
                el2->flags = LDB_FLAG_MOD_REPLACE;
        }
-       if (el && (el->flags == LDB_FLAG_MOD_DELETE)) {
+       if (el && (LDB_FLAG_MOD_TYPE(el->flags) == LDB_FLAG_MOD_DELETE)) {
                return LDB_ERR_UNWILLING_TO_PERFORM;
        }
 
        el = ldb_msg_find_element(req->op.mod.message, "primaryGroupID");
-       if (el && (el->flags == LDB_FLAG_MOD_REPLACE) && el->num_values == 1) {
+       if (el && (LDB_FLAG_MOD_TYPE(el->flags) == LDB_FLAG_MOD_REPLACE) && el->num_values == 1) {
                req->op.mod.message = ac->msg = ldb_msg_copy_shallow(req,
                        req->op.mod.message);
 
@@ -1452,12 +1452,12 @@ static int samldb_modify(struct ldb_module *module, struct ldb_request *req)
                        return ret;
                }
        }
-       if (el && (el->flags == LDB_FLAG_MOD_DELETE)) {
+       if (el && (LDB_FLAG_MOD_TYPE(el->flags) == LDB_FLAG_MOD_DELETE)) {
                return LDB_ERR_UNWILLING_TO_PERFORM;
        }
 
        el = ldb_msg_find_element(req->op.mod.message, "userAccountControl");
-       if (el && (el->flags == LDB_FLAG_MOD_REPLACE) && el->num_values == 1) {
+       if (el && (LDB_FLAG_MOD_TYPE(el->flags) == LDB_FLAG_MOD_REPLACE) && el->num_values == 1) {
                uint32_t user_account_control;
 
                req->op.mod.message = msg = ldb_msg_copy_shallow(req,
@@ -1496,7 +1496,7 @@ static int samldb_modify(struct ldb_module *module, struct ldb_request *req)
                        }
                }
        }
-       if (el && (el->flags == LDB_FLAG_MOD_DELETE)) {
+       if (el && (LDB_FLAG_MOD_TYPE(el->flags) == LDB_FLAG_MOD_DELETE)) {
                return LDB_ERR_UNWILLING_TO_PERFORM;
        }
 
index f3ec1ed606d47066eac74944648e82f47e754ea4..6625d94dbd5df13d34ea8ef703717258ff5ad162 100644 (file)
@@ -109,6 +109,11 @@ struct ldb_dn;
 */
 #define LDB_FLAG_MOD_MASK  0x3
 
+/**
+  use this to extract the mod type from the operation
+ */
+#define LDB_FLAG_MOD_TYPE(flags) ((flags) & LDB_FLAG_MOD_MASK)
+
 /**
    Flag value used in ldap_modify() to indicate that attributes are
    being added.
index c14ee70ace72a385556488222b42a71ca536e118..91c676390257c31bf84d1ad960d03bd5ce392bc9 100644 (file)
@@ -830,7 +830,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;
index 0a94a874809e07df6d00161294f2c51fd55e13d9..0a347e07dd80c792fc370c0e3611aa268e3d774f 100644 (file)
@@ -2600,7 +2600,7 @@ static NTSTATUS dcesrv_lsa_AddRemoveAccountRights(struct dcesrv_call_state *dce_
        msg->dn = ldb_dn_new(msg, state->pdb, dnstr);
        NT_STATUS_HAVE_NO_MEMORY_AND_FREE(msg->dn, msg);
 
-       if (ldb_flag == LDB_FLAG_MOD_ADD) {
+       if (LDB_FLAG_MOD_TYPE(ldb_flag) == LDB_FLAG_MOD_ADD) {
                NTSTATUS status;
 
                r2.in.handle = &state->handle->wire_handle;
@@ -2619,7 +2619,7 @@ static NTSTATUS dcesrv_lsa_AddRemoveAccountRights(struct dcesrv_call_state *dce_
                        return NT_STATUS_NO_SUCH_PRIVILEGE;
                }
 
-               if (ldb_flag == LDB_FLAG_MOD_ADD) {
+               if (LDB_FLAG_MOD_TYPE(ldb_flag) == LDB_FLAG_MOD_ADD) {
                        uint32_t j;
                        for (j=0;j<r2.out.rights->count;j++) {
                                if (strcasecmp_m(r2.out.rights->names[j].string, 
@@ -2655,12 +2655,12 @@ static NTSTATUS dcesrv_lsa_AddRemoveAccountRights(struct dcesrv_call_state *dce_
                ret = ldb_add(state->pdb, msg);         
        }
        if (ret != LDB_SUCCESS) {
-               if (ldb_flag == LDB_FLAG_MOD_DELETE && ret == LDB_ERR_NO_SUCH_ATTRIBUTE) {
+               if (LDB_FLAG_MOD_TYPE(ldb_flag) == LDB_FLAG_MOD_DELETE && ret == LDB_ERR_NO_SUCH_ATTRIBUTE) {
                        talloc_free(msg);
                        return NT_STATUS_OK;
                }
                DEBUG(3, ("Could not %s attributes from %s: %s", 
-                         ldb_flag == LDB_FLAG_MOD_DELETE ? "delete" : "add",
+                         LDB_FLAG_MOD_TYPE(ldb_flag) == LDB_FLAG_MOD_DELETE ? "delete" : "add",
                          ldb_dn_get_linearized(msg->dn), ldb_errstring(state->pdb)));
                talloc_free(msg);
                return NT_STATUS_UNEXPECTED_IO_ERROR;