diff --git a/epan/dfilter/dfilter-macro.c b/epan/dfilter/dfilter-macro.c index a971633dbb..74c90e0f04 100644 --- a/epan/dfilter/dfilter-macro.c +++ b/epan/dfilter/dfilter-macro.c @@ -55,7 +55,7 @@ void dump_dfilter_macro_t(const dfilter_macro_t *m, const char *function, const static gboolean free_value(gpointer k _U_, gpointer v, gpointer u _U_) { fvt_cache_entry_t* e = (fvt_cache_entry_t*)v; - g_free(e->repr); + wmem_free(NULL, e->repr); g_free(e); return TRUE; } @@ -78,7 +78,7 @@ static gboolean fvt_cache_cb(proto_node * node, gpointer data _U_) { } e = g_new(fvt_cache_entry_t,1); e->name = finfo->hfinfo->abbrev, - e->repr = fvalue_to_string_repr(&(finfo->value), FTREPR_DFILTER, finfo->hfinfo->display, NULL); + e->repr = fvalue_to_string_repr(NULL, &(finfo->value), FTREPR_DFILTER, finfo->hfinfo->display); e->usable = TRUE; g_hash_table_insert(fvt_cache,(void*)finfo->hfinfo->abbrev,e); } diff --git a/epan/dfilter/dfvm.c b/epan/dfilter/dfvm.c index dd7d7bac38..c942f89bcd 100644 --- a/epan/dfilter/dfvm.c +++ b/epan/dfilter/dfvm.c @@ -109,13 +109,13 @@ dfvm_dump(FILE *f, dfilter_t *df) switch (insn->op) { case PUT_FVALUE: - value_str = fvalue_to_string_repr(arg1->value.fvalue, - FTREPR_DFILTER, BASE_NONE, NULL); + value_str = fvalue_to_string_repr(NULL, arg1->value.fvalue, + FTREPR_DFILTER, BASE_NONE); fprintf(f, "%05d PUT_FVALUE\t%s <%s> -> reg#%u\n", id, value_str, fvalue_type_name(arg1->value.fvalue), arg2->value.numeric); - g_free(value_str); + wmem_free(NULL, value_str); break; case CHECK_EXISTS: case READ_TREE: diff --git a/epan/ftypes/ftypes.c b/epan/ftypes/ftypes.c index 5425dbcdbe..6f57620ad1 100644 --- a/epan/ftypes/ftypes.c +++ b/epan/ftypes/ftypes.c @@ -376,21 +376,22 @@ fvalue_string_repr_len(fvalue_t *fv, ftrepr_t rtype, int field_display) } char * -fvalue_to_string_repr(fvalue_t *fv, ftrepr_t rtype, int field_display, char *buf) +fvalue_to_string_repr(wmem_allocator_t *scope, fvalue_t *fv, ftrepr_t rtype, int field_display) { + char *buf; + int len; if (fv->ftype->val_to_string_repr == NULL) { /* no value-to-string-representation function, so the value cannot be represented */ return NULL; } - if (!buf) { - int len; - if ((len = fvalue_string_repr_len(fv, rtype, field_display)) >= 0) { - buf = (char *)g_malloc0(len + 1); - } else { - /* the value cannot be represented in the given representation type (rtype) */ - return NULL; - } + + if ((len = fvalue_string_repr_len(fv, rtype, field_display)) >= 0) { + buf = (char *)wmem_alloc0(scope, len + 1); + } else { + /* the value cannot be represented in the given representation type (rtype) */ + return NULL; } + fv->ftype->val_to_string_repr(fv, rtype, field_display, buf); return buf; } diff --git a/epan/ftypes/ftypes.h b/epan/ftypes/ftypes.h index 0a29022f6f..9eb86ac0f2 100644 --- a/epan/ftypes/ftypes.h +++ b/epan/ftypes/ftypes.h @@ -25,6 +25,7 @@ #define __FTYPES_H__ #include +#include "../wmem/wmem.h" #include "ws_symbol_export.h" #ifdef __cplusplus @@ -256,20 +257,15 @@ int fvalue_string_repr_len(fvalue_t *fv, ftrepr_t rtype, int field_display); /* Creates the string representation of the field value. - * If given non-NULL 'buf', the string is written at the memory - * location pointed to by 'buf'. If 'buf' is NULL, new memory - * is malloc'ed and the string representation is written there. - * The pointer to the beginning of the string representation is - * returned. If 'buf' was NULL, this points to the newly-allocated - * memory. if 'buf' was non-NULL, then the return value will be - * 'buf'. + * Memory for the buffer is allocated based on wmem allocator + * provided. * * field_display parameter should be a BASE_ value (enum field_display_e) * BASE_NONE should be used if field information isn't available. * * Returns NULL if the string cannot be represented in the given rtype.*/ WS_DLL_PUBLIC char * -fvalue_to_string_repr(fvalue_t *fv, ftrepr_t rtype, int field_display, char *buf); +fvalue_to_string_repr(wmem_allocator_t *scope, fvalue_t *fv, ftrepr_t rtype, int field_display); WS_DLL_PUBLIC ftenum_t fvalue_type_ftenum(fvalue_t *fv); diff --git a/epan/print.c b/epan/print.c index 566af2ee2b..6f8a7592e0 100644 --- a/epan/print.c +++ b/epan/print.c @@ -404,13 +404,13 @@ proto_tree_write_node_pdml(proto_node *node, gpointer data) fputs("\" show=\"\" value=\"", pdata->fh); break; default: - dfilter_string = fvalue_to_string_repr(&fi->value, FTREPR_DISPLAY, fi->hfinfo->display, NULL); + dfilter_string = fvalue_to_string_repr(NULL, &fi->value, FTREPR_DISPLAY, fi->hfinfo->display); if (dfilter_string != NULL) { fputs("\" show=\"", pdata->fh); print_escaped_xml(pdata->fh, dfilter_string); } - g_free(dfilter_string); + wmem_free(NULL, dfilter_string); /* * XXX - should we omit "value" for any fields? @@ -1439,9 +1439,11 @@ gchar* get_node_field_value(field_info* fi, epan_dissect_t* edt) * FT_NONE can be checked when using -T fields */ return g_strdup("1"); default: - dfilter_string = fvalue_to_string_repr(&fi->value, FTREPR_DISPLAY, fi->hfinfo->display, NULL); + dfilter_string = fvalue_to_string_repr(NULL, &fi->value, FTREPR_DISPLAY, fi->hfinfo->display); if (dfilter_string != NULL) { - return dfilter_string; + gchar* ret = g_strdup(dfilter_string); + wmem_free(NULL, dfilter_string); + return ret; } else { return get_field_hex_value(edt->pi.data_src, fi); } diff --git a/epan/proto.c b/epan/proto.c index 09bd4857e6..203a4d303b 100644 --- a/epan/proto.c +++ b/epan/proto.c @@ -5232,21 +5232,21 @@ proto_custom_set(proto_tree* tree, GSList *field_ids, gint occurrence, break; case FT_IEEE_11073_SFLOAT: - str = fvalue_to_string_repr(&finfo->value, FTREPR_DISPLAY, hfinfo->display, NULL); + str = fvalue_to_string_repr(NULL, &finfo->value, FTREPR_DISPLAY, hfinfo->display); g_snprintf(result+offset_r, size-offset_r, "%s: %s", hfinfo->name, str); - g_free(str); + wmem_free(NULL, str); offset_r = (int)strlen(result); break; case FT_IEEE_11073_FLOAT: - str = fvalue_to_string_repr(&finfo->value, FTREPR_DISPLAY, hfinfo->display, NULL); + str = fvalue_to_string_repr(NULL, &finfo->value, FTREPR_DISPLAY, hfinfo->display); g_snprintf(result+offset_r, size-offset_r, "%s: %s", hfinfo->name, str); offset_r = (int)strlen(result); - g_free(str); + wmem_free(NULL, str); break; case FT_IPXNET: /*XXX really No column custom ?*/ @@ -7322,18 +7322,18 @@ proto_item_fill_label(field_info *fi, gchar *label_str) break; case FT_IEEE_11073_SFLOAT: - tmp = fvalue_to_string_repr(&fi->value, FTREPR_DISPLAY, hfinfo->display, NULL); + tmp = fvalue_to_string_repr(NULL, &fi->value, FTREPR_DISPLAY, hfinfo->display); g_snprintf(label_str, ITEM_LABEL_LENGTH, "%s: %s", hfinfo->name, tmp); - g_free(tmp); + wmem_free(NULL, tmp); break; case FT_IEEE_11073_FLOAT: - tmp = fvalue_to_string_repr(&fi->value, FTREPR_DISPLAY, hfinfo->display, NULL); + tmp = fvalue_to_string_repr(NULL, &fi->value, FTREPR_DISPLAY, hfinfo->display); g_snprintf(label_str, ITEM_LABEL_LENGTH, "%s: %s", hfinfo->name, tmp); - g_free(tmp); + wmem_free(NULL, tmp); break; default: @@ -8832,16 +8832,16 @@ construct_match_selected_string(field_info *finfo, epan_dissect_t *edt, * 1 byte for trailing NUL. */ if (filter != NULL) { - char* str; + char* str; dfilter_len = fvalue_string_repr_len(&finfo->value, FTREPR_DFILTER, finfo->hfinfo->display); dfilter_len += abbrev_len + 4 + 1; *filter = (char *)wmem_alloc0(NULL, dfilter_len); /* Create the string */ - str = fvalue_to_string_repr(&finfo->value, FTREPR_DFILTER, finfo->hfinfo->display, NULL); + str = fvalue_to_string_repr(NULL, &finfo->value, FTREPR_DFILTER, finfo->hfinfo->display); g_snprintf(*filter, dfilter_len, "%s == %s", hfinfo->abbrev, str); - g_free(str); + wmem_free(NULL, str); } break; } diff --git a/epan/wslua/wslua_field.c b/epan/wslua/wslua_field.c index 0dc79760a3..48a5a6c6a3 100644 --- a/epan/wslua/wslua_field.c +++ b/epan/wslua/wslua_field.c @@ -161,12 +161,16 @@ WSLUA_METAMETHOD FieldInfo__call(lua_State* L) { } case FT_STRING: case FT_STRINGZ: { - gchar* repr = fvalue_to_string_repr(&fi->ws_fi->value,FTREPR_DISPLAY,BASE_NONE,NULL); + gchar* repr = fvalue_to_string_repr(NULL, &fi->ws_fi->value,FTREPR_DISPLAY,BASE_NONE); if (repr) - lua_pushstring(L,repr); + { + lua_pushstring(L, repr); + wmem_free(NULL, repr); + } else + { luaL_error(L,"field cannot be represented as string because it may contain invalid characters"); - + } return 1; } case FT_NONE: @@ -215,16 +219,16 @@ WSLUA_METAMETHOD FieldInfo__tostring(lua_State* L) { gchar* repr = NULL; if (fi->ws_fi->hfinfo->type == FT_PROTOCOL || fi->ws_fi->hfinfo->type == FT_PCRE) { - repr = fvalue_to_string_repr(&fi->ws_fi->value,FTREPR_DFILTER,BASE_NONE,NULL); + repr = fvalue_to_string_repr(NULL, &fi->ws_fi->value,FTREPR_DFILTER,BASE_NONE); } else { - repr = fvalue_to_string_repr(&fi->ws_fi->value,FTREPR_DISPLAY,fi->ws_fi->hfinfo->display,NULL); + repr = fvalue_to_string_repr(NULL, &fi->ws_fi->value,FTREPR_DISPLAY,fi->ws_fi->hfinfo->display); } if (repr) { lua_pushstring(L,repr); - /* fvalue_to_string_repr() g_malloc's the string's buffer */ - g_free(repr); + /* fvalue_to_string_repr() wmem_alloc's the string's buffer */ + wmem_free(NULL, repr); } else { lua_pushstring(L,"(unknown)"); diff --git a/plugins/mate/mate_util.c b/plugins/mate/mate_util.c index 169eaae727..828e1ac118 100644 --- a/plugins/mate/mate_util.c +++ b/plugins/mate/mate_util.c @@ -313,11 +313,11 @@ extern AVP* new_avp_from_finfo(const gchar* name, field_info* finfo) { new_avp_val->n = scs_subscribe(avp_strings, name); - repr = fvalue_to_string_repr(&finfo->value,FTREPR_DISPLAY,finfo->hfinfo->display,NULL); + repr = fvalue_to_string_repr(NULL, &finfo->value,FTREPR_DISPLAY,finfo->hfinfo->display); if (repr) { value = scs_subscribe(avp_strings, repr); - g_free(repr); + wmem_free(NULL, repr); #ifdef _AVP_DEBUGGING dbg_print (dbg_avp,2,dbg_fp,"new_avp_from_finfo: from string: %s",value); #endif diff --git a/rawshark.c b/rawshark.c index 41ca4ba716..cd59d9fdf9 100644 --- a/rawshark.c +++ b/rawshark.c @@ -1189,9 +1189,8 @@ static gboolean print_field_value(field_info *finfo, int cmd_line_index) * e.g: ip.hdr_len */ fs_len = fvalue_string_repr_len(&finfo->value, FTREPR_DFILTER, finfo->hfinfo->display); - fs_buf = fvalue_to_string_repr(&finfo->value, - FTREPR_DFILTER, finfo->hfinfo->display, - NULL); + fs_buf = fvalue_to_string_repr(NULL, &finfo->value, + FTREPR_DFILTER, finfo->hfinfo->display); fs_ptr = fs_buf; /* String types are quoted. Remove them. */ @@ -1280,14 +1279,14 @@ static gboolean print_field_value(field_info *finfo, int cmd_line_index) } } printf(" %d=\"%s\"", cmd_line_index, label_s->str); - g_free(fs_buf); + wmem_free(NULL, fs_buf); return TRUE; } if(finfo->value.ftype->val_to_string_repr) { printf(" %d=\"%s\"", cmd_line_index, fs_ptr); - g_free(fs_buf); + wmem_free(NULL, fs_buf); return TRUE; } diff --git a/ui/cli/tap-diameter-avp.c b/ui/cli/tap-diameter-avp.c index bb3602fc6e..02106cd9f4 100644 --- a/ui/cli/tap-diameter-avp.c +++ b/ui/cli/tap-diameter-avp.c @@ -106,11 +106,11 @@ diam_tree_to_csv(proto_node *node, gpointer data) ftype = fvalue_type_ftenum(&fi->value); if (ftype != FT_NONE && ftype != FT_PROTOCOL) { /* convert value to string */ - val_tmp = fvalue_to_string_repr(&fi->value, FTREPR_DISPLAY, hfi->display, NULL); + val_tmp = fvalue_to_string_repr(NULL, &fi->value, FTREPR_DISPLAY, hfi->display); if (val_tmp) { val_str = g_strdup(val_tmp); - g_free(val_tmp); + wmem_free(NULL, val_tmp); } else val_str = g_strdup_printf("unsupported type: %s", ftype_name(ftype)); diff --git a/ui/gtk/packet_panes.c b/ui/gtk/packet_panes.c index 128c71555a..6ee8fea51a 100644 --- a/ui/gtk/packet_panes.c +++ b/ui/gtk/packet_panes.c @@ -1334,10 +1334,10 @@ tree_view_follow_link(field_info *fi) cf_goto_frame(&cfile, fi->value.value.uinteger); } if(FI_GET_FLAG(fi, FI_URL) && IS_FT_STRING(fi->hfinfo->type)) { - url = fvalue_to_string_repr(&fi->value, FTREPR_DISPLAY, fi->hfinfo->display, NULL); + url = fvalue_to_string_repr(NULL, &fi->value, FTREPR_DISPLAY, fi->hfinfo->display); if(url){ browser_open_url(url); - g_free(url); + wmem_free(NULL, url); } } } diff --git a/ui/qt/proto_tree.cpp b/ui/qt/proto_tree.cpp index f2bca27db0..f8aa48bbab 100644 --- a/ui/qt/proto_tree.cpp +++ b/ui/qt/proto_tree.cpp @@ -582,11 +582,11 @@ void ProtoTree::itemDoubleClick(QTreeWidgetItem *item, int) { if(FI_GET_FLAG(fi, FI_URL) && IS_FT_STRING(fi->hfinfo->type)) { gchar *url; - url = fvalue_to_string_repr(&fi->value, FTREPR_DISPLAY, fi->hfinfo->display, NULL); + url = fvalue_to_string_repr(NULL, &fi->value, FTREPR_DISPLAY, fi->hfinfo->display); if(url){ // browser_open_url(url); QDesktopServices::openUrl(QUrl(url)); - g_free(url); + wmem_free(NULL, url); } } }