attr_dissector_fn_t
[wireshark-sm.git] / epan / tvbuff_snappy.c
bloba5ebea0f61914ae75f9b8dc1593032cd94649e71
1 /* tvbuff_snappy.c
3 * Wireshark - Network traffic analyzer
4 * By Gerald Combs <gerald@wireshark.org>
5 * Copyright 1998 Gerald Combs
7 * SPDX-License-Identifier: GPL-2.0-or-later
8 */
10 #include <config.h>
12 #ifdef HAVE_SNAPPY
13 #include <snappy-c.h>
14 #endif
16 #include "tvbuff.h"
18 #ifdef HAVE_SNAPPY
21 * Uncompresses a snappy compressed packet inside a message of tvb at offset with
22 * length comprlen. Returns an uncompressed tvbuffer if uncompression
23 * succeeded or NULL if uncompression failed.
26 tvbuff_t *
27 tvb_uncompress_snappy(tvbuff_t *tvb, const int offset, int comprlen)
29 tvbuff_t *uncompr_tvb = NULL;
30 unsigned char *decompressed_buffer = NULL;
31 size_t orig_size = 0;
32 snappy_status ret;
33 const void *compr_ptr;
35 if (tvb == NULL || comprlen <= 0 || comprlen > tvb_captured_length_remaining(tvb, offset)) {
36 return NULL;
39 compr_ptr = tvb_get_ptr(tvb, offset, comprlen);
40 ret = snappy_uncompressed_length(compr_ptr, comprlen, &orig_size);
42 if (ret == SNAPPY_OK) {
43 decompressed_buffer = (unsigned char *)g_malloc(orig_size);
45 ret = snappy_uncompress(compr_ptr, comprlen, decompressed_buffer, &orig_size);
47 if (ret == SNAPPY_OK) {
48 uncompr_tvb = tvb_new_real_data(decompressed_buffer, (uint32_t)orig_size, (uint32_t)orig_size);
49 tvb_set_free_cb(uncompr_tvb, g_free);
50 } else {
51 g_free(decompressed_buffer);
55 return uncompr_tvb;
57 #else
58 tvbuff_t *
59 tvb_uncompress_snappy(tvbuff_t *tvb _U_, const int offset _U_, int comprlen _U_)
61 return NULL;
63 #endif
65 tvbuff_t *
66 tvb_child_uncompress_snappy(tvbuff_t *parent, tvbuff_t *tvb, const int offset, int comprlen)
68 tvbuff_t *new_tvb = tvb_uncompress_snappy(tvb, offset, comprlen);
69 if (new_tvb)
70 tvb_set_child_real_data_tvbuff(parent, new_tvb);
71 return new_tvb;
75 * Editor modelines - https://www.wireshark.org/tools/modelines.html
77 * Local variables:
78 * c-basic-offset: 4
79 * tab-width: 8
80 * indent-tabs-mode: nil
81 * End:
83 * vi: set shiftwidth=4 tabstop=8 expandtab:
84 * :indentSize=4:tabSize=8:noTabs=true: