summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/dsdb/schema/schema_init.c7
-rw-r--r--source4/dsdb/schema/schema_syntax.c28
-rw-r--r--source4/libnet/libnet_become_dc.c63
-rw-r--r--source4/librpc/idl/drsuapi.idl15
4 files changed, 52 insertions, 61 deletions
diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c
index 23b5fd9dcc..41998a16db 100644
--- a/source4/dsdb/schema/schema_init.c
+++ b/source4/dsdb/schema/schema_init.c
@@ -472,9 +472,10 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb
#define GET_UINT32_DS(s, r, attr, p, elem) do { \
struct drsuapi_DsReplicaAttribute *_a; \
_a = dsdb_find_object_attr_name(s, r, attr, NULL); \
- if (_a && _a->value_ctr.uint32.num_values >= 1 \
- && _a->value_ctr.uint32.values[0].value) { \
- (p)->elem = *_a->value_ctr.uint32.values[0].value;\
+ if (_a && _a->value_ctr.data_blob.num_values >= 1 \
+ && _a->value_ctr.data_blob.values[0].data \
+ && _a->value_ctr.data_blob.values[0].data->length == 4) { \
+ (p)->elem = IVAL(_a->value_ctr.data_blob.values[0].data->data,0);\
} else { \
(p)->elem = 0; \
} \
diff --git a/source4/dsdb/schema/schema_syntax.c b/source4/dsdb/schema/schema_syntax.c
index f31dfbda2b..8a2747bd9d 100644
--- a/source4/dsdb/schema/schema_syntax.c
+++ b/source4/dsdb/schema/schema_syntax.c
@@ -162,18 +162,6 @@ static WERROR dsdb_syntax_INT32_drsuapi_to_ldb(const struct dsdb_schema *schema,
{
uint32_t i;
-switch (attr->attributeID_id) {
-case DRSUAPI_ATTRIBUTE_instanceType:
-case DRSUAPI_ATTRIBUTE_rangeLower:
-case DRSUAPI_ATTRIBUTE_rangeUpper:
-case DRSUAPI_ATTRIBUTE_objectVersion:
-case DRSUAPI_ATTRIBUTE_oMSyntax:
-case DRSUAPI_ATTRIBUTE_searchFlags:
-case DRSUAPI_ATTRIBUTE_systemFlags:
-case DRSUAPI_ATTRIBUTE_msDS_Behavior_Version:
- return dsdb_syntax_FOOBAR_drsuapi_to_ldb(schema,attr, in, mem_ctx, out);
-}
-
out->flags = 0;
out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
W_ERROR_HAVE_NO_MEMORY(out->name);
@@ -585,11 +573,15 @@ static WERROR _dsdb_syntax_OID_obj_drsuapi_to_ldb(const struct dsdb_schema *sche
const struct dsdb_class *c;
const char *str;
- if (in->value_ctr.object_class_id.values[i].objectClassId == NULL) {
+ if (in->value_ctr.data_blob.values[i].data == NULL) {
+ return WERR_FOOBAR;
+ }
+
+ if (in->value_ctr.data_blob.values[i].data->length != 4) {
return WERR_FOOBAR;
}
- v = *in->value_ctr.object_class_id.values[i].objectClassId;
+ v = IVAL(in->value_ctr.data_blob.values[i].data->data, 0);
c = dsdb_class_by_governsID_id(schema, v);
if (!c) {
@@ -627,11 +619,15 @@ static WERROR _dsdb_syntax_OID_oid_drsuapi_to_ldb(const struct dsdb_schema *sche
WERROR status;
const char *str;
- if (in->value_ctr.oid.values[i].value == NULL) {
+ if (in->value_ctr.data_blob.values[i].data == NULL) {
+ return WERR_FOOBAR;
+ }
+
+ if (in->value_ctr.data_blob.values[i].data->length != 4) {
return WERR_FOOBAR;
}
- v = *in->value_ctr.oid.values[i].value;
+ v = IVAL(in->value_ctr.data_blob.values[i].data->data, 0);
status = dsdb_map_int2oid(schema, v, out->values, &str);
W_ERROR_NOT_OK_RETURN(status);
diff --git a/source4/libnet/libnet_become_dc.c b/source4/libnet/libnet_become_dc.c
index 30fc1774d5..954b886b12 100644
--- a/source4/libnet/libnet_become_dc.c
+++ b/source4/libnet/libnet_become_dc.c
@@ -1128,23 +1128,26 @@ static void becomeDC_drsuapi1_add_entry_send(struct libnet_BecomeDC_state *s)
/* objectClass: nTDSDSA */
{
- struct drsuapi_DsAttributeValueObjectClassId *vs;
- enum drsuapi_DsObjectClassId *v;
+ struct drsuapi_DsAttributeValueDataBlob *vs;
+ DATA_BLOB *vd;
- vs = talloc_array(attrs, struct drsuapi_DsAttributeValueObjectClassId, 1);
+ vs = talloc_array(attrs, struct drsuapi_DsAttributeValueDataBlob, 1);
if (composite_nomem(vs, c)) return;
- v = talloc_array(vs, enum drsuapi_DsObjectClassId, 1);
- if (composite_nomem(v, c)) return;
+ vd = talloc_array(vs, DATA_BLOB, 1);
+ if (composite_nomem(vd, c)) return;
+
+ vd[0] = data_blob_talloc(vd, NULL, 4);
+ if (composite_nomem(vd[0].data, c)) return;
/* value for nTDSDSA */
- v[0] = 0x0017002F;
+ SIVAL(vd[0].data, 0, 0x0017002F);
- vs[0].objectClassId = &v[0];
+ vs[0].data = &vd[0];
attrs[i].attid = DRSUAPI_ATTRIBUTE_objectClass;
- attrs[i].value_ctr.object_class_id.num_values = 1;
- attrs[i].value_ctr.object_class_id.values = vs;
+ attrs[i].value_ctr.data_blob.num_values = 1;
+ attrs[i].value_ctr.data_blob.values = vs;
i++;
}
@@ -1319,44 +1322,50 @@ static void becomeDC_drsuapi1_add_entry_send(struct libnet_BecomeDC_state *s)
/* msDS-Behavior-Version */
if (w2k3) {
- struct drsuapi_DsAttributeValueUINT32 *vs;
- uint32_t *v;
+ struct drsuapi_DsAttributeValueDataBlob *vs;
+ DATA_BLOB *vd;
- vs = talloc_array(attrs, struct drsuapi_DsAttributeValueUINT32, 1);
+ vs = talloc_array(attrs, struct drsuapi_DsAttributeValueDataBlob, 1);
if (composite_nomem(vs, c)) return;
- v = talloc_array(vs, uint32_t, 1);
- if (composite_nomem(v, c)) return;
+ vd = talloc_array(vs, DATA_BLOB, 1);
+ if (composite_nomem(vd, c)) return;
+
+ vd[0] = data_blob_talloc(vd, NULL, 4);
+ if (composite_nomem(vd[0].data, c)) return;
- v[0] = DS_BEHAVIOR_WIN2003;
+ SIVAL(vd[0].data, 0, DS_BEHAVIOR_WIN2003);
- vs[0].value = &v[0];
+ vs[0].data = &vd[0];
attrs[i].attid = DRSUAPI_ATTRIBUTE_msDS_Behavior_Version;
- attrs[i].value_ctr.uint32.num_values = 1;
- attrs[i].value_ctr.uint32.values = vs;
+ attrs[i].value_ctr.data_blob.num_values = 1;
+ attrs[i].value_ctr.data_blob.values = vs;
i++;
}
/* systemFlags */
{
- struct drsuapi_DsAttributeValueUINT32 *vs;
- uint32_t *v;
+ struct drsuapi_DsAttributeValueDataBlob *vs;
+ DATA_BLOB *vd;
- vs = talloc_array(attrs, struct drsuapi_DsAttributeValueUINT32, 1);
+ vs = talloc_array(attrs, struct drsuapi_DsAttributeValueDataBlob, 1);
if (composite_nomem(vs, c)) return;
- v = talloc_array(vs, uint32_t, 1);
- if (composite_nomem(v, c)) return;
+ vd = talloc_array(vs, DATA_BLOB, 1);
+ if (composite_nomem(vd, c)) return;
- v[0] = SYSTEM_FLAG_DISALLOW_MOVE_ON_DELETE;
+ vd[0] = data_blob_talloc(vd, NULL, 4);
+ if (composite_nomem(vd[0].data, c)) return;
- vs[0].value = &v[0];
+ SIVAL(vd[0].data, 0, SYSTEM_FLAG_DISALLOW_MOVE_ON_DELETE);
+
+ vs[0].data = &vd[0];
attrs[i].attid = DRSUAPI_ATTRIBUTE_systemFlags;
- attrs[i].value_ctr.uint32.num_values = 1;
- attrs[i].value_ctr.uint32.values = vs;
+ attrs[i].value_ctr.data_blob.num_values = 1;
+ attrs[i].value_ctr.data_blob.values = vs;
i++;
}
diff --git a/source4/librpc/idl/drsuapi.idl b/source4/librpc/idl/drsuapi.idl
index dbe0e92be0..624835121f 100644
--- a/source4/librpc/idl/drsuapi.idl
+++ b/source4/librpc/idl/drsuapi.idl
@@ -519,21 +519,6 @@ interface drsuapi
} drsuapi_DsAttributeValueCtrGUID;
typedef [nodiscriminant] union {
- [case(DRSUAPI_ATTRIBUTE_objectClass)] drsuapi_DsAttributeValueCtrObjectClassId object_class_id;
- [case(DRSUAPI_ATTRIBUTE_governsID)] drsuapi_DsAttributeValueCtrUINT32 oid;
- [case(DRSUAPI_ATTRIBUTE_attributeID)] drsuapi_DsAttributeValueCtrUINT32 oid;
- [case(DRSUAPI_ATTRIBUTE_attributeSyntax)] drsuapi_DsAttributeValueCtrUINT32 oid;
-
- /* UINT32 */
- [case(DRSUAPI_ATTRIBUTE_instanceType)] drsuapi_DsAttributeValueCtrUINT32 uint32;
- [case(DRSUAPI_ATTRIBUTE_rangeLower)] drsuapi_DsAttributeValueCtrUINT32 uint32;
- [case(DRSUAPI_ATTRIBUTE_rangeUpper)] drsuapi_DsAttributeValueCtrUINT32 uint32;
- [case(DRSUAPI_ATTRIBUTE_objectVersion)] drsuapi_DsAttributeValueCtrUINT32 uint32;
- [case(DRSUAPI_ATTRIBUTE_oMSyntax)] drsuapi_DsAttributeValueCtrUINT32 uint32;
- [case(DRSUAPI_ATTRIBUTE_searchFlags)] drsuapi_DsAttributeValueCtrUINT32 uint32;
- [case(DRSUAPI_ATTRIBUTE_systemFlags)] drsuapi_DsAttributeValueCtrUINT32 uint32;
- [case(DRSUAPI_ATTRIBUTE_msDS_Behavior_Version)] drsuapi_DsAttributeValueCtrUINT32 uint32;
-
/* UnicodeString */
[case(DRSUAPI_ATTRIBUTE_description)] drsuapi_DsAttributeValueCtrUnicodeString unicode_string;
[case(DRSUAPI_ATTRIBUTE_adminDisplayName)] drsuapi_DsAttributeValueCtrUnicodeString unicode_string;