1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-05 20:58:40 +03:00

s4/drs: Implement binary-oid-lookup into prefixMap

Signed-off-by: Stefan Metzmacher <metze@samba.org>
This commit is contained in:
Kamen Mazdrashki 2009-10-24 00:48:55 +03:00 committed by Stefan Metzmacher
parent f4475368f0
commit 3fe4310df7

View File

@ -168,6 +168,31 @@ static WERROR _dsdb_pfm_make_binary_oid(const char *full_oid, TALLOC_CTX *mem_ct
return WERR_OK;
}
/**
* Lookup partial-binary-oid in prefixMap
*/
WERROR dsdb_schema_pfm_find_binary_oid(struct dsdb_schema_prefixmap *pfm,
DATA_BLOB bin_oid,
uint32_t *_idx)
{
uint32_t i;
for (i = 0; i < pfm->length; i++) {
if (pfm->prefixes[i].bin_oid.length != bin_oid.length) {
continue;
}
if (memcmp(pfm->prefixes[i].bin_oid.data, bin_oid.data, bin_oid.length) == 0) {
if (_idx) {
*_idx = i;
}
return WERR_OK;
}
}
return WERR_DS_NO_MSDS_INTID;
}
/**
* Make ATTID for given OID
* Reference: [MS-DRSR] section 5.12.2
@ -175,11 +200,10 @@ static WERROR _dsdb_pfm_make_binary_oid(const char *full_oid, TALLOC_CTX *mem_ct
WERROR dsdb_schema_pfm_make_attid(struct dsdb_schema_prefixmap *pfm, const char *oid, uint32_t *attid)
{
WERROR werr;
uint32_t i;
uint32_t idx;
uint32_t lo_word, hi_word;
uint32_t last_value;
uint32_t last_subid;
DATA_BLOB bin_oid;
struct dsdb_schema_prefixmap_oid *pfm_entry;
if (!pfm) {
return WERR_INVALID_PARAMETER;
@ -188,42 +212,30 @@ WERROR dsdb_schema_pfm_make_attid(struct dsdb_schema_prefixmap *pfm, const char
return WERR_INVALID_PARAMETER;
}
werr = _dsdb_pfm_make_binary_oid(oid, pfm, &bin_oid, &last_value);
werr = _dsdb_pfm_make_binary_oid(oid, pfm, &bin_oid, &last_subid);
W_ERROR_NOT_OK_RETURN(werr);
/* search the prefix in the prefix table, if none found, add
* one entry for new prefix.
*/
pfm_entry = NULL;
for (i = 0; i < pfm->length; i++) {
if (pfm->prefixes[i].bin_oid.length != bin_oid.length)
continue;
if (memcmp(pfm->prefixes[i].bin_oid.data, bin_oid.data, bin_oid.length) == 0) {
pfm_entry = &pfm->prefixes[i];
break;
}
}
/* add entry in no entry exists */
if (!pfm_entry) {
uint32_t idx;
werr = _dsdb_schema_pfm_add_entry(pfm, bin_oid, &idx);
W_ERROR_NOT_OK_RETURN(werr);
pfm_entry = &pfm->prefixes[idx];
} else {
werr = dsdb_schema_pfm_find_binary_oid(pfm, bin_oid, &idx);
if (W_ERROR_IS_OK(werr)) {
/* free memory allocated for bin_oid */
data_blob_free(&bin_oid);
} else {
/* entry does not exists, add it */
werr = _dsdb_schema_pfm_add_entry(pfm, bin_oid, &idx);
W_ERROR_NOT_OK_RETURN(werr);
}
/* compose the attid */
lo_word = last_value % 16384; /* actually get lower 14 bits: lo_word & 0x3FFF */
if (last_value >= 16384) {
lo_word = last_subid % 16384; /* actually get lower 14 bits: lo_word & 0x3FFF */
if (last_subid >= 16384) {
/* mark it so that it is known to not be the whole lastValue
* This will raise 16-th bit*/
lo_word += 32768;
}
hi_word = pfm_entry->id;
hi_word = pfm->prefixes[idx].id;
/* make ATTID:
* HIWORD is prefixMap id