if (efp_length == LENGTH_ULEB128) {
guint64 value;
- efp_length = dissect_uleb128(tvb, offset, &value);
+ efp_length = tvb_get_varint(tvb, offset, FT_VARINT_MAX_LEN, &value);
} else if (efp_length == LENGTH_LEB128) {
gint64 value;
if (fde_count_length == LENGTH_ULEB128) {
- fde_count_length = dissect_uleb128(tvb, offset, &fde_count);
+ fde_count_length = tvb_get_varint(tvb, offset, FT_VARINT_MAX_LEN, &fde_count);
} else if (fde_count_length == LENGTH_LEB128) {
gint64 value;
if (table_entry_length == LENGTH_ULEB128) {
guint64 value;
- table_entry_length = dissect_uleb128(tvb, offset, &value);
+ table_entry_length = tvb_get_varint(tvb, offset, FT_VARINT_MAX_LEN, &value);
} else if (table_entry_length == LENGTH_LEB128) {
gint64 value;
tvb, offset, size, machine_encoding);
offset += size;
- size = dissect_uleb128(tvb, offset, &unsigned_value);
- proto_tree_add_uint64(entry_tree, hf_elf_eh_frame_code_alignment_factor,
- tvb, offset, size, unsigned_value);
+ proto_tree_add_item_ret_length(entry_tree, hf_elf_eh_frame_code_alignment_factor, tvb, offset, -1, ENC_LITTLE_ENDIAN|ENC_VARINT_PROTOBUF, &size);
offset += size;
size = dissect_leb128(tvb, offset, &signed_value);
offset += size;
/* according to DWARF v4 this is uLEB128 */
- size = dissect_uleb128(tvb, offset, &unsigned_value);
- proto_tree_add_uint64(entry_tree, hf_elf_eh_frame_return_address_register,
- tvb, offset, size, unsigned_value);
+ proto_tree_add_item_ret_length(entry_tree, hf_elf_eh_frame_return_address_register, tvb, offset, -1, ENC_LITTLE_ENDIAN|ENC_VARINT_PROTOBUF, &size);
offset += size;
} else {
proto_tree_add_item(entry_tree, hf_elf_eh_frame_fde_pc_begin, tvb,
/* "A 'z' may be present as the first character of the string. If
* present, the Augmentation Data field shall be present." (LSB 4.1) */
if (augmentation_string[0] == 'z') {
- size = dissect_uleb128(tvb, offset, &unsigned_value);
- proto_tree_add_uint64(entry_tree, is_cie ?
- hf_elf_eh_frame_augmentation_length :
- hf_elf_eh_frame_fde_augmentation_length,
- tvb, offset, size, unsigned_value);
+ proto_tree_add_item_ret_varint(entry_tree, is_cie ? hf_elf_eh_frame_augmentation_length : hf_elf_eh_frame_fde_augmentation_length,
+ tvb, offset, -1, ENC_LITTLE_ENDIAN|ENC_VARINT_PROTOBUF, &unsigned_value, &size);
offset += size;
proto_tree_add_item(entry_tree, is_cie ?
/* Reassemble SMPP TCP segments */
static gboolean reassemble_mqtt_over_tcp = TRUE;
-#define GET_MQTT_PDU_LEN(msg_len, len_offset) (msg_len + len_offset + MQTT_HDR_SIZE_BEFORE_LEN)
-
static guint get_mqtt_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb,
int offset, void *data _U_)
{
guint64 msg_len;
guint len_offset;
- len_offset = dissect_uleb128(tvb, (offset + MQTT_HDR_SIZE_BEFORE_LEN), &msg_len);
+ len_offset = tvb_get_varint(tvb, (offset + MQTT_HDR_SIZE_BEFORE_LEN), FT_VARINT_MAX_LEN, &msg_len);
/* Explicitly downcast the value, because the length can never be more than 4 bytes */
- return (guint)(GET_MQTT_PDU_LEN(msg_len, len_offset));
+ return (guint)(msg_len + len_offset + MQTT_HDR_SIZE_BEFORE_LEN);
}
static void *mqtt_message_decode_copy_cb(void *dest, const void *orig, size_t len _U_)
proto_item *ti;
guint64 vbi;
- const guint mqtt_prop_offset = dissect_uleb128(tvb, offset, &vbi);
+ const guint mqtt_prop_offset = tvb_get_varint(tvb, offset, FT_VARINT_MAX_LEN, &vbi);
/* Property Length field can be stored in uint32 */
const guint mqtt_prop_len = (gint)vbi;
case PROP_SUBSCRIPTION_IDENTIFIER:
{
- guint8 vbi_offset = dissect_uleb128(tvb, offset, &vbi);
- proto_tree_add_uint(mqtt_prop_tree, hf_mqtt_prop_num, tvb, offset, vbi_offset, (guint32)vbi);
- offset += vbi_offset;
+ gint vbi_len;
+ proto_tree_add_item_ret_length(mqtt_prop_tree, hf_mqtt_prop_num, tvb, offset, -1, ENC_LITTLE_ENDIAN|ENC_VARINT_PROTOBUF, &vbi_len);
+ offset += vbi_len;
break;
}
conversation_add_proto_data(conv, proto_mqtt, mqtt);
}
- mqtt_len_offset = dissect_uleb128(tvb, (offset + MQTT_HDR_SIZE_BEFORE_LEN), &msg_len);
+ mqtt_len_offset = tvb_get_varint(tvb, (offset + MQTT_HDR_SIZE_BEFORE_LEN), FT_VARINT_MAX_LEN, &msg_len);
/* Explicit downcast, typically maximum length of message could be 4 bytes */
mqtt_msg_len = (gint) msg_len;
{
guint64 len = 0;
- offset += dissect_uleb128( tvb, offset, &len );
+ offset += tvb_get_varint( tvb, offset, FT_VARINT_MAX_LEN, &len );
proto_tree_add_item(tree, hf_netsync_cmd_error_msg, tvb,
offset, (gint)len, ENC_ASCII|ENC_NA );
{
guint64 len = 0;
- offset += dissect_uleb128( tvb, offset, &len );
-
+ offset += tvb_get_varint( tvb, offset, FT_VARINT_MAX_LEN, &len );
proto_tree_add_item(tree, hf_netsync_cmd_hello_keyname, tvb,
offset, (gint)len, ENC_ASCII|ENC_NA );
offset += (gint)len;
- offset += dissect_uleb128( tvb, offset, &len );
-
+ offset += tvb_get_varint( tvb, offset, FT_VARINT_MAX_LEN, &len );
proto_tree_add_item(tree, hf_netsync_cmd_hello_key, tvb,
offset, (gint)len, ENC_NA );
offset += (gint)len;
offset, 1, ENC_BIG_ENDIAN );
offset += 1;
- offset += dissect_uleb128( tvb, offset, &len );
-
+ offset += tvb_get_varint( tvb, offset, FT_VARINT_MAX_LEN, &len );
proto_tree_add_item(tree, hf_netsync_cmd_anonymous_collection, tvb,
offset, (gint)len, ENC_ASCII|ENC_NA );
offset += (gint)len;
offset += 1;
- offset += dissect_uleb128( tvb, offset, &len );
-
+ offset += tvb_get_varint( tvb, offset, FT_VARINT_MAX_LEN, &len );
proto_tree_add_item(tree, hf_netsync_cmd_auth_collection, tvb,
offset, (gint)len, ENC_ASCII|ENC_NA );
offset += (gint)len;
offset, NETSNYC_MERKLE_HASH_LENGTH, ENC_NA );
offset += NETSNYC_MERKLE_HASH_LENGTH;
- offset += dissect_uleb128( tvb, offset, &len );
-
+ offset += tvb_get_varint( tvb, offset, FT_VARINT_MAX_LEN, &len );
proto_tree_add_item(tree, hf_netsync_cmd_auth_sig, tvb,
offset, (gint)len, ENC_NA );
offset += (gint)len;
{
guint64 len = 0;
- offset += dissect_uleb128( tvb, offset, &len );
-
+ offset += tvb_get_varint( tvb, offset, FT_VARINT_MAX_LEN, &len );
proto_tree_add_item(tree, hf_netsync_cmd_confirm_sig, tvb,
offset, (gint)len, ENC_NA );
offset += (gint)len;
static gint dissect_netsync_cmd_done(tvbuff_t *tvb, gint offset, proto_tree *tree, guint size _U_)
{
- guint64 len = 0;
- guint bytes = 0;
-
- bytes = dissect_uleb128( tvb, offset, &len );
+ gint bytes = 0;
- proto_tree_add_uint(tree, hf_netsync_cmd_done_level, tvb,
- offset, bytes, (guint32)len );
+ proto_tree_add_item_ret_length(tree, hf_netsync_cmd_done_level, tvb,
+ offset, -1, ENC_LITTLE_ENDIAN|ENC_VARINT_PROTOBUF, &bytes);
offset += bytes;
proto_tree_add_item(tree, hf_netsync_cmd_done_type, tvb,
offset, 1, ENC_BIG_ENDIAN );
offset += 1;
- offset += dissect_uleb128( tvb, offset, &len );
-
+ offset += tvb_get_varint( tvb, offset, FT_VARINT_MAX_LEN, &len );
proto_tree_add_item(tree, hf_netsync_cmd_data_payload, tvb,
offset, (gint)len, ENC_NA );
offset += (gint)len;
offset, 1, ENC_BIG_ENDIAN );
offset += 1;
- offset += dissect_uleb128( tvb, offset, &len );
-
+ offset += tvb_get_varint( tvb, offset, FT_VARINT_MAX_LEN, &len );
proto_tree_add_item(tree, hf_netsync_cmd_delta_payload, tvb,
offset, (gint)len, ENC_NA );
offset += (gint)len;
/* skip version and command */
offset += 2;
- size_bytes = dissect_uleb128( tvb, offset, &size );
+ size_bytes = tvb_get_varint( tvb, offset, FT_VARINT_MAX_LEN, &size );
/* the calculated size if for the data only, this doesn't
* include the version (1 byte), command (1 byte),
#include "dwarf.h"
-gint
-dissect_uleb128(tvbuff_t *tvb, gint offset, guint64 *value)
-{
- guint start_offset = offset;
- guint shift = 0;
- guint8 byte;
-
- *value = 0;
-
- do {
- byte = tvb_get_guint8(tvb, offset);
- offset += 1;
-
- *value |= ((guint64)(byte & 0x7F) << shift);
- shift += 7;
- } while ((byte & 0x80) && (shift < 64));
-
- return offset - start_offset;
-}
-
gint
dissect_leb128(tvbuff_t *tvb, gint offset, gint64 *value)
{
#include <glib.h>
-gint dissect_uleb128(tvbuff_t *tvb, gint offset, guint64 *value);
gint dissect_leb128(tvbuff_t *tvb, gint offset, gint64 *value);
#endif /* __DWARF_H__ */
/* this can't collide with ENC_SEP_* because they can be used simultaneously */
#define ENC_NUM_PREF 0x00200000
+/* Use varint format as described in Protobuf protocol
+ * https://developers.google.cn/protocol-buffers/docs/encoding
+ */
#define ENC_VARINT_PROTOBUF 0x00000002
/* For cases where a string encoding contains hex, bit-or one or more