summaryrefslogtreecommitdiff
path: root/librpc
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2023-05-01 14:30:31 +1200
committerAndrew Bartlett <abartlet@samba.org>2023-05-05 02:54:30 +0000
commit963688b3a5acbf0714377b4b17e5cbbbd31e50d9 (patch)
treece64bf95f1bb0934902eec35b87871235d207fd0 /librpc
parentff2de50aa4bf086880ab8cd1c2aee7e998c2c22a (diff)
downloadsamba-963688b3a5acbf0714377b4b17e5cbbbd31e50d9.tar.gz
librpc: Always call ndr_push_compression_state_init() for compression
This allows the push routine to cache the chosen compression algorithm in the struct ndr_compression_state in ndr->cstate and so, in claims, avoid calling ndr_size_CLAIMS_SET_NDR() three times per compression (more in the overall push). As claims is now the primary use of the libndr compression code, this is a reasonable tradeoff compared to the other callers who have more static algorithm selections. By removing the struct ndr_compression_state **state argument from ndr_push_compression_state_init() we make clear that the ndr->cstate belongs to this NDR context, and this context alone. Signed-off-by: Andrew Bartlett <abartlet@samba.org> Reviewed-by: Joseph Sutton <josephsutton@catalyst.net.nz>
Diffstat (limited to 'librpc')
-rw-r--r--librpc/ndr/ndr_cab.c13
-rw-r--r--librpc/ndr/ndr_compression.c21
-rw-r--r--librpc/ndr/ndr_compression.h9
-rw-r--r--librpc/ndr/ndr_drsuapi.c40
4 files changed, 50 insertions, 33 deletions
diff --git a/librpc/ndr/ndr_cab.c b/librpc/ndr/ndr_cab.c
index 322412fdac3..3efb14fc874 100644
--- a/librpc/ndr/ndr_cab.c
+++ b/librpc/ndr/ndr_cab.c
@@ -132,7 +132,7 @@ static enum ndr_err_code ndr_push_folder_cfdata(struct ndr_push *ndr,
if (cab_ctype == CF_COMPRESS_MSZIP) {
ndr_ctype = NDR_COMPRESSION_MSZIP_CAB;
- NDR_CHECK(ndr_push_compression_state_init(ndr, ndr_ctype, &ndr->cstate));
+ NDR_CHECK(ndr_push_compression_state_init(ndr, ndr_ctype));
}
for (i = 0; i < num_cfdata; i++, r++) {
@@ -189,11 +189,18 @@ static enum ndr_err_code ndr_push_folder_cfdata(struct ndr_push *ndr,
/* compress via subcontext */
NDR_CHECK(ndr_push_subcontext_start(ndr, &push_sub, 0, -1));
+
+ /*
+ * This assignment replaces a call to
+ * ndr_push_compression_state_init(push_sub, ndr_ctype))
+ * here. This is instead done outside the loop.
+ */
push_sub->cstate = ndr->cstate;
- NDR_CHECK(ndr_push_compression_start(push_sub, &push_compress, ndr_ctype));
+
+ NDR_CHECK(ndr_push_compression_start(push_sub, &push_compress));
ndr_set_flags(&push_compress->flags, LIBNDR_FLAG_REMAINING);
NDR_CHECK(ndr_push_DATA_BLOB(push_compress, NDR_SCALARS, r->ab));
- NDR_CHECK(ndr_push_compression_end(push_sub, push_compress, ndr_ctype));
+ NDR_CHECK(ndr_push_compression_end(push_sub, push_compress));
NDR_CHECK(ndr_push_subcontext_end(ndr, push_sub, 0, -1));
compressed_length = push_sub->offset;
diff --git a/librpc/ndr/ndr_compression.c b/librpc/ndr/ndr_compression.c
index 54f91f9efbf..4c961f84f4e 100644
--- a/librpc/ndr/ndr_compression.c
+++ b/librpc/ndr/ndr_compression.c
@@ -898,10 +898,10 @@ enum ndr_err_code ndr_pull_compression_end(struct ndr_pull *subndr,
push a compressed subcontext
*/
enum ndr_err_code ndr_push_compression_start(struct ndr_push *subndr,
- struct ndr_push **_uncomndr,
- enum ndr_compression_alg compression_alg)
+ struct ndr_push **_uncomndr)
{
struct ndr_push *uncomndr;
+ enum ndr_compression_alg compression_alg = subndr->cstate->type;
switch (compression_alg) {
case NDR_COMPRESSION_NONE:
@@ -928,13 +928,14 @@ enum ndr_err_code ndr_push_compression_start(struct ndr_push *subndr,
push a compressed subcontext
*/
enum ndr_err_code ndr_push_compression_end(struct ndr_push *subndr,
- struct ndr_push *uncomndr,
- enum ndr_compression_alg compression_alg)
+ struct ndr_push *uncomndr)
{
struct ndr_pull *ndrpull;
bool last = false;
z_stream z;
+ enum ndr_compression_alg compression_alg = subndr->cstate->type;
+
ndrpull = talloc_zero(uncomndr, struct ndr_pull);
NDR_ERR_HAVE_NO_MEMORY(ndrpull);
ndrpull->flags = uncomndr->flags;
@@ -1034,12 +1035,17 @@ enum ndr_err_code ndr_pull_compression_state_init(struct ndr_pull *ndr,
}
enum ndr_err_code ndr_push_compression_state_init(struct ndr_push *ndr,
- enum ndr_compression_alg compression_alg,
- struct ndr_compression_state **state)
+ enum ndr_compression_alg compression_alg)
{
struct ndr_compression_state *s;
int z_ret;
+ /*
+ * Avoid confusion, NULL out ndr->cstate at the start of the
+ * compression block
+ */
+ ndr->cstate = NULL;
+
s = talloc_zero(ndr, struct ndr_compression_state);
NDR_ERR_HAVE_NO_MEMORY(s);
s->type = compression_alg;
@@ -1079,8 +1085,7 @@ enum ndr_err_code ndr_push_compression_state_init(struct ndr_push *ndr,
break;
}
-
- *state = s;
+ ndr->cstate = s;
return NDR_ERR_SUCCESS;
}
diff --git a/librpc/ndr/ndr_compression.h b/librpc/ndr/ndr_compression.h
index 7f938523ada..3d335b2befd 100644
--- a/librpc/ndr/ndr_compression.h
+++ b/librpc/ndr/ndr_compression.h
@@ -42,19 +42,16 @@ enum ndr_err_code ndr_pull_compression_end(struct ndr_pull *subndr,
enum ndr_compression_alg compression_alg,
ssize_t decompressed_len);
enum ndr_err_code ndr_push_compression_start(struct ndr_push *subndr,
- struct ndr_push **_uncomndr,
- enum ndr_compression_alg compression_alg);
+ struct ndr_push **_uncomndr);
enum ndr_err_code ndr_push_compression_end(struct ndr_push *subndr,
- struct ndr_push *uncomndr,
- enum ndr_compression_alg compression_alg);
+ struct ndr_push *uncomndr);
enum ndr_err_code ndr_pull_compression_state_init(struct ndr_pull *ndr,
enum ndr_compression_alg compression_alg,
struct ndr_compression_state **state);
void ndr_pull_compression_state_free(struct ndr_compression_state *state);
enum ndr_err_code ndr_push_compression_state_init(struct ndr_push *ndr,
- enum ndr_compression_alg compression_alg,
- struct ndr_compression_state **state);
+ enum ndr_compression_alg compression_alg);
#undef _PRINTF_ATTRIBUTE
#define _PRINTF_ATTRIBUTE(a1, a2)
diff --git a/librpc/ndr/ndr_drsuapi.c b/librpc/ndr/ndr_drsuapi.c
index 0732ee3c6f4..c07ba48ff4b 100644
--- a/librpc/ndr/ndr_drsuapi.c
+++ b/librpc/ndr/ndr_drsuapi.c
@@ -216,10 +216,11 @@ enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesMSZIPCtr1(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_MSZIP));
+ NDR_CHECK(ndr_push_compression_state_init(_ndr_ts, NDR_COMPRESSION_MSZIP));
+ NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed));
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_MSZIP));
+ NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed));
}
compressed_length = _ndr_ts->offset;
talloc_free(_ndr_ts);
@@ -237,9 +238,10 @@ enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesMSZIPCtr1(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_MSZIP));
+ NDR_CHECK(ndr_push_compression_state_init(_ndr_ts, NDR_COMPRESSION_MSZIP));
+ NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed));
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_MSZIP));
+ NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed));
}
NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_ts, 4, -1));
}
@@ -259,10 +261,11 @@ enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesMSZIPCtr6(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_MSZIP));
+ NDR_CHECK(ndr_push_compression_state_init(_ndr_ts, NDR_COMPRESSION_MSZIP));
+ NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed));
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_MSZIP));
+ NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed));
}
compressed_length = _ndr_ts->offset;
talloc_free(_ndr_ts);
@@ -280,9 +283,10 @@ enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesMSZIPCtr6(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_MSZIP));
+ NDR_CHECK(ndr_push_compression_state_init(_ndr_ts, NDR_COMPRESSION_MSZIP));
+ NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed));
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_MSZIP));
+ NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed));
}
NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_ts, 4, -1));
}
@@ -302,10 +306,11 @@ enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesWIN2K3_LZ77_DIRECT2Ctr1(struct
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_WIN2K3_LZ77_DIRECT2));
+ NDR_CHECK(ndr_push_compression_state_init(_ndr_ts, NDR_COMPRESSION_WIN2K3_LZ77_DIRECT2));
+ NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed));
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_WIN2K3_LZ77_DIRECT2));
+ NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed));
}
compressed_length = _ndr_ts->offset;
talloc_free(_ndr_ts);
@@ -323,9 +328,10 @@ enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesWIN2K3_LZ77_DIRECT2Ctr1(struct
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_WIN2K3_LZ77_DIRECT2));
+ NDR_CHECK(ndr_push_compression_state_init(_ndr_ts, NDR_COMPRESSION_WIN2K3_LZ77_DIRECT2));
+ NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed));
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_WIN2K3_LZ77_DIRECT2));
+ NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed));
}
NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_ts, 4, -1));
}
@@ -345,10 +351,11 @@ enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesWIN2K3_LZ77_DIRECT2Ctr6(struct
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_WIN2K3_LZ77_DIRECT2));
+ NDR_CHECK(ndr_push_compression_state_init(_ndr_ts, NDR_COMPRESSION_WIN2K3_LZ77_DIRECT2));
+ NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed));
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_WIN2K3_LZ77_DIRECT2));
+ NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed));
}
compressed_length = _ndr_ts->offset;
talloc_free(_ndr_ts);
@@ -366,9 +373,10 @@ enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesWIN2K3_LZ77_DIRECT2Ctr6(struct
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_WIN2K3_LZ77_DIRECT2));
+ NDR_CHECK(ndr_push_compression_state_init(_ndr_ts, NDR_COMPRESSION_WIN2K3_LZ77_DIRECT2));
+ NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed));
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_WIN2K3_LZ77_DIRECT2));
+ NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed));
}
NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_ts, 4, -1));
}