librpc/ndr: Unimplement DRSUAPI_COMPRESSION_TYPE_XPRESS and rename
authorAndrew Bartlett <abartlet@samba.org>
Fri, 17 Mar 2023 00:10:09 +0000 (13:10 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 31 Mar 2023 01:48:30 +0000 (01:48 +0000)
DRSUAPI_COMPRESSION_TYPE_XPRESS is not MS-XCA nor is it implemented by
lzexpress_compress(), so disconnect from that algorithm.

This avoids someone fixing lzxpress_compress() to work for DRSUAPI
and breaking claims support.

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
librpc/idl/drsuapi.idl
librpc/ndr/libndr.h
librpc/ndr/ndr_drsuapi.c
python/samba/tests/blackbox/ndrdump.py
source3/libnet/libnet_dssync.c
source3/rpcclient/cmd_drsuapi.c
source4/dsdb/repl/drepl_out_helpers.c
source4/libnet/libnet_become_dc.c
source4/torture/drs/rpc/dssync.c

index 59a795a74e371de5fc83b0565784031650c5de39..a45855be12c4ab56233995f19ed5a60b6833f57d 100644 (file)
@@ -790,28 +790,28 @@ interface drsuapi
                uint32 decompressed_length;
                uint32 compressed_length;
                [subcontext(4),subcontext_size(compressed_length),
-                compression(NDR_COMPRESSION_XPRESS,compressed_length,decompressed_length)]
+                compression(NDR_COMPRESSION_WIN2K3_LZ77_DIRECT2,compressed_length,decompressed_length)]
                 drsuapi_DsGetNCChangesCtr1TS *ts;
-       } drsuapi_DsGetNCChangesXPRESSCtr1;
+       } drsuapi_DsGetNCChangesWIN2K3_LZ77_DIRECT2Ctr1;
 
        typedef [nopush] struct {
                uint32 decompressed_length;
                uint32 compressed_length;
                [subcontext(4),subcontext_size(compressed_length),
-                compression(NDR_COMPRESSION_XPRESS,compressed_length,decompressed_length)]
+                compression(NDR_COMPRESSION_WIN2K3_LZ77_DIRECT2,compressed_length,decompressed_length)]
                 drsuapi_DsGetNCChangesCtr6TS *ts;
-       } drsuapi_DsGetNCChangesXPRESSCtr6;
+       } drsuapi_DsGetNCChangesWIN2K3_LZ77_DIRECT2Ctr6;
 
        typedef [enum16bit] enum {
                DRSUAPI_COMPRESSION_TYPE_MSZIP  = 2,
-               DRSUAPI_COMPRESSION_TYPE_XPRESS = 3
+               DRSUAPI_COMPRESSION_TYPE_WIN2K3_LZ77_DIRECT2    = 3 /* CompressOrDecompressWin2k3 DRS_COMP_ALG_WIN2K3 */
        } drsuapi_DsGetNCChangesCompressionType;
 
        typedef [nodiscriminant,flag(NDR_PAHEX)] union {
                [case(1|(DRSUAPI_COMPRESSION_TYPE_MSZIP<<16))]  drsuapi_DsGetNCChangesMSZIPCtr1 mszip1;
                [case(6|(DRSUAPI_COMPRESSION_TYPE_MSZIP<<16))]  drsuapi_DsGetNCChangesMSZIPCtr6 mszip6;
-               [case(1|(DRSUAPI_COMPRESSION_TYPE_XPRESS<<16))] drsuapi_DsGetNCChangesXPRESSCtr1 xpress1;
-               [case(6|(DRSUAPI_COMPRESSION_TYPE_XPRESS<<16))] drsuapi_DsGetNCChangesXPRESSCtr6 xpress6;
+               [case(1|(DRSUAPI_COMPRESSION_TYPE_WIN2K3_LZ77_DIRECT2<<16))]    drsuapi_DsGetNCChangesWIN2K3_LZ77_DIRECT2Ctr1 xpress1;
+               [case(6|(DRSUAPI_COMPRESSION_TYPE_WIN2K3_LZ77_DIRECT2<<16))]    drsuapi_DsGetNCChangesWIN2K3_LZ77_DIRECT2Ctr6 xpress6;
        } drsuapi_DsGetNCChangesCompressedCtr;
 
        typedef struct {
index 98f8ff870d2e15cccda3aa5b8b9fc437c6eb3ea9..65b111d532c340f47d670252b78a0a41bde7d748 100644 (file)
@@ -292,7 +292,8 @@ enum ndr_err_code {
 enum ndr_compression_alg {
        NDR_COMPRESSION_MSZIP_CAB = 1,
        NDR_COMPRESSION_MSZIP   = 2,
-       NDR_COMPRESSION_XPRESS  = 3
+       NDR_COMPRESSION_XPRESS  = 3,
+       NDR_COMPRESSION_WIN2K3_LZ77_DIRECT2     = 4, /* Unimplemented */
 };
 
 /*
index cda2e2cf3c579287ce716d2022e7c4cd2c9c1afb..d4cc5a92a5cbee1d7e900fa71eef34aef27c53cb 100644 (file)
@@ -291,7 +291,7 @@ enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesMSZIPCtr6(struct ndr_push *ndr,
        return NDR_ERR_SUCCESS;
 }
 
-enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesXPRESSCtr1(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_DsGetNCChangesXPRESSCtr1 *r)
+enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesWIN2K3_LZ77_DIRECT2Ctr1(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_DsGetNCChangesWIN2K3_LZ77_DIRECT2Ctr1 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                uint32_t decompressed_length = 0;
@@ -302,10 +302,10 @@ enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesXPRESSCtr1(struct ndr_push *ndr
                                NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
                                {
                                        struct ndr_push *_ndr_ts_compressed;
-                                       NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
+                                       NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_WIN2K3_LZ77_DIRECT2, -1));
                                        NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr1TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
                                        decompressed_length = _ndr_ts_compressed->offset;
-                                       NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
+                                       NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_WIN2K3_LZ77_DIRECT2, -1));
                                }
                                compressed_length = _ndr_ts->offset;
                                talloc_free(_ndr_ts);
@@ -323,9 +323,9 @@ enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesXPRESSCtr1(struct ndr_push *ndr
                                NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
                                {
                                        struct ndr_push *_ndr_ts_compressed;
-                                       NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
+                                       NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_WIN2K3_LZ77_DIRECT2, -1));
                                        NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr1TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
-                                       NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
+                                       NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_WIN2K3_LZ77_DIRECT2, -1));
                                }
                                NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_ts, 4, -1));
                        }
@@ -334,7 +334,7 @@ enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesXPRESSCtr1(struct ndr_push *ndr
        return NDR_ERR_SUCCESS;
 }
 
-enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesXPRESSCtr6(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_DsGetNCChangesXPRESSCtr6 *r)
+enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesWIN2K3_LZ77_DIRECT2Ctr6(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_DsGetNCChangesWIN2K3_LZ77_DIRECT2Ctr6 *r)
 {
        if (ndr_flags & NDR_SCALARS) {
                uint32_t decompressed_length = 0;
@@ -345,10 +345,10 @@ enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesXPRESSCtr6(struct ndr_push *ndr
                                NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
                                {
                                        struct ndr_push *_ndr_ts_compressed;
-                                       NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
+                                       NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_WIN2K3_LZ77_DIRECT2, -1));
                                        NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr6TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
                                        decompressed_length = _ndr_ts_compressed->offset;
-                                       NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
+                                       NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_WIN2K3_LZ77_DIRECT2, -1));
                                }
                                compressed_length = _ndr_ts->offset;
                                talloc_free(_ndr_ts);
@@ -366,9 +366,9 @@ enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesXPRESSCtr6(struct ndr_push *ndr
                                NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
                                {
                                        struct ndr_push *_ndr_ts_compressed;
-                                       NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
+                                       NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_WIN2K3_LZ77_DIRECT2, -1));
                                        NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr6TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
-                                       NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
+                                       NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_WIN2K3_LZ77_DIRECT2, -1));
                                }
                                NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_ts, 4, -1));
                        }
index 11d9441e51a9b0958f260e780e9decfbc72961c3..f7734735a1b21b324a067ab271992f91225f7ea2 100644 (file)
@@ -525,7 +525,7 @@ dump OK
         self.assertEqual(actual, expected)
 
     def test_ndrdump_fuzzed_ndr_compression(self):
-        expected = 'pull returned Buffer Size Error'
+        expected = 'ndr_pull_compression_start: ndr_pull_error\(Compression Error\): Bad compression algorithm 4 \(PULL\)'
         command = (
             "ndrdump --debug-stdout drsuapi 3 out --base64-input "
             "--input BwAAAAcAAAAGAAAAAwAgICAgICAJAAAAICAgIAkAAAAgIAAA//////8=")
@@ -535,7 +535,7 @@ dump OK
             self.fail(e)
         # check_output will return bytes
         # convert expected to bytes for python 3
-        self.assertRegex(actual.decode('utf8'), expected + '$')
+        self.assertRegex(actual.decode('utf8'), expected)
 
     def test_ndrdump_short_dnsProperty(self):
         expected = b'''pull returned Success
index e593ae8536cfd28d0ff741b80534a34df79139a4..7d5d8366b2272f9a739be09f857c75dcc4cdc7f0 100644 (file)
@@ -522,7 +522,7 @@ static NTSTATUS libnet_dssync_getncchanges(TALLOC_CTX *mem_ctx,
                        ctr6 = &ctr.ctr7.ctr.mszip6.ts->ctr6;
                } else if (level_out == 7
                           && ctr.ctr7.level == 6
-                          && ctr.ctr7.type == DRSUAPI_COMPRESSION_TYPE_XPRESS
+                          && ctr.ctr7.type == DRSUAPI_COMPRESSION_TYPE_WIN2K3_LZ77_DIRECT2
                           && ctr.ctr7.ctr.xpress6.ts) {
                        out_level = 6;
                        ctr6 = &ctr.ctr7.ctr.xpress6.ts->ctr6;
index 59ce7d3f3bd8cc228df95b3abab41b0f5a33d510..bf87a26a8d55d6fe511d637e950d51fffe279491 100644 (file)
@@ -642,7 +642,7 @@ static WERROR cmd_drsuapi_getncchanges(struct rpc_pipe_client *cli,
                        ctr6 = &ctr.ctr7.ctr.mszip6.ts->ctr6;
                } else if (level_out == 7
                           && ctr.ctr7.level == 6
-                          && ctr.ctr7.type == DRSUAPI_COMPRESSION_TYPE_XPRESS
+                          && ctr.ctr7.type == DRSUAPI_COMPRESSION_TYPE_WIN2K3_LZ77_DIRECT2
                           && ctr.ctr7.ctr.xpress6.ts) {
                        out_level = 6;
                        ctr6 = &ctr.ctr7.ctr.xpress6.ts->ctr6;
index 401d2bf2728385acd47f8070061c3dd3df8fbdb7..c4aa784674f1a0bc9a143d1d75d57ddaf12eb6ab 100644 (file)
@@ -724,7 +724,7 @@ static void dreplsrv_op_pull_source_get_changes_done(struct tevent_req *subreq)
                ctr6 = &r->out.ctr->ctr7.ctr.mszip6.ts->ctr6;
        } else if (*r->out.level_out == 7 &&
                   r->out.ctr->ctr7.level == 6 &&
-                  r->out.ctr->ctr7.type == DRSUAPI_COMPRESSION_TYPE_XPRESS &&
+                  r->out.ctr->ctr7.type == DRSUAPI_COMPRESSION_TYPE_WIN2K3_LZ77_DIRECT2 &&
                   r->out.ctr->ctr7.ctr.xpress6.ts) {
                ctr_level = 6;
                ctr6 = &r->out.ctr->ctr7.ctr.xpress6.ts->ctr6;
index e9153a049221e457641dbe94bc455ae9d114e82f..f40e4f9ffe810c7c1989e5ed6c244546189edfc2 100644 (file)
@@ -2725,7 +2725,7 @@ static WERROR becomeDC_drsuapi_pull_partition_recv(struct libnet_BecomeDC_state
                ctr6 = &r->out.ctr->ctr7.ctr.mszip6.ts->ctr6;
        } else if (*r->out.level_out == 7 &&
                   r->out.ctr->ctr7.level == 6 &&
-                  r->out.ctr->ctr7.type == DRSUAPI_COMPRESSION_TYPE_XPRESS &&
+                  r->out.ctr->ctr7.type == DRSUAPI_COMPRESSION_TYPE_WIN2K3_LZ77_DIRECT2 &&
                   r->out.ctr->ctr7.ctr.xpress6.ts) {
                ctr_level = 6;
                ctr6 = &r->out.ctr->ctr7.ctr.xpress6.ts->ctr6;
index df63c294db4e206106b0c7d42041a53b34ccb653..64d04980bc756beaa554ea281e28f5bdd287c52d 100644 (file)
@@ -859,7 +859,7 @@ static bool test_GetNCChanges(struct torture_context *tctx,
                                ctr6 = &r.out.ctr->ctr7.ctr.mszip6.ts->ctr6;
                        } else if (ret == true && *r.out.level_out == 7
                                   && r.out.ctr->ctr7.level == 6
-                                  && r.out.ctr->ctr7.type == DRSUAPI_COMPRESSION_TYPE_XPRESS
+                                  && r.out.ctr->ctr7.type == DRSUAPI_COMPRESSION_TYPE_WIN2K3_LZ77_DIRECT2
                                   && r.out.ctr->ctr7.ctr.xpress6.ts) {
                                out_level = 6;
                                ctr6 = &r.out.ctr->ctr7.ctr.xpress6.ts->ctr6;