aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-kafka.c
diff options
context:
space:
mode:
authorMartin Kaiser <wireshark@kaiser.cx>2020-07-12 14:19:31 +0200
committerAnders Broman <a.broman58@gmail.com>2020-07-13 05:12:09 +0000
commit32a804dea2b6d657b581f5e5e14585099c53ddbe (patch)
treeda7a67703801bcde00ed79170760ff011d5512d2 /epan/dissectors/packet-kafka.c
parenta71ecfa2b533e5bf7290282091c15f7c7d7b6226 (diff)
kafka: snappy: free the composite tvb only once
The snappy decompression routine has the same bug that was fixed for lz4 in 79576219c9 ("kafka: lz4: free the composite tvb only once"). Refactor the composite tvb handling for snappy as well. 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: Ide3a88d1c02e525fe1aadd176068ce68c2330b98 Reviewed-on: https://code.wireshark.org/review/37838 Reviewed-by: Martin Kaiser <wireshark@kaiser.cx> Petri-Dish: Martin Kaiser <wireshark@kaiser.cx> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-kafka.c')
-rw-r--r--epan/dissectors/packet-kafka.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/epan/dissectors/packet-kafka.c b/epan/dissectors/packet-kafka.c
index 7048e4308f..dc43b9f172 100644
--- a/epan/dissectors/packet-kafka.c
+++ b/epan/dissectors/packet-kafka.c
@@ -1416,8 +1416,6 @@ decompress_snappy(tvbuff_t *tvb, packet_info *pinfo, int offset, guint32 length,
/* xerial framing format */
guint32 chunk_size, pos = 16;
- composite_tvb = tvb_new_composite();
-
while (pos < length) {
if (pos > length-4) {
// XXX - this is presumably an error, as the chunk size
@@ -1448,16 +1446,15 @@ decompress_snappy(tvbuff_t *tvb, packet_info *pinfo, int offset, guint32 length,
if (rc != SNAPPY_OK) {
goto end;
}
+
+ if (!composite_tvb) {
+ composite_tvb = tvb_new_composite();
+ }
tvb_composite_append(composite_tvb,
tvb_new_child_real_data(tvb, decompressed_buffer, (guint)uncompressed_size, (gint)uncompressed_size));
pos += chunk_size;
}
- tvb_composite_finalize(composite_tvb);
- *decompressed_tvb = composite_tvb;
- *decompressed_offset = 0;
- composite_tvb = NULL;
-
} else {
/* unframed format */
@@ -1479,8 +1476,12 @@ decompress_snappy(tvbuff_t *tvb, packet_info *pinfo, int offset, guint32 length,
}
ret = 1;
end:
- if (composite_tvb != NULL) {
- tvb_free_chain(composite_tvb);
+ if (composite_tvb) {
+ tvb_composite_finalize(composite_tvb);
+ if (ret == 1) {
+ *decompressed_tvb = composite_tvb;
+ *decompressed_offset = 0;
+ }
}
if (ret == 0) {
col_append_str(pinfo->cinfo, COL_INFO, " [snappy decompression failed]");