summaryrefslogtreecommitdiff
path: root/source4/dsdb/schema/schema_query.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/dsdb/schema/schema_query.c')
-rw-r--r--source4/dsdb/schema/schema_query.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/source4/dsdb/schema/schema_query.c b/source4/dsdb/schema/schema_query.c
index df17787f38..4e11e50c17 100644
--- a/source4/dsdb/schema/schema_query.c
+++ b/source4/dsdb/schema/schema_query.c
@@ -39,7 +39,14 @@ static int strcasecmp_with_ldb_val(const struct ldb_val *target, const char *str
{
int ret = strncasecmp((const char *)target->data, str, target->length);
if (ret == 0) {
- return (target->length - strlen(str));
+ size_t len = strlen(str);
+ if (target->length > len) {
+ if (target->data[len] == 0) {
+ return 0;
+ }
+ return 1;
+ }
+ return (target->length - len);
}
return ret;
}
@@ -55,6 +62,15 @@ const struct dsdb_attribute *dsdb_attribute_by_attributeID_id(const struct dsdb_
*/
if (id == 0xFFFFFFFF) return NULL;
+ /* check for msDS-IntId type attribute */
+ if (dsdb_pfm_get_attid_type(id) == dsdb_attid_type_intid) {
+ for (c = schema->attributes; c; c = c->next) {
+ if (c->msDS_IntId == id) {
+ return c;
+ }
+ }
+ }
+
BINARY_ARRAY_SEARCH_P(schema->attributes_by_attributeID_id,
schema->num_attributes, attributeID_id, id, uint32_cmp, c);
return c;
@@ -84,6 +100,18 @@ const struct dsdb_attribute *dsdb_attribute_by_lDAPDisplayName(const struct dsdb
return c;
}
+const struct dsdb_attribute *dsdb_attribute_by_lDAPDisplayName_ldb_val(const struct dsdb_schema *schema,
+ const struct ldb_val *name)
+{
+ struct dsdb_attribute *a;
+
+ if (!name) return NULL;
+
+ BINARY_ARRAY_SEARCH_P(schema->attributes_by_lDAPDisplayName,
+ schema->num_attributes, lDAPDisplayName, name, strcasecmp_with_ldb_val, a);
+ return a;
+}
+
const struct dsdb_attribute *dsdb_attribute_by_linkID(const struct dsdb_schema *schema,
int linkID)
{