forked from osmocom/wireshark
Have format_text_chr use wmem allocated memory.
Change-Id: Idcea59f6fc84238f04d9ffc11a0088ef97beec0c Reviewed-on: https://code.wireshark.org/review/19844 Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
This commit is contained in:
parent
b3035df887
commit
c44c8f9e6c
|
@ -270,7 +270,7 @@ void dissect_mqpcf_parm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *mq_tree,
|
|||
if (*sStr)
|
||||
strip_trailing_blanks(sStr, uSLn);
|
||||
if (*sStr)
|
||||
format_text_chr(sStr, strlen((const char *)sStr), '.');
|
||||
sStr = (guint8*)format_text_chr(wmem_packet_scope(), sStr, strlen((const char *)sStr), '.');
|
||||
|
||||
tree = proto_tree_add_subtree_format(mq_tree, tvb, offset, uLen, ett_mqpcf_prm, NULL, "%s %s", strPrm, sStr);
|
||||
|
||||
|
@ -343,7 +343,7 @@ void dissect_mqpcf_parm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *mq_tree,
|
|||
if (*sStr)
|
||||
strip_trailing_blanks(sStr, uSLn);
|
||||
if (*sStr)
|
||||
format_text_chr(sStr, strlen((const char *)sStr), '.');
|
||||
sStr = (guint8*)format_text_chr(wmem_packet_scope(), sStr, strlen((const char *)sStr), '.');
|
||||
|
||||
proto_tree_add_string_format(tree, hf_mq_pcf_stringlist, tvb, offset, uSLn, (const char *)sStr,
|
||||
"%s[%*d]: %s", hfinfo->name, uDigit, u2+1, sStr);
|
||||
|
@ -372,8 +372,8 @@ void dissect_mqpcf_parm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *mq_tree,
|
|||
uSLn = tvb_get_guint32(tvb, offset + uLenF, bLittleEndian);
|
||||
if (uSLn)
|
||||
{
|
||||
guint8 *sStrA = (guint8 *)format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 4, uSLn, ENC_ASCII) , uSLn, '.');
|
||||
guint8 *sStrE = (guint8 *)format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 4, uSLn, ENC_EBCDIC), uSLn, '.');
|
||||
guint8 *sStrA = (guint8 *)format_text_chr(wmem_packet_scope(), tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 4, uSLn, ENC_ASCII) , uSLn, '.');
|
||||
guint8 *sStrE = (guint8 *)format_text_chr(wmem_packet_scope(), tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 4, uSLn, ENC_EBCDIC), uSLn, '.');
|
||||
if (uSLn > 35)
|
||||
{
|
||||
tree = proto_tree_add_subtree_format(mq_tree, tvb, offset, uLen, ett_mqpcf_prm, NULL,
|
||||
|
@ -428,7 +428,7 @@ void dissect_mqpcf_parm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *mq_tree,
|
|||
uOpe = tvb_get_guint32(tvb, offset + uLenF, bLittleEndian);
|
||||
uCCS = tvb_get_guint32(tvb, offset + uLenF + 4, bLittleEndian);
|
||||
uSLn = tvb_get_guint32(tvb, offset + uLenF + 8, bLittleEndian);
|
||||
sStr = (guint8 *)format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 12, uSLn, (uCCS != 500) ? ENC_ASCII : ENC_EBCDIC), uSLn, '.');
|
||||
sStr = (guint8 *)format_text_chr(wmem_packet_scope(), tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 12, uSLn, (uCCS != 500) ? ENC_ASCII : ENC_EBCDIC), uSLn, '.');
|
||||
strip_trailing_blanks(sStr, uSLn);
|
||||
|
||||
tree = proto_tree_add_subtree_format(mq_tree, tvb, offset, uLen, ett_mqpcf_prm, NULL, "%s %s %s",
|
||||
|
@ -451,8 +451,8 @@ void dissect_mqpcf_parm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *mq_tree,
|
|||
uSLn = tvb_get_guint32(tvb, offset + uLenF + 4, bLittleEndian);
|
||||
if (uSLn)
|
||||
{
|
||||
guint8 *sStrA = (guint8 *)format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 8, uSLn, ENC_ASCII), uSLn, '.');
|
||||
guint8 *sStrE = (guint8 *)format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 8, uSLn, ENC_EBCDIC), uSLn, '.');
|
||||
guint8 *sStrA = (guint8 *)format_text_chr(wmem_packet_scope(), tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 8, uSLn, ENC_ASCII), uSLn, '.');
|
||||
guint8 *sStrE = (guint8 *)format_text_chr(wmem_packet_scope(), tvb_get_string_enc(wmem_packet_scope(), tvb, offset + uLenF + 8, uSLn, ENC_EBCDIC), uSLn, '.');
|
||||
tree = proto_tree_add_subtree_format(mq_tree, tvb, offset, uLen, ett_mqpcf_prm, NULL, "%s %s A(%s) E(%s)",
|
||||
strPrm, val_to_str(uOpe, GET_VALSV(FilterOP), " Unknown (0x%02x)")+7, sStrA, sStrE);
|
||||
}
|
||||
|
|
|
@ -2844,12 +2844,12 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
}
|
||||
iApp = tvb_get_guint32(tvb, offset + 48 + 28, iCod);
|
||||
|
||||
sApplicationName = format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 48, 28, iEnc), 28, '.');
|
||||
sApplicationName = format_text_chr(wmem_packet_scope(), tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 48, 28, iEnc), 28, '.');
|
||||
if (strip_trailing_blanks((guint8 *)sApplicationName, 28) > 0)
|
||||
{
|
||||
col_append_fstr(pinfo->cinfo, COL_INFO, " App=%s", sApplicationName);
|
||||
}
|
||||
sQMgr = format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset, 48, iEnc), 48, '.');
|
||||
sQMgr = format_text_chr(wmem_packet_scope(), tvb_get_string_enc(wmem_packet_scope(), tvb, offset, 48, iEnc), 48, '.');
|
||||
if (strip_trailing_blanks((guint8 *)sQMgr, 48) > 0)
|
||||
{
|
||||
col_append_fstr(pinfo->cinfo, COL_INFO, " QM=%s", sQMgr);
|
||||
|
@ -3740,7 +3740,7 @@ static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
if (*sStr)
|
||||
strip_trailing_blanks(sStr, iLenStr);
|
||||
if (*sStr)
|
||||
format_text_chr(sStr, strlen((const char *)sStr), '.');
|
||||
sStr = (guint8*)format_text_chr(wmem_packet_scope(), sStr, strlen((const char *)sStr), '.');
|
||||
|
||||
rfh_tree = proto_tree_add_subtree_format(mq_tree, tvb, iPos, iLenStr+4, ett_mq_rfh_ValueName, NULL, "NameValue: %s", sStr);
|
||||
|
||||
|
|
|
@ -1839,7 +1839,7 @@ static inline const gchar *format_param_str(tvbuff_t *tvb, int offset, int len)
|
|||
if (len < 2) {
|
||||
return param_str;
|
||||
}
|
||||
return format_text_chr(param_str, len - 1, ' '); /* Leave terminating NULLs alone. */
|
||||
return format_text_chr(wmem_packet_scope(), param_str, len - 1, ' '); /* Leave terminating NULLs alone. */
|
||||
}
|
||||
|
||||
/* Code to actually dissect the packets */
|
||||
|
|
|
@ -359,24 +359,14 @@ format_text_wsp(const guchar *string, size_t len)
|
|||
* which will be replaced by a space, and return a pointer to it.
|
||||
*/
|
||||
gchar *
|
||||
format_text_chr(const guchar *string, const size_t len, const guchar chr)
|
||||
format_text_chr(wmem_allocator_t* allocator, const guchar *string, const size_t len, const guchar chr)
|
||||
{
|
||||
static gchar *fmtbuf[3];
|
||||
static int fmtbuf_len[3];
|
||||
static int idx;
|
||||
gchar *fmtbuf = (gchar*)wmem_alloc(allocator, INITIAL_FMTBUF_SIZE);
|
||||
int fmtbuf_len = INITIAL_FMTBUF_SIZE;
|
||||
int column;
|
||||
const guchar *stringend = string + len;
|
||||
guchar c;
|
||||
|
||||
idx = (idx + 1) % 3;
|
||||
|
||||
/*
|
||||
* Allocate the buffer if it's not already allocated.
|
||||
*/
|
||||
if (fmtbuf[idx] == NULL) {
|
||||
fmtbuf[idx] = (gchar *)g_malloc(INITIAL_FMTBUF_SIZE);
|
||||
fmtbuf_len[idx] = INITIAL_FMTBUF_SIZE;
|
||||
}
|
||||
column = 0;
|
||||
while (string < stringend)
|
||||
{
|
||||
|
@ -384,7 +374,7 @@ format_text_chr(const guchar *string, const size_t len, const guchar chr)
|
|||
* Is there enough room for this character,
|
||||
* and also enough room for a terminating '\0'?
|
||||
*/
|
||||
if (column+1 >= fmtbuf_len[idx])
|
||||
if (column+1 >= fmtbuf_len)
|
||||
{
|
||||
/*
|
||||
* Double the buffer's size if it's not big enough.
|
||||
|
@ -392,29 +382,29 @@ format_text_chr(const guchar *string, const size_t len, const guchar chr)
|
|||
* adds at least another 128 bytes, which is more than enough
|
||||
* for one more character plus a terminating '\0'.
|
||||
*/
|
||||
fmtbuf_len[idx] = fmtbuf_len[idx] * 2;
|
||||
fmtbuf[idx] = (gchar *)g_realloc(fmtbuf[idx], fmtbuf_len[idx]);
|
||||
fmtbuf_len *= 2;
|
||||
fmtbuf = (gchar *)wmem_realloc(allocator, fmtbuf, fmtbuf_len);
|
||||
}
|
||||
c = *string++;
|
||||
|
||||
if (g_ascii_isprint(c))
|
||||
{
|
||||
fmtbuf[idx][column] = c;
|
||||
fmtbuf[column] = c;
|
||||
column++;
|
||||
}
|
||||
else if (g_ascii_isspace(c))
|
||||
{
|
||||
fmtbuf[idx][column] = ' ';
|
||||
fmtbuf[column] = ' ';
|
||||
column++;
|
||||
}
|
||||
else
|
||||
{
|
||||
fmtbuf[idx][column] = chr;
|
||||
fmtbuf[column] = chr;
|
||||
column++;
|
||||
}
|
||||
}
|
||||
fmtbuf[idx][column] = '\0';
|
||||
return fmtbuf[idx];
|
||||
fmtbuf[column] = '\0';
|
||||
return fmtbuf;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
|
|
@ -25,6 +25,8 @@
|
|||
|
||||
#include "ws_symbol_export.h"
|
||||
|
||||
#include <epan/wmem/wmem.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
@ -88,6 +90,7 @@ gchar* format_text_wsp(const guchar *line, size_t len);
|
|||
* (space, tab, carriage return, new line, vertical tab, or formfeed)
|
||||
* which will be replaced by a space, and return a pointer to it.
|
||||
*
|
||||
* @param allocator The wmem scope
|
||||
* @param string A pointer to the input string
|
||||
* @param len The length of the input string
|
||||
* @param chr The character to use to replace non-printable characters
|
||||
|
@ -95,7 +98,7 @@ gchar* format_text_wsp(const guchar *line, size_t len);
|
|||
*
|
||||
*/
|
||||
WS_DLL_PUBLIC
|
||||
gchar* format_text_chr(const guchar *string, const size_t len, const guchar chr);
|
||||
gchar* format_text_chr(wmem_allocator_t* allocator, const guchar *string, const size_t len, const guchar chr);
|
||||
|
||||
|
||||
/** Turn a string of hex digits with optional separators (defined by
|
||||
|
|
Loading…
Reference in New Issue