}
cmp = ndr_guid_compare(ctx->guid, &p->guid);
if (cmp == 0 && ctx->compare_extra_part) {
- return data_blob_cmp(&ctx->extra_part, &p->dsdb_dn->extra_part);
+ if (ctx->partial_extra_part_length != 0) {
+ /* Allow a prefix match on the blob. */
+ return memcmp(ctx->extra_part.data,
+ p->dsdb_dn->extra_part.data,
+ MIN(ctx->partial_extra_part_length,
+ p->dsdb_dn->extra_part.length));
+ } else {
+ return data_blob_cmp(&ctx->extra_part,
+ &p->dsdb_dn->extra_part);
+ }
}
return cmp;
const struct GUID *guid,
struct ldb_dn *target_dn,
DATA_BLOB extra_part,
+ size_t partial_extra_part_length,
struct parsed_dn **exact,
struct parsed_dn **next,
const char *ldap_oid,
ctx.mem_ctx = pdn;
ctx.ldap_oid = ldap_oid;
ctx.extra_part = extra_part;
+ ctx.partial_extra_part_length = partial_extra_part_length;
ctx.compare_extra_part = compare_extra_part;
ctx.err = 0;
int err = parsed_dn_find(ldb, old_dns, old_num_values,
&dns[i].guid,
dns[i].dsdb_dn->dn,
- dns[i].dsdb_dn->extra_part,
+ dns[i].dsdb_dn->extra_part, 0,
&exact, &next,
schema_attr->syntax->ldap_oid,
true);
ret = parsed_dn_find(ldb, old_dns, old_el->num_values,
&p->guid,
NULL,
- p->dsdb_dn->extra_part,
+ p->dsdb_dn->extra_part, 0,
&exact, &next,
schema_attr->syntax->ldap_oid,
true);
}
ret = parsed_dn_find(ldb, link_dns, link_el->num_values,
- guid, dn, data_blob_null, &p, &unused,
+ guid, dn,
+ data_blob_null, 0,
+ &p, &unused,
target_attr->syntax->ldap_oid, false);
if (ret != LDB_SUCCESS) {
talloc_free(tmp_ctx);
ret = parsed_dn_find(ldb, pdn_list, old_el->num_values,
&guid,
dsdb_dn->dn,
- dsdb_dn->extra_part,
+ dsdb_dn->extra_part, 0,
&pdn, &next,
attr->syntax->ldap_oid,
true);