summaryrefslogtreecommitdiff
path: root/librpc
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2023-03-29 11:49:43 +1300
committerAndrew Bartlett <abartlet@samba.org>2023-03-31 01:48:30 +0000
commitc6981f60549c497d401c4c4173dc362f083791d7 (patch)
tree38dea45f14f5efda67c9464940442ad4b07e5b80 /librpc
parent0ef71cf1524e855b0ae17051b054ef27d1c95717 (diff)
downloadsamba-c6981f60549c497d401c4c4173dc362f083791d7.tar.gz
librpc/ndr: Make ndr_push_compression_state_free() a talloc destructor
This means that the generic_mszip_free() will still be called on failure. Signed-off-by: Andrew Bartlett <abartlet@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Diffstat (limited to 'librpc')
-rw-r--r--librpc/ndr/ndr_cab.c3
-rw-r--r--librpc/ndr/ndr_compression.c39
-rw-r--r--librpc/ndr/ndr_compression.h1
3 files changed, 20 insertions, 23 deletions
diff --git a/librpc/ndr/ndr_cab.c b/librpc/ndr/ndr_cab.c
index 42e18e9624b..ac8565fd1e0 100644
--- a/librpc/ndr/ndr_cab.c
+++ b/librpc/ndr/ndr_cab.c
@@ -236,8 +236,7 @@ static enum ndr_err_code ndr_push_folder_cfdata(struct ndr_push *ndr,
SIVAL(ndr->data, csum_offset, csum);
}
- ndr_push_compression_state_free(ndr->cstate);
- ndr->cstate = NULL;
+ TALLOC_FREE(ndr->cstate);
return NDR_ERR_SUCCESS;
}
diff --git a/librpc/ndr/ndr_compression.c b/librpc/ndr/ndr_compression.c
index 5374cdfbb1f..1133d5216db 100644
--- a/librpc/ndr/ndr_compression.c
+++ b/librpc/ndr/ndr_compression.c
@@ -1066,6 +1066,23 @@ void ndr_pull_compression_state_free(struct ndr_compression_state *state)
TALLOC_FREE(state);
}
+static int ndr_push_compression_state_free(struct ndr_compression_state *state)
+{
+ switch (state->type) {
+ case NDR_COMPRESSION_NONE:
+ case NDR_COMPRESSION_MSZIP:
+ case NDR_COMPRESSION_XPRESS:
+ case NDR_COMPRESSION_XPRESS_HUFF_RAW:
+ break;
+ case NDR_COMPRESSION_MSZIP_CAB:
+ generic_mszip_free(state);
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
enum ndr_err_code ndr_push_compression_state_init(struct ndr_push *ndr,
enum ndr_compression_alg compression_alg,
struct ndr_compression_state **state)
@@ -1112,28 +1129,10 @@ enum ndr_err_code ndr_push_compression_state_init(struct ndr_push *ndr,
break;
}
+ talloc_set_destructor(s, ndr_push_compression_state_free);
+
*state = s;
return NDR_ERR_SUCCESS;
}
-void ndr_push_compression_state_free(struct ndr_compression_state *state)
-{
- if (state == NULL) {
- return;
- }
-
- switch (state->type) {
- case NDR_COMPRESSION_NONE:
- case NDR_COMPRESSION_MSZIP:
- case NDR_COMPRESSION_XPRESS:
- case NDR_COMPRESSION_XPRESS_HUFF_RAW:
- break;
- case NDR_COMPRESSION_MSZIP_CAB:
- generic_mszip_free(state);
- break;
- default:
- break;
- }
- TALLOC_FREE(state);
-}
diff --git a/librpc/ndr/ndr_compression.h b/librpc/ndr/ndr_compression.h
index 15b6f27984e..7f938523ada 100644
--- a/librpc/ndr/ndr_compression.h
+++ b/librpc/ndr/ndr_compression.h
@@ -55,7 +55,6 @@ 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);
-void ndr_push_compression_state_free(struct ndr_compression_state *state);
#undef _PRINTF_ATTRIBUTE
#define _PRINTF_ATTRIBUTE(a1, a2)