summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2005-08-23 09:28:37 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:34:24 -0500
commit54a703d433cc586504bbdf445a03e3c3e0b4fe50 (patch)
treec1117bda43feae5b9809c3232869e92dcf70328c
parent805c860f6b38bea4db7b39658b80207f55c97338 (diff)
downloadsamba-54a703d433cc586504bbdf445a03e3c3e0b4fe50.tar.gz
samba-54a703d433cc586504bbdf445a03e3c3e0b4fe50.tar.bz2
samba-54a703d433cc586504bbdf445a03e3c3e0b4fe50.zip
r9509: start to fix the pushing of drsuapi_DsAttributeValueDNString structs,
this uses a trick with talloc_get_type() to workaround using [value()] vars in [subcontext_size()] metze (This used to be commit 93065f2d3439bceeaa7c2a09679cc6d81472150d)
-rw-r--r--source4/include/structs.h5
-rw-r--r--source4/librpc/idl/drsuapi.idl8
-rw-r--r--source4/librpc/ndr/ndr_drsuapi.c15
3 files changed, 22 insertions, 6 deletions
diff --git a/source4/include/structs.h b/source4/include/structs.h
index 5c6ef29774..eec211cec3 100644
--- a/source4/include/structs.h
+++ b/source4/include/structs.h
@@ -77,8 +77,11 @@ struct spoolss_DeviceMode;
struct ntptr_context;
struct ntptr_GenericHandle;
+struct drsuapi_DsCrackNames;
struct drsuapi_DsReplicaObjectListItem;
struct drsuapi_DsReplicaObjectListItemEx;
+struct drsuapi_DsAttributeValueDNString;
+struct drsuapi_DsReplicaObjectIdentifier3;
struct MULTI_QI;
struct COSERVERINFO;
@@ -87,8 +90,6 @@ struct COSERVERINFO;
struct epm_floor;
struct epm_tower;
-struct drsuapi_DsCrackNames;
-
struct PAC_BUFFER;
struct PAC_DATA;
diff --git a/source4/librpc/idl/drsuapi.idl b/source4/librpc/idl/drsuapi.idl
index a9ecd30cb5..10170bc282 100644
--- a/source4/librpc/idl/drsuapi.idl
+++ b/source4/librpc/idl/drsuapi.idl
@@ -428,16 +428,16 @@ interface drsuapi
/* DN String values */
typedef [gensize] struct {
- [value(ndr_size_drsuapi_DsReplicaObjectIdentifier3(r, ndr->flags)-4)] uint32 __ndr_size;
+ [value(ndr_size_drsuapi_DsReplicaObjectIdentifier3(r, ndr->flags))] uint32 __ndr_size;
[value(ndr_length_dom_sid(&r->sid))] uint32 __ndr_size_sid;
GUID guid;
dom_sid28 sid;
[flag(STR_SIZE4|STR_CHARLEN)] string dn;
} drsuapi_DsReplicaObjectIdentifier3;
- typedef struct {
- [range(0,10485760)] uint32 length;
- [subcontext(4)] drsuapi_DsReplicaObjectIdentifier3 *object;
+ typedef struct {
+ [range(0,10485760),value(_ndr_size_drsuapi_DsReplicaObjectIdentifier3(ndr, r, object, ndr->flags))] uint32 __ndr_size;
+ [subcontext(4),subcontext_size(_ndr_size_drsuapi_DsReplicaObjectIdentifier3(ndr, r, object, ndr->flags))] drsuapi_DsReplicaObjectIdentifier3 *object;
} drsuapi_DsAttributeValueDNString;
typedef struct {
diff --git a/source4/librpc/ndr/ndr_drsuapi.c b/source4/librpc/ndr/ndr_drsuapi.c
index 6f6dd74ea4..f220966b9d 100644
--- a/source4/librpc/ndr/ndr_drsuapi.c
+++ b/source4/librpc/ndr/ndr_drsuapi.c
@@ -61,3 +61,18 @@ void ndr_print_drsuapi_DsReplicaObjectListItemEx(struct ndr_print *ndr, const ch
ndr_print_drsuapi_DsReplicaObjectListItemEx(ndr, "next_object", r->next_object);
}
}
+
+uint32_t _ndr_size_drsuapi_DsReplicaObjectIdentifier3(const void *ndr,
+ const struct drsuapi_DsAttributeValueDNString *dn,
+ const struct drsuapi_DsReplicaObjectIdentifier3 *id,
+ uint32_t flags)
+{
+ if (talloc_get_type(ndr, struct ndr_pull)) {
+ return dn->__ndr_size;
+ } else if (talloc_get_type(ndr, struct ndr_push)) {
+ return ndr_size_drsuapi_DsReplicaObjectIdentifier3(id, flags) + 2;
+ } else if (talloc_get_type(ndr, struct ndr_print)) {
+ return ndr_size_drsuapi_DsReplicaObjectIdentifier3(id, flags) + 2;
+ }
+ return 0;
+}