From 75ce1305b521890ab41792db8fae2b6e01be2d5f Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 23 Sep 2013 08:05:41 +0200 Subject: [PATCH 1/6] drsuapi.idl: change the range for attribute values to 26214400 bytes. This matches the IDL from [MS-DRSR]. Signed-off-by: Stefan Metzmacher Reviewed-by: Matthieu Patou (cherry picked from commit 51d8eba8417c58c2ade30d58a838441008209542) --- librpc/idl/drsuapi.idl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/librpc/idl/drsuapi.idl b/librpc/idl/drsuapi.idl index ed85205..063d135 100644 --- a/librpc/idl/drsuapi.idl +++ b/librpc/idl/drsuapi.idl @@ -546,7 +546,7 @@ interface drsuapi /* Generic DATA_BLOB values */ typedef struct { - [range(0,10485760),value(ndr_size_DATA_BLOB(0,blob,0))] uint32 __ndr_size; + [range(0,26214400),value(ndr_size_DATA_BLOB(0,blob,0))] uint32 __ndr_size; DATA_BLOB *blob; } drsuapi_DsAttributeValue; -- 1.9.1 From 5827c1db399bee722246a2cfd76c32dd4549c317 Mon Sep 17 00:00:00 2001 From: Matthieu Patou Date: Sun, 20 Oct 2013 20:16:27 -0700 Subject: [PATCH 2/6] librpc-idl: replace int32 by the enumeration as it's the type that we use in union's switch drsuapi_DsGetDCInfoCtrLevels Signed-off-by: Matthieu Patou Signed-off-by: Stefan Metzmacher Reviewed-by: Stefan Metzmacher (cherry picked from commit 568bf16dfadb4bd3003ed18b19098a3d1473f2fe) --- librpc/idl/drsuapi.idl | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/librpc/idl/drsuapi.idl b/librpc/idl/drsuapi.idl index 063d135..297db08 100644 --- a/librpc/idl/drsuapi.idl +++ b/librpc/idl/drsuapi.idl @@ -1107,9 +1107,16 @@ interface drsuapi /*****************/ /* Function 0x10 */ + typedef [v1_enum] enum { + DRSUAPI_DC_INFO_CTR_1 = 1, + DRSUAPI_DC_INFO_CTR_2 = 2, + DRSUAPI_DC_INFO_CTR_3 = 3, + DRSUAPI_DC_CONNECTION_CTR_01 = 0xFFFFFFFF + } drsuapi_DsGetDCInfoCtrLevels; + typedef struct { [charset(UTF16),string] uint16 *domain_name; /* netbios or dns */ - int32 level; /* specifies the switch level for the request */ + drsuapi_DsGetDCInfoCtrLevels level; /* specifies the switch level for the request */ } drsuapi_DsGetDCInfoRequest1; typedef [switch_type(int32)] union { @@ -1204,14 +1211,7 @@ interface drsuapi [size_is(count)] drsuapi_DsGetDCConnection01 *array; } drsuapi_DsGetDCConnectionCtr01; - typedef [v1_enum] enum { - DRSUAPI_DC_INFO_CTR_1 = 1, - DRSUAPI_DC_INFO_CTR_2 = 2, - DRSUAPI_DC_INFO_CTR_3 = 3, - DRSUAPI_DC_CONNECTION_CTR_01 = -1 - } drsuapi_DsGetDCInfoCtrLevels; - - typedef [switch_type(int32)] union { + typedef [switch_type(drsuapi_DsGetDCInfoCtrLevels)] union { [case(DRSUAPI_DC_INFO_CTR_1)] drsuapi_DsGetDCInfoCtr1 ctr1; [case(DRSUAPI_DC_INFO_CTR_2)] drsuapi_DsGetDCInfoCtr2 ctr2; [case(DRSUAPI_DC_INFO_CTR_3)] drsuapi_DsGetDCInfoCtr3 ctr3; @@ -1222,7 +1222,7 @@ interface drsuapi [in] policy_handle *bind_handle, [in] int32 level, [in,ref,switch_is(level)] drsuapi_DsGetDCInfoRequest *req, - [out,ref] int32 *level_out, + [out,ref] drsuapi_DsGetDCInfoCtrLevels *level_out, [out,ref,switch_is(*level_out)] drsuapi_DsGetDCInfoCtr *ctr ); -- 1.9.1 From ebccdad1e2cb1175cd0227726c415188b5c882ec Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 21 Oct 2013 08:40:28 +0200 Subject: [PATCH 3/6] librpc-idl: replace int32 by uint32 as the values are always > 0 Signed-off-by: Stefan Metzmacher Reviewed-by: Stefan Metzmacher (cherry picked from commit 1e2e421632c275f8cf7529935f72ef3639ddea14) --- librpc/idl/drsuapi.idl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/librpc/idl/drsuapi.idl b/librpc/idl/drsuapi.idl index 297db08..7e3d343 100644 --- a/librpc/idl/drsuapi.idl +++ b/librpc/idl/drsuapi.idl @@ -1119,7 +1119,7 @@ interface drsuapi drsuapi_DsGetDCInfoCtrLevels level; /* specifies the switch level for the request */ } drsuapi_DsGetDCInfoRequest1; - typedef [switch_type(int32)] union { + typedef [switch_type(uint32)] union { [case(1)] drsuapi_DsGetDCInfoRequest1 req1; } drsuapi_DsGetDCInfoRequest; @@ -1220,7 +1220,7 @@ interface drsuapi WERROR drsuapi_DsGetDomainControllerInfo( [in] policy_handle *bind_handle, - [in] int32 level, + [in] uint32 level, [in,ref,switch_is(level)] drsuapi_DsGetDCInfoRequest *req, [out,ref] drsuapi_DsGetDCInfoCtrLevels *level_out, [out,ref,switch_is(*level_out)] drsuapi_DsGetDCInfoCtr *ctr -- 1.9.1 From c0259e3e282cb6e0e573f7c596ef9b4135cad348 Mon Sep 17 00:00:00 2001 From: Matthieu Patou Date: Sun, 20 Oct 2013 13:37:17 -0700 Subject: [PATCH 4/6] librpc-idl: change the drsuapi_DsBindInfoCtr so that it match what is on the wire both in NDR32 and NDR64. Previous implementation had a problem with NDR64 with uint32 and uint3264 being in the wrong order Signed-off-by: Matthieu Patou Reviewed-by: Stefan Metzmacher Autobuild-User(master): Stefan Metzmacher Autobuild-Date(master): Wed Oct 30 10:16:02 CET 2013 on sn-devel-104 (cherry picked from commit 8dc931bafca00c1c61a4366ffb6cfa72a98bb412) --- librpc/idl/drsuapi.idl | 57 ++++++++++++++--- librpc/ndr/ndr_drsuapi.c | 156 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 204 insertions(+), 9 deletions(-) diff --git a/librpc/idl/drsuapi.idl b/librpc/idl/drsuapi.idl index 7e3d343..f1c6cd6 100644 --- a/librpc/idl/drsuapi.idl +++ b/librpc/idl/drsuapi.idl @@ -115,14 +115,14 @@ interface drsuapi } drsuapi_SupportedExtensionsExt; /* this is used by w2k */ - typedef struct { + typedef [public] struct { drsuapi_SupportedExtensions supported_extensions; GUID site_guid; uint32 pid; } drsuapi_DsBindInfo24; /* this is used by w2k3 */ - typedef struct { + typedef [public] struct { drsuapi_SupportedExtensions supported_extensions; GUID site_guid; uint32 pid; @@ -130,7 +130,7 @@ interface drsuapi } drsuapi_DsBindInfo28; /* this is used by w2k8 */ - typedef struct { + typedef [public] struct { drsuapi_SupportedExtensions supported_extensions; GUID site_guid; uint32 pid; @@ -139,15 +139,21 @@ interface drsuapi GUID config_dn_guid; } drsuapi_DsBindInfo48; - typedef struct { + typedef [public] struct { [flag(NDR_REMAINING)] DATA_BLOB info; } drsuapi_DsBindInfoFallBack; - typedef [nodiscriminant] union { - [case(24)][subcontext(4)] drsuapi_DsBindInfo24 info24; - [case(28)][subcontext(4)] drsuapi_DsBindInfo28 info28; - [case(48)][subcontext(4)] drsuapi_DsBindInfo48 info48; - [default][subcontext(4)] drsuapi_DsBindInfoFallBack FallBack; + typedef [nopull, nopush, noprint] [nodiscriminant] union { + [case(24)][subcontext(0), subcontext_size(24)] drsuapi_DsBindInfo24 info24; + [case(28)][subcontext(0), subcontext_size(28)] drsuapi_DsBindInfo28 info28; + [case(48)][subcontext(0), subcontext_size(48)] drsuapi_DsBindInfo48 info48; + /* + * The size for the defaut case is a bit arbitrary it in fact the value + * of the switch but we can't reference it. + * As we hand(un-)marshall this structure it has 0 impact and makes + * pidl happy for wireshark too + */ + [default][subcontext(0), subcontext_size(48)] drsuapi_DsBindInfoFallBack Fallback; } drsuapi_DsBindInfo; /* the drsuapi_DsBindInfoCtr was this before @@ -160,11 +166,44 @@ interface drsuapi * so we're doing it here */ + /* + * MS-DRSR.pdf gives the following definition + typedef struct { + [range(1,10000)] DWORD cb; + [size_is(cb)] BYTE rgb[]; + } DRS_EXTENSIONS; + + But we use a subcontext which has a slighly different signification on how + data are laid out. + With the MS-DRSR definition we will have + size_is_cb cv rgb_array + with size_is_cb being a uint3264 and cv being a uint32 + + We used to have typedef struct { [range(1,10000)] uint32 length; [switch_is(length)] drsuapi_DsBindInfo info; } drsuapi_DsBindInfoCtr; + typedef [nodiscriminant] union { + [case(24)][subcontext(4)] drsuapi_DsBindInfo24 info24; + [case(28)][subcontext(4)] drsuapi_DsBindInfo28 info28; + [case(48)][subcontext(4)] drsuapi_DsBindInfo48 info48; + [default][subcontext(4)] drsuapi_DsBindInfoFallBack FallBack; + } drsuapi_DsBindInfo; + + With this definition data is laid out this way: + length subcontext_size drsuapi_DsBindInfoxx + with length being a uint32 and subcontext_size being a uint3264 + + It has clearly an impact on the way things are aligned when using NDR64 + */ + typedef [flag(NDR_NOALIGN)] struct { + [range(1,10000)] uint3264 length; + [value(length)] uint32 __ndr_length; + [switch_is(length)] drsuapi_DsBindInfo info; + } drsuapi_DsBindInfoCtr; + /* this is a magic guid you need to pass to DsBind to make drsuapi_DsWriteAccountSpn() work * * maybe the bind_guid could also be the invocation_id see drsuapi_DsReplicaConnection04 diff --git a/librpc/ndr/ndr_drsuapi.c b/librpc/ndr/ndr_drsuapi.c index f7125e6..cef617b 100644 --- a/librpc/ndr/ndr_drsuapi.c +++ b/librpc/ndr/ndr_drsuapi.c @@ -4,6 +4,7 @@ routines for printing some linked list structs in DRSUAPI Copyright (C) Stefan (metze) Metzmacher 2005 + Copyright (C) Matthieu Patou 2013 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -406,3 +407,158 @@ _PUBLIC_ void ndr_print_drsuapi_DsAddEntry_AttrErrListItem_V1(struct ndr_print * ndr_print_drsuapi_DsAddEntry_AttrErrListItem_V1(ndr, "next", r->next); } } + +enum ndr_err_code ndr_push_drsuapi_DsBindInfo(struct ndr_push *ndr, int ndr_flags, const union drsuapi_DsBindInfo *r) +{ + NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); + if (ndr_flags & NDR_SCALARS) { + uint32_t level = ndr_push_get_switch_value(ndr, r); + NDR_CHECK(ndr_push_union_align(ndr, 4)); + switch (level) { + case 24: { + { + struct ndr_push *_ndr_info24; + NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_info24, 0, 24)); + NDR_CHECK(ndr_push_drsuapi_DsBindInfo24(_ndr_info24, NDR_SCALARS, &r->info24)); + NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info24, 0, 24)); + } + break; } + + case 28: { + { + struct ndr_push *_ndr_info28; + NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_info28, 0, 28)); + NDR_CHECK(ndr_push_drsuapi_DsBindInfo28(_ndr_info28, NDR_SCALARS, &r->info28)); + NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info28, 0, 28)); + } + break; } + + case 48: { + { + struct ndr_push *_ndr_info48; + NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_info48, 0, 48)); + NDR_CHECK(ndr_push_drsuapi_DsBindInfo48(_ndr_info48, NDR_SCALARS, &r->info48)); + NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info48, 0, 48)); + } + break; } + + default: { + { + struct ndr_push *_ndr_Fallback; + NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_Fallback, 0, level)); + NDR_CHECK(ndr_push_drsuapi_DsBindInfoFallBack(_ndr_Fallback, NDR_SCALARS, &r->Fallback)); + NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_Fallback, 0, level)); + } + break; } + + } + } + if (ndr_flags & NDR_BUFFERS) { + uint32_t level = ndr_push_get_switch_value(ndr, r); + switch (level) { + case 24: + break; + + case 28: + break; + + case 48: + break; + + default: + break; + + } + } + return NDR_ERR_SUCCESS; +} + +enum ndr_err_code ndr_pull_drsuapi_DsBindInfo(struct ndr_pull *ndr, int ndr_flags, union drsuapi_DsBindInfo *r) +{ + uint32_t level; + level = ndr_pull_get_switch_value(ndr, r); + NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); + if (ndr_flags & NDR_SCALARS) { + NDR_CHECK(ndr_pull_union_align(ndr, 4)); + switch (level) { + case 24: { + { + struct ndr_pull *_ndr_info24; + NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_info24, 0, 24)); + NDR_CHECK(ndr_pull_drsuapi_DsBindInfo24(_ndr_info24, NDR_SCALARS, &r->info24)); + NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_info24, 0, 24)); + } + break; } + + case 28: { + { + struct ndr_pull *_ndr_info28; + NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_info28, 0, 28)); + NDR_CHECK(ndr_pull_drsuapi_DsBindInfo28(_ndr_info28, NDR_SCALARS, &r->info28)); + NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_info28, 0, 28)); + } + break; } + + case 48: { + { + struct ndr_pull *_ndr_info48; + NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_info48, 0, 48)); + NDR_CHECK(ndr_pull_drsuapi_DsBindInfo48(_ndr_info48, NDR_SCALARS, &r->info48)); + NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_info48, 0, 48)); + } + break; } + + default: { + { + struct ndr_pull *_ndr_Fallback; + NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_Fallback, 0, level)); + NDR_CHECK(ndr_pull_drsuapi_DsBindInfoFallBack(_ndr_Fallback, NDR_SCALARS, &r->Fallback)); + NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_Fallback, 0, level)); + } + break; } + + } + } + if (ndr_flags & NDR_BUFFERS) { + switch (level) { + case 24: + break; + + case 28: + break; + + case 48: + break; + + default: + break; + + } + } + return NDR_ERR_SUCCESS; +} + +_PUBLIC_ void ndr_print_drsuapi_DsBindInfo(struct ndr_print *ndr, const char *name, const union drsuapi_DsBindInfo *r) +{ + uint32_t level; + level = ndr_print_get_switch_value(ndr, r); + ndr_print_union(ndr, name, level, "drsuapi_DsBindInfo"); + switch (level) { + case 24: + ndr_print_drsuapi_DsBindInfo24(ndr, "info24", &r->info24); + break; + + case 28: + ndr_print_drsuapi_DsBindInfo28(ndr, "info28", &r->info28); + break; + + case 48: + ndr_print_drsuapi_DsBindInfo48(ndr, "info48", &r->info48); + break; + + default: + ndr_print_drsuapi_DsBindInfoFallBack(ndr, "Fallback", &r->Fallback); + break; + + } +} -- 1.9.1 From 4aa30929961c98e4227b7cdc9c48bfe8147c4063 Mon Sep 17 00:00:00 2001 From: Samuel Cabrero Date: Fri, 4 Jul 2014 12:45:59 +0200 Subject: [PATCH 5/6] idl:drsuapi: Manage all possible lengths of drsuapi_DsBindInfo Signed-off-by: Samuel Cabrero Reviewed-by: Kamen Mazdrashki Reviewed-by: Andrew Bartlett Reviewed-by: Kamen Mazdrashki (cherry picked from commit d747372d28273542298f86530e715e8faaf907f2) --- librpc/idl/drsuapi.idl | 21 +++++++++++++++++++++ source3/libnet/libnet_dssync.c | 21 ++++++++++++++++++++- source3/rpcclient/cmd_drsuapi.c | 4 ++++ source4/dsdb/repl/drepl_out_helpers.c | 27 ++++++++++++++++++++++++++- source4/libnet/libnet_become_dc.c | 25 ++++++++++++++++++++++++- source4/libnet/libnet_unbecome_dc.c | 25 ++++++++++++++++++++++++- source4/torture/drs/rpc/dssync.c | 21 ++++++++++++++++++++- source4/torture/drs/rpc/msds_intid.c | 21 ++++++++++++++++++++- source4/torture/rpc/dsgetinfo.c | 21 ++++++++++++++++++++- 9 files changed, 179 insertions(+), 7 deletions(-) diff --git a/librpc/idl/drsuapi.idl b/librpc/idl/drsuapi.idl index f1c6cd6..b78a865 100644 --- a/librpc/idl/drsuapi.idl +++ b/librpc/idl/drsuapi.idl @@ -129,6 +129,14 @@ interface drsuapi uint32 repl_epoch; } drsuapi_DsBindInfo28; + typedef [public] struct { + drsuapi_SupportedExtensions supported_extensions; + GUID site_guid; + uint32 pid; + uint32 repl_epoch; + drsuapi_SupportedExtensionsExt supported_extensions_ext; + } drsuapi_DsBindInfo32; + /* this is used by w2k8 */ typedef [public] struct { drsuapi_SupportedExtensions supported_extensions; @@ -139,6 +147,17 @@ interface drsuapi GUID config_dn_guid; } drsuapi_DsBindInfo48; + /* this is used by w2k12 R2 [MS-DRSR] Section 5.39 */ + typedef [public] struct { + drsuapi_SupportedExtensions supported_extensions; + GUID site_guid; + uint32 pid; + uint32 repl_epoch; + drsuapi_SupportedExtensionsExt supported_extensions_ext; + GUID config_dn_guid; + drsuapi_SupportedExtensionsExt supported_capabilities_ext; + } drsuapi_DsBindInfo52; + typedef [public] struct { [flag(NDR_REMAINING)] DATA_BLOB info; } drsuapi_DsBindInfoFallBack; @@ -146,7 +165,9 @@ interface drsuapi typedef [nopull, nopush, noprint] [nodiscriminant] union { [case(24)][subcontext(0), subcontext_size(24)] drsuapi_DsBindInfo24 info24; [case(28)][subcontext(0), subcontext_size(28)] drsuapi_DsBindInfo28 info28; + [case(32)][subcontext(0), subcontext_size(32)] drsuapi_DsBindInfo32 info32; [case(48)][subcontext(0), subcontext_size(48)] drsuapi_DsBindInfo48 info48; + [case(52)][subcontext(0), subcontext_size(52)] drsuapi_DsBindInfo52 info52; /* * The size for the defaut case is a bit arbitrary it in fact the value * of the switch but we can't reference it. diff --git a/source3/libnet/libnet_dssync.c b/source3/libnet/libnet_dssync.c index a843106..94f0628 100644 --- a/source3/libnet/libnet_dssync.c +++ b/source3/libnet/libnet_dssync.c @@ -195,9 +195,19 @@ static NTSTATUS libnet_dssync_bind(TALLOC_CTX *mem_ctx, ctx->remote_info28.repl_epoch = 0; break; } - case 28: + case 28: { ctx->remote_info28 = bind_info.info.info28; break; + } + case 32: { + struct drsuapi_DsBindInfo32 *info32; + info32 = &bind_info.info.info32; + ctx->remote_info28.site_guid = info32->site_guid; + ctx->remote_info28.supported_extensions = info32->supported_extensions; + ctx->remote_info28.pid = info32->pid; + ctx->remote_info28.repl_epoch = info32->repl_epoch; + break; + } case 48: { struct drsuapi_DsBindInfo48 *info48; info48 = &bind_info.info.info48; @@ -207,6 +217,15 @@ static NTSTATUS libnet_dssync_bind(TALLOC_CTX *mem_ctx, ctx->remote_info28.repl_epoch = info48->repl_epoch; break; } + case 52: { + struct drsuapi_DsBindInfo52 *info52; + info52 = &bind_info.info.info52; + ctx->remote_info28.site_guid = info52->site_guid; + ctx->remote_info28.supported_extensions = info52->supported_extensions; + ctx->remote_info28.pid = info52->pid; + ctx->remote_info28.repl_epoch = info52->repl_epoch; + break; + } default: DEBUG(1, ("Warning: invalid info length in bind info: %d\n", bind_info.length)); diff --git a/source3/rpcclient/cmd_drsuapi.c b/source3/rpcclient/cmd_drsuapi.c index 0c281cf..6a1fac7 100644 --- a/source3/rpcclient/cmd_drsuapi.c +++ b/source3/rpcclient/cmd_drsuapi.c @@ -420,8 +420,12 @@ static WERROR cmd_drsuapi_getncchanges(struct rpc_pipe_client *cli, supported_extensions = bind_info.info.info24.supported_extensions; } else if (bind_info.length == 28) { supported_extensions = bind_info.info.info28.supported_extensions; + } else if (bind_info.length == 32) { + supported_extensions = bind_info.info.info32.supported_extensions; } else if (bind_info.length == 48) { supported_extensions = bind_info.info.info48.supported_extensions; + } else if (bind_info.length == 52) { + supported_extensions = bind_info.info.info52.supported_extensions; } if (!nc_dn) { diff --git a/source4/dsdb/repl/drepl_out_helpers.c b/source4/dsdb/repl/drepl_out_helpers.c index 57205a8..df19e8f 100644 --- a/source4/dsdb/repl/drepl_out_helpers.c +++ b/source4/dsdb/repl/drepl_out_helpers.c @@ -183,10 +183,35 @@ static void dreplsrv_out_drsuapi_bind_done(struct tevent_req *subreq) info28->repl_epoch = info48->repl_epoch; break; } - case 28: + case 28: { *info28 = state->bind_r.out.bind_info->info.info28; break; } + case 32: { + struct drsuapi_DsBindInfo32 *info32; + info32 = &state->bind_r.out.bind_info->info.info32; + + info28->supported_extensions = info32->supported_extensions; + info28->site_guid = info32->site_guid; + info28->pid = info32->pid; + info28->repl_epoch = info32->repl_epoch; + break; + } + case 52: { + struct drsuapi_DsBindInfo52 *info52; + info52 = &state->bind_r.out.bind_info->info.info52; + + info28->supported_extensions = info52->supported_extensions; + info28->site_guid = info52->site_guid; + info28->pid = info52->pid; + info28->repl_epoch = info52->repl_epoch; + break; + } + default: + DEBUG(1, ("Warning: invalid info length in bind info: %d\n", + state->bind_r.out.bind_info->length)); + break; + } } tevent_req_done(req); diff --git a/source4/libnet/libnet_become_dc.c b/source4/libnet/libnet_become_dc.c index 3e4c7f8..6838794 100644 --- a/source4/libnet/libnet_become_dc.c +++ b/source4/libnet/libnet_become_dc.c @@ -1708,10 +1708,33 @@ static WERROR becomeDC_drsuapi_bind_recv(struct libnet_BecomeDC_state *s, drsuapi->remote_info28.repl_epoch = info48->repl_epoch; break; } - case 28: + case 28: { drsuapi->remote_info28 = drsuapi->bind_r.out.bind_info->info.info28; break; } + case 32: { + struct drsuapi_DsBindInfo32 *info32; + info32 = &drsuapi->bind_r.out.bind_info->info.info32; + drsuapi->remote_info28.supported_extensions = info32->supported_extensions; + drsuapi->remote_info28.site_guid = info32->site_guid; + drsuapi->remote_info28.pid = info32->pid; + drsuapi->remote_info28.repl_epoch = info32->repl_epoch; + break; + } + case 52: { + struct drsuapi_DsBindInfo52 *info52; + info52 = &drsuapi->bind_r.out.bind_info->info.info52; + drsuapi->remote_info28.supported_extensions = info52->supported_extensions; + drsuapi->remote_info28.site_guid = info52->site_guid; + drsuapi->remote_info28.pid = info52->pid; + drsuapi->remote_info28.repl_epoch = info52->repl_epoch; + break; + } + default: + DEBUG(1, ("Warning: invalid info length in bind info: %d\n", + drsuapi->bind_r.out.bind_info->length)); + break; + } } return WERR_OK; diff --git a/source4/libnet/libnet_unbecome_dc.c b/source4/libnet/libnet_unbecome_dc.c index a46d143..a830d3f 100644 --- a/source4/libnet/libnet_unbecome_dc.c +++ b/source4/libnet/libnet_unbecome_dc.c @@ -644,10 +644,33 @@ static void unbecomeDC_drsuapi_bind_recv(struct tevent_req *subreq) s->drsuapi.remote_info28.repl_epoch = info48->repl_epoch; break; } - case 28: + case 28: { s->drsuapi.remote_info28 = s->drsuapi.bind_r.out.bind_info->info.info28; break; } + case 32: { + struct drsuapi_DsBindInfo32 *info32; + info32 = &s->drsuapi.bind_r.out.bind_info->info.info32; + s->drsuapi.remote_info28.supported_extensions = info32->supported_extensions; + s->drsuapi.remote_info28.site_guid = info32->site_guid; + s->drsuapi.remote_info28.pid = info32->pid; + s->drsuapi.remote_info28.repl_epoch = info32->repl_epoch; + break; + } + case 52: { + struct drsuapi_DsBindInfo52 *info52; + info52 = &s->drsuapi.bind_r.out.bind_info->info.info52; + s->drsuapi.remote_info28.supported_extensions = info52->supported_extensions; + s->drsuapi.remote_info28.site_guid = info52->site_guid; + s->drsuapi.remote_info28.pid = info52->pid; + s->drsuapi.remote_info28.repl_epoch = info52->repl_epoch; + break; + } + default: + DEBUG(1, ("Warning: invalid info length in bind info: %d\n", + s->drsuapi.bind_r.out.bind_info->length)); + break; + } } unbecomeDC_drsuapi_remove_ds_server_send(s); diff --git a/source4/torture/drs/rpc/dssync.c b/source4/torture/drs/rpc/dssync.c index f6cc0f1..525c9f0 100644 --- a/source4/torture/drs/rpc/dssync.c +++ b/source4/torture/drs/rpc/dssync.c @@ -238,9 +238,28 @@ static bool _test_DsBind(struct torture_context *tctx, b->peer_bind_info28.repl_epoch = info48->repl_epoch; break; } - case 28: + case 28: { b->peer_bind_info28 = b->req.out.bind_info->info.info28; break; + } + case 32: { + struct drsuapi_DsBindInfo32 *info32; + info32 = &b->req.out.bind_info->info.info32; + b->peer_bind_info28.supported_extensions= info32->supported_extensions; + b->peer_bind_info28.site_guid = info32->site_guid; + b->peer_bind_info28.pid = info32->pid; + b->peer_bind_info28.repl_epoch = info32->repl_epoch; + break; + } + case 52: { + struct drsuapi_DsBindInfo52 *info52; + info52 = &b->req.out.bind_info->info.info52; + b->peer_bind_info28.supported_extensions= info52->supported_extensions; + b->peer_bind_info28.site_guid = info52->site_guid; + b->peer_bind_info28.pid = info52->pid; + b->peer_bind_info28.repl_epoch = info52->repl_epoch; + break; + } default: printf("DsBind - warning: unknown BindInfo length: %u\n", b->req.out.bind_info->length); diff --git a/source4/torture/drs/rpc/msds_intid.c b/source4/torture/drs/rpc/msds_intid.c index c866c21..a74f52b 100644 --- a/source4/torture/drs/rpc/msds_intid.c +++ b/source4/torture/drs/rpc/msds_intid.c @@ -237,9 +237,28 @@ static bool _test_DsaBind(struct torture_context *tctx, bi->srv_info48.repl_epoch = info28->repl_epoch; break; } - case 48: + case 48: { bi->srv_info48 = r.out.bind_info->info.info48; break; + } + case 32: { + struct drsuapi_DsBindInfo32 *info32; + info32 = &r.out.bind_info->info.info32; + bi->srv_info48.supported_extensions = info32->supported_extensions; + bi->srv_info48.site_guid = info32->site_guid; + bi->srv_info48.pid = info32->pid; + bi->srv_info48.repl_epoch = info32->repl_epoch; + break; + } + case 52: { + struct drsuapi_DsBindInfo52 *info52; + info52 = &r.out.bind_info->info.info52; + bi->srv_info48.supported_extensions = info52->supported_extensions; + bi->srv_info48.site_guid = info52->site_guid; + bi->srv_info48.pid = info52->pid; + bi->srv_info48.repl_epoch = info52->repl_epoch; + break; + } default: torture_result(tctx, TORTURE_FAIL, "DsBind: unknown BindInfo length: %u", diff --git a/source4/torture/rpc/dsgetinfo.c b/source4/torture/rpc/dsgetinfo.c index a0360e8..179b010 100644 --- a/source4/torture/rpc/dsgetinfo.c +++ b/source4/torture/rpc/dsgetinfo.c @@ -200,9 +200,28 @@ static bool _test_DsBind(struct torture_context *tctx, b->peer_bind_info28.repl_epoch = info48->repl_epoch; break; } - case 28: + case 28: { b->peer_bind_info28 = b->req.out.bind_info->info.info28; break; + } + case 32: { + struct drsuapi_DsBindInfo32 *info32; + info32 = &b->req.out.bind_info->info.info32; + b->peer_bind_info28.supported_extensions= info32->supported_extensions; + b->peer_bind_info28.site_guid = info32->site_guid; + b->peer_bind_info28.pid = info32->pid; + b->peer_bind_info28.repl_epoch = info32->repl_epoch; + break; + } + case 52: { + struct drsuapi_DsBindInfo52 *info52; + info52 = &b->req.out.bind_info->info.info52; + b->peer_bind_info28.supported_extensions= info52->supported_extensions; + b->peer_bind_info28.site_guid = info52->site_guid; + b->peer_bind_info28.pid = info52->pid; + b->peer_bind_info28.repl_epoch = info52->repl_epoch; + break; + } default: printf("DsBind - warning: unknown BindInfo length: %u\n", b->req.out.bind_info->length); -- 1.9.1 From 36082148af4f009840439230d12c8c749a62a0e7 Mon Sep 17 00:00:00 2001 From: Matthieu Patou Date: Tue, 23 Sep 2014 13:45:32 -0700 Subject: [PATCH 6/6] librpc/ndr_drsuapi: Allow ndrdump to dump dsinfo52 blobs Change-Id: I6968b25c67587296b928b2193a9d48093c69c01a Signed-off-by: Matthieu Patou Reviewed-by: Stefan Metzmacher Reviewed-by: Andrew Bartlett (cherry picked from commit 1ac96a416d7d6db2476f56129166fd9e018e7306) --- librpc/ndr/ndr_drsuapi.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/librpc/ndr/ndr_drsuapi.c b/librpc/ndr/ndr_drsuapi.c index cef617b..45d3ac09 100644 --- a/librpc/ndr/ndr_drsuapi.c +++ b/librpc/ndr/ndr_drsuapi.c @@ -410,6 +410,8 @@ _PUBLIC_ void ndr_print_drsuapi_DsAddEntry_AttrErrListItem_V1(struct ndr_print * enum ndr_err_code ndr_push_drsuapi_DsBindInfo(struct ndr_push *ndr, int ndr_flags, const union drsuapi_DsBindInfo *r) { + uint32_t _flags_save = ndr->flags; + ndr->flags = ndr->flags & ~LIBNDR_FLAG_NDR64; NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); if (ndr_flags & NDR_SCALARS) { uint32_t level = ndr_push_get_switch_value(ndr, r); @@ -442,6 +444,15 @@ enum ndr_err_code ndr_push_drsuapi_DsBindInfo(struct ndr_push *ndr, int ndr_flag } break; } + case 52: { + { + struct ndr_push *_ndr_info52; + NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_info52, 0, 52)); + NDR_CHECK(ndr_push_drsuapi_DsBindInfo52(_ndr_info52, NDR_SCALARS, &r->info52)); + NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info52, 0, 52)); + } + break; } + default: { { struct ndr_push *_ndr_Fallback; @@ -465,17 +476,23 @@ enum ndr_err_code ndr_push_drsuapi_DsBindInfo(struct ndr_push *ndr, int ndr_flag case 48: break; + case 52: + break; + default: break; } } + ndr->flags = _flags_save; return NDR_ERR_SUCCESS; } enum ndr_err_code ndr_pull_drsuapi_DsBindInfo(struct ndr_pull *ndr, int ndr_flags, union drsuapi_DsBindInfo *r) { uint32_t level; + uint32_t _flags_save = ndr->flags; + ndr->flags = ndr->flags & ~LIBNDR_FLAG_NDR64; level = ndr_pull_get_switch_value(ndr, r); NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); if (ndr_flags & NDR_SCALARS) { @@ -508,6 +525,15 @@ enum ndr_err_code ndr_pull_drsuapi_DsBindInfo(struct ndr_pull *ndr, int ndr_flag } break; } + case 52: { + { + struct ndr_pull *_ndr_info52; + NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_info52, 0, 52)); + NDR_CHECK(ndr_pull_drsuapi_DsBindInfo52(_ndr_info52, NDR_SCALARS, &r->info52)); + NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_info52, 0, 52)); + } + break; } + default: { { struct ndr_pull *_ndr_Fallback; @@ -530,11 +556,15 @@ enum ndr_err_code ndr_pull_drsuapi_DsBindInfo(struct ndr_pull *ndr, int ndr_flag case 48: break; + case 52: + break; + default: break; } } + ndr->flags = _flags_save; return NDR_ERR_SUCCESS; } @@ -556,6 +586,10 @@ _PUBLIC_ void ndr_print_drsuapi_DsBindInfo(struct ndr_print *ndr, const char *na ndr_print_drsuapi_DsBindInfo48(ndr, "info48", &r->info48); break; + case 52: + ndr_print_drsuapi_DsBindInfo52(ndr, "info52", &r->info52); + break; + default: ndr_print_drsuapi_DsBindInfoFallBack(ndr, "Fallback", &r->Fallback); break; -- 1.9.1