idl:drsuapi: Manage all possible lengths of drsuapi_DsBindInfo
authorSamuel Cabrero <scabrero@zentyal.com>
Fri, 4 Jul 2014 10:45:59 +0000 (12:45 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 10 Mar 2015 09:55:45 +0000 (10:55 +0100)
Signed-off-by: Samuel Cabrero <scabrero@zentyal.com>
Reviewed-by: Kamen Mazdrashki <kamenim@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Kamen Mazdrashki <kamenim@samba.org>
(cherry picked from commit d747372d28273542298f86530e715e8faaf907f2)

librpc/idl/drsuapi.idl
source3/libnet/libnet_dssync.c
source3/rpcclient/cmd_drsuapi.c
source4/dsdb/repl/drepl_out_helpers.c
source4/libnet/libnet_become_dc.c
source4/libnet/libnet_unbecome_dc.c
source4/torture/drs/rpc/dssync.c
source4/torture/drs/rpc/msds_intid.c
source4/torture/rpc/dsgetinfo.c

index f1c6cd6e9118246601588af850a1c56d72230e4c..b78a8655d9ea3a7e8483a408a88b5f7a85e5d6ed 100644 (file)
@@ -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.
index a8431066efa9a5691bb2ec0d38d5853cce6a48ab..94f06285a89d45c9212ff136416772554458b216 100644 (file)
@@ -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));
index 0c281cf8d1f8f98837161ce6226165aa96359f55..6a1fac7bfad3b77bf06efe747dcfe6a171291980 100644 (file)
@@ -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) {
index 57205a8426014ec1d6acf58fc54a95e51e61444d..df19e8f3a7a973162ae3aca591b303383b951253 100644 (file)
@@ -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);
index 3e4c7f871cc69eb74bb0c79ca39cbff68dfe061d..683879483ffc1deb2f8f769d0921641368d45216 100644 (file)
@@ -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;
index a46d1433bc6f69a33563b0919b151ebd773485e1..a830d3fb272480e6650274b1338d1e3a1158e71d 100644 (file)
@@ -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);
index f6cc0f1026bc955d7b709c85a28bc9a6a566a58b..525c9f0acbebeeb8c48e0b489e4d5ae4a5f5ef0b 100644 (file)
@@ -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);
index c866c2181b8f400302d2adbeafb93b4070dc6848..a74f52b9f9b2c050f2f999e8d64e7f63b10fd773 100644 (file)
@@ -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",
index a0360e84041196dab3a5f7475d02c5f81452b2fc..179b0101fdb41ae28ef18bae47cab8d1d387c9db 100644 (file)
@@ -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);