diff options
author | Guy Harris <guy@alum.mit.edu> | 2016-03-30 17:44:20 -0700 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2016-03-31 00:44:52 +0000 |
commit | 8ba351b04b109c09956c7a69b5d91d3c87ffb180 (patch) | |
tree | 3b916da67d8e876735fb048155e782b52fc91226 | |
parent | c873c0bef3edf32c45f4c2b2178900248c3af1d6 (diff) |
Clean up some stuff.
Have bin2hex() wmem_allocate the buffer, so it can be used the same way
that tvb_get_string_enc() is used.
Don't bother checking whether NIBBLE_2_ASCHEX() returns an ASCII hex
digit character or not - it returns either a value in the ASCII range of
'0' through '9' or in the range 'A' through 'F', all of which are ASCII
hex digits.
Fix get_bit() to set *length to 0 if the string we're returning is
empty.
Change-Id: Id331cfd0ab34d45892f98d228dc793a1e93d84e5
Reviewed-on: https://code.wireshark.org/review/14717
Reviewed-by: Guy Harris <guy@alum.mit.edu>
-rw-r--r-- | epan/dissectors/packet-iso8583.c | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/epan/dissectors/packet-iso8583.c b/epan/dissectors/packet-iso8583.c index 8ff68eed29..c1d69eecae 100644 --- a/epan/dissectors/packet-iso8583.c +++ b/epan/dissectors/packet-iso8583.c @@ -476,10 +476,10 @@ static gboolean isstrtype_ok( int type, const char* string, unsigned int size) case ISO_TB: return ishex_str(string, size); case ISO_TZ: - if(charset_pref == ASCII_CHARSET) - return isalnumspec_str(string, size); - else - return ishex_str(string, size); + if(charset_pref == ASCII_CHARSET) + return isalnumspec_str(string, size); + else + return ishex_str(string, size); } return 0; } @@ -543,22 +543,27 @@ static guint get_iso8583_msg_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offs #define NIBBLE_2_ASCHEX(nibble)\ ( ((nibble)>9) ? (((nibble)-10))+'A' : ((nibble)+'0') ) -static gchar* bin2hex(gchar* buff, const guint8 *bin, enum bin2hex_enum type, guint32 len) - /* buff must have size at least len + 1 */ +/* + * Convert a sequence of nibbles to a string of ASCII characters + * corresponding to the hex digits in those nibbles. + */ +static gchar* bin2hex(const guint8 *bin, enum bin2hex_enum type, guint32 len) { + gchar* ret; guint8 ch; const guint8* str = bin; guint32 size = len; - gchar* ret = buff; + gchar* buff; + /* "size" characters, plus terminating NUL */ + ret = wmem_alloc(wmem_packet_scope(), size + 1); + buff = ret; if(type == TYPE_BCD) { if(size % 2) /* odd */ { ch = *str & 0x0f; *buff = NIBBLE_2_ASCHEX(ch); - if(!g_ascii_isxdigit(*buff++)) - return NULL; str++; size--; } @@ -569,12 +574,8 @@ static gchar* bin2hex(gchar* buff, const guint8 *bin, enum bin2hex_enum type, g { ch = (*str >> 4) & 0x0f; *buff = NIBBLE_2_ASCHEX(ch); - if(!g_ascii_isxdigit(*buff++)) - return NULL; ch = *str & 0x0f; *buff = NIBBLE_2_ASCHEX(ch); - if(!g_ascii_isxdigit(*buff++)) - return NULL; str++; } *buff = '\0'; @@ -606,7 +607,6 @@ static guint64 hex2bin(const char* hexstr, int len) static gchar *get_bit(guint ind, tvbuff_t *tvb, gint *off_set, proto_tree *tree, proto_item **exp, gint *length ) { - static gchar val[1024]; gchar aux[1024]; gchar* ret=NULL; gint len; @@ -616,8 +616,6 @@ static gchar *get_bit(guint ind, tvbuff_t *tvb, gint *off_set, proto_tree *tree, /* Check if it is a fixed or variable length * data field */ - val[0] = '\0'; - if(data_array[ind].varlen == 0) len = data_array[ind].maxsize; /* fixed len */ else @@ -689,7 +687,7 @@ static gchar *get_bit(guint ind, tvbuff_t *tvb, gint *off_set, proto_tree *tree, gint tlen = (len%2)? len/2 + 1 : len/2; checksize(tlen); tvb_memcpy(tvb, aux, offset, tlen); - if((ret = bin2hex(val, (guint8 *)aux, TYPE_BCD, len)) == NULL) + if((ret = bin2hex((guint8 *)aux, TYPE_BCD, len)) == NULL) return NULL; *length = (gint)strlen(ret); len = tlen; @@ -712,7 +710,7 @@ static gchar *get_bit(guint ind, tvbuff_t *tvb, gint *off_set, proto_tree *tree, { checksize(len); tvb_memcpy(tvb, aux, offset, len); - if((ret = bin2hex(val, (guint8 *)aux, TYPE_BIN, len)) == NULL) + if((ret = bin2hex((guint8 *)aux, TYPE_BIN, len)) == NULL) return NULL; *length = (gint)strlen(ret); str_input = TRUE; @@ -736,7 +734,10 @@ static gchar *get_bit(guint ind, tvbuff_t *tvb, gint *off_set, proto_tree *tree, *off_set = offset + len; } else - ret = val; + { + *length = 0; + ret = ""; + } return ret; } @@ -841,7 +842,7 @@ static int dissect_iso8583_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr guint offset = 0; int len = 0; gchar *msg_type, *msg_bitmap; - gchar msg_types[24], aux[24], msg_bitmaps[24]; + gchar aux[24]; guint64 bitmap[3]= {0,0,0}; int nofbitmaps=0; guint ret; @@ -863,7 +864,7 @@ static int dissect_iso8583_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr { len = 2; tvb_memcpy(tvb, aux, 2, len); - if((msg_type = bin2hex(msg_types, (guint8 *)aux, TYPE_BCD, len*2)) == NULL) + if((msg_type = bin2hex((guint8 *)aux, TYPE_BCD, len*2)) == NULL) return 0; } @@ -879,7 +880,7 @@ static int dissect_iso8583_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr else { tvb_memcpy(tvb, aux, 6, BM_LEN); - if((msg_bitmap = bin2hex(msg_bitmaps, (guint8 *)aux, TYPE_BCD, BM_LEN)) == NULL) + if((msg_bitmap = bin2hex((guint8 *)aux, TYPE_BCD, BM_LEN)) == NULL) return 0; } |