aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-kafka.c
diff options
context:
space:
mode:
authorMartin Kaiser <wireshark@kaiser.cx>2020-07-15 22:44:01 +0200
committerAlexis La Goutte <alexis.lagoutte@gmail.com>2020-07-19 19:06:48 +0000
commitdc7f9353302fa1dd522a76130fa82c8d9fa62fbd (patch)
treed3addc1eb188ad8081b87be9660fb88072bf9ea1 /epan/dissectors/packet-kafka.c
parent391d45166330d4b159250fab30f9a36420c8faa9 (diff)
kafka: zstd: free the composite tvb only once
Fix the composite tvb handling for zstd decompression in the same way as we already did for lz4 and snappy. Allocate the composite tvb only if we are cetain that data will be added to it. Do not free the composite tvb ourselves, leave this to epan cleanup. Change-Id: Iac74ea6e6d220b05858a7eb267276ff983b1b2ab Reviewed-on: https://code.wireshark.org/review/37900 Reviewed-by: Martin Kaiser <wireshark@kaiser.cx> Petri-Dish: Martin Kaiser <wireshark@kaiser.cx> Tested-by: Petri Dish Buildbot Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-kafka.c')
-rw-r--r--epan/dissectors/packet-kafka.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/epan/dissectors/packet-kafka.c b/epan/dissectors/packet-kafka.c
index dc43b9f172..98404d951d 100644
--- a/epan/dissectors/packet-kafka.c
+++ b/epan/dissectors/packet-kafka.c
@@ -1504,7 +1504,7 @@ decompress_zstd(tvbuff_t *tvb, packet_info *pinfo, int offset, guint32 length, t
ZSTD_inBuffer input = { tvb_memdup(wmem_packet_scope(), tvb, offset, length), length, 0 };
ZSTD_DStream *zds = ZSTD_createDStream();
size_t rc = 0;
- tvbuff_t *composite_tvb = tvb_new_composite();
+ tvbuff_t *composite_tvb = NULL;
int ret = 0;
do {
@@ -1515,21 +1515,24 @@ decompress_zstd(tvbuff_t *tvb, packet_info *pinfo, int offset, guint32 length, t
if (ZSTD_isError(rc)) {
goto end;
}
+ if (!composite_tvb) {
+ composite_tvb = tvb_new_composite();
+ }
tvb_composite_append(composite_tvb,
tvb_new_child_real_data(tvb, (guint8*)output.dst, (guint)output.pos, (gint)output.pos));
// rc == 0 means there is nothing more to decompress, but there could be still something in the data
} while (rc > 0);
- tvb_composite_finalize(composite_tvb);
- *decompressed_tvb = composite_tvb;
- *decompressed_offset = 0;
- composite_tvb = NULL;
ret = 1;
end:
+ if (composite_tvb) {
+ tvb_composite_finalize(composite_tvb);
+ }
ZSTD_freeDStream(zds);
- if (composite_tvb != NULL) {
- tvb_free_chain(composite_tvb);
+ if (ret == 1) {
+ *decompressed_tvb = composite_tvb;
+ *decompressed_offset = 0;
}
- if (ret == 0) {
+ else {
col_append_str(pinfo->cinfo, COL_INFO, " [zstd decompression failed]");
}
return ret;