Allow attributes to be overwritten, not just added to
[tprouty/samba.git] / source4 / lib / ldb / common / ldb_attributes.c
index effd93ae2674e9e8ec620d53033b3bf4e2732886..ab6aa0b7341a9871a3072e690095662753c75743 100644 (file)
@@ -62,11 +62,20 @@ int ldb_schema_attribute_add_with_syntax(struct ldb_context *ldb,
        ldb->schema.attributes = a;
 
        for (i = 0; i < ldb->schema.num_attributes; i++) {
-               if (ldb_attr_cmp(attribute, a[i].name) < 0) {
+               int cmp = ldb_attr_cmp(attribute, a[i].name);
+               if (cmp == 0) {
+                       if (a[i].flags & LDB_ATTR_FLAG_ALLOCATED) {
+                               talloc_free(discard_const_p(char, a[i].name));
+                       }
+                       /* To cancel out increment below */
+                       ldb->schema.num_attributes--;
+                       break;
+               } else if (cmp < 0) {
                        memmove(a+i+1, a+i, sizeof(*a) * (ldb->schema.num_attributes-i));
                        break;
                }
        }
+       ldb->schema.num_attributes++;
 
        a[i].name       = attribute;
        a[i].flags      = flags;
@@ -80,7 +89,6 @@ int ldb_schema_attribute_add_with_syntax(struct ldb_context *ldb,
                }
        }
 
-       ldb->schema.num_attributes++;
        return 0;
 }
 
@@ -145,7 +153,7 @@ void ldb_schema_attribute_remove(struct ldb_context *ldb, const char *name)
        int i;
 
        a = ldb_schema_attribute_by_name(ldb, name);
-       if (a == NULL) {
+       if (a == NULL || a->name == NULL) {
                return;
        }