forked from osmocom/wireshark
Fix the output of columns with "show resolved" disabled when all occurrences are displayed.
Limit the input field for occurrence to 4 characters to prevent an overflow. Make sure "... as filter" does not result in an invalid filter string if all occurrences are displayed. svn path=/trunk/; revision=34247
This commit is contained in:
parent
d0244ffa9a
commit
7ec231f7f1
131
epan/proto.c
131
epan/proto.c
|
@ -3430,7 +3430,7 @@ proto_custom_set(proto_tree* tree, const int field_id, gint occurrence,
|
|||
guint32 n_addr; /* network-order IPv4 address */
|
||||
|
||||
const true_false_string *tfstring;
|
||||
int len, last, i, offset=0;
|
||||
int len, last, i, offset_r=0, offset_e=0;
|
||||
GPtrArray *finfos;
|
||||
field_info *finfo = NULL;
|
||||
header_field_info* hfinfo;
|
||||
|
@ -3470,8 +3470,11 @@ proto_custom_set(proto_tree* tree, const int field_id, gint occurrence,
|
|||
while (i <= last) {
|
||||
finfo = g_ptr_array_index(finfos, i);
|
||||
|
||||
if (offset && (offset < size-2))
|
||||
result[offset++]=',';
|
||||
if (offset_r && (offset_r < size-2))
|
||||
result[offset_r++]=',';
|
||||
|
||||
if (offset_e && (offset_e < size-2))
|
||||
expr[offset_e++]=',';
|
||||
|
||||
switch(hfinfo->type) {
|
||||
|
||||
|
@ -3487,17 +3490,17 @@ proto_custom_set(proto_tree* tree, const int field_id, gint occurrence,
|
|||
case FT_UINT_BYTES:
|
||||
case FT_BYTES:
|
||||
bytes = fvalue_get(&finfo->value);
|
||||
offset += (int)g_strlcpy(result+offset, bytes_to_str(bytes, fvalue_length(&finfo->value)), size-offset);
|
||||
offset_r += (int)g_strlcpy(result+offset_r, bytes_to_str(bytes, fvalue_length(&finfo->value)), size-offset_r);
|
||||
break;
|
||||
|
||||
case FT_ABSOLUTE_TIME:
|
||||
offset += (int)g_strlcpy(result+offset,
|
||||
offset_r += (int)g_strlcpy(result+offset_r,
|
||||
abs_time_to_str(fvalue_get(&finfo->value), hfinfo->display, TRUE),
|
||||
size-offset);
|
||||
size-offset_r);
|
||||
break;
|
||||
|
||||
case FT_RELATIVE_TIME:
|
||||
offset += (int)g_strlcpy(result+offset, rel_time_to_secs_str(fvalue_get(&finfo->value)), size-offset);
|
||||
offset_r += (int)g_strlcpy(result+offset_r, rel_time_to_secs_str(fvalue_get(&finfo->value)), size-offset_r);
|
||||
break;
|
||||
|
||||
case FT_BOOLEAN:
|
||||
|
@ -3506,7 +3509,10 @@ proto_custom_set(proto_tree* tree, const int field_id, gint occurrence,
|
|||
if (hfinfo->strings) {
|
||||
tfstring = (const struct true_false_string*) hfinfo->strings;
|
||||
}
|
||||
offset += (int)g_strlcpy(result+offset, u_integer ? tfstring->true_string : tfstring->false_string, size-offset);
|
||||
offset_r += (int)g_strlcpy(result+offset_r, u_integer ? tfstring->true_string : tfstring->false_string, size-offset_r);
|
||||
|
||||
g_snprintf(expr+offset_e, size-offset_e, "%u", fvalue_get_uinteger(&finfo->value) ? 1 : 0);
|
||||
offset_e = (int)strlen(expr);
|
||||
break;
|
||||
|
||||
case FT_UINT8:
|
||||
|
@ -3517,25 +3523,28 @@ proto_custom_set(proto_tree* tree, const int field_id, gint occurrence,
|
|||
u_integer = fvalue_get_uinteger(&finfo->value);
|
||||
if (hfinfo->strings) {
|
||||
if (hfinfo->display & BASE_RANGE_STRING) {
|
||||
offset += (int)g_strlcpy(result+offset, rval_to_str(u_integer, hfinfo->strings, "%u"), size-offset);
|
||||
offset_r += (int)g_strlcpy(result+offset_r, rval_to_str(u_integer, hfinfo->strings, "%u"), size-offset_r);
|
||||
} else if (hfinfo->display & BASE_EXT_STRING) {
|
||||
offset += (int)g_strlcpy(result+offset, val_to_str_ext(u_integer, (value_string_ext *) (hfinfo->strings), "%u"), size-offset);
|
||||
offset_r += (int)g_strlcpy(result+offset_r, val_to_str_ext(u_integer, (value_string_ext *) (hfinfo->strings), "%u"), size-offset_r);
|
||||
} else {
|
||||
offset += (int)g_strlcpy(result+offset, val_to_str(u_integer, cVALS(hfinfo->strings), "%u"), size-offset);
|
||||
offset_r += (int)g_strlcpy(result+offset_r, val_to_str(u_integer, cVALS(hfinfo->strings), "%u"), size-offset_r);
|
||||
}
|
||||
} else if (IS_BASE_DUAL(hfinfo->display)) {
|
||||
g_snprintf(result+offset, size-offset, hfinfo_uint_value_format(hfinfo), u_integer, u_integer);
|
||||
offset = (int)strlen(result);
|
||||
g_snprintf(result+offset_r, size-offset_r, hfinfo_uint_value_format(hfinfo), u_integer, u_integer);
|
||||
offset_r = (int)strlen(result);
|
||||
} else {
|
||||
g_snprintf(result+offset, size-offset, hfinfo_uint_value_format(hfinfo), u_integer);
|
||||
offset = (int)strlen(result);
|
||||
g_snprintf(result+offset_r, size-offset_r, hfinfo_uint_value_format(hfinfo), u_integer);
|
||||
offset_r = (int)strlen(result);
|
||||
}
|
||||
|
||||
g_snprintf(expr+offset_e, size-offset_e, hfinfo_numeric_value_format(hfinfo), fvalue_get_uinteger(&finfo->value));
|
||||
offset_e = (int)strlen(expr);
|
||||
break;
|
||||
|
||||
case FT_INT64:
|
||||
case FT_UINT64:
|
||||
g_snprintf(result+offset, size-offset, "%" G_GINT64_MODIFIER "u", fvalue_get_integer64(&finfo->value));
|
||||
offset = (int)strlen(result);
|
||||
g_snprintf(result+offset_r, size-offset_r, "%" G_GINT64_MODIFIER "u", fvalue_get_integer64(&finfo->value));
|
||||
offset_r = (int)strlen(result);
|
||||
break;
|
||||
|
||||
/* XXX - make these just FT_INT? */
|
||||
|
@ -3546,55 +3555,59 @@ proto_custom_set(proto_tree* tree, const int field_id, gint occurrence,
|
|||
integer = fvalue_get_sinteger(&finfo->value);
|
||||
if (hfinfo->strings) {
|
||||
if (hfinfo->display & BASE_RANGE_STRING) {
|
||||
offset += (int)g_strlcpy(result+offset, rval_to_str(integer, hfinfo->strings, "%d"), size-offset);
|
||||
offset_r += (int)g_strlcpy(result+offset_r, rval_to_str(integer, hfinfo->strings, "%d"), size-offset_r);
|
||||
} else if (hfinfo->display & BASE_EXT_STRING) {
|
||||
offset += (int)g_strlcpy(result+offset, val_to_str_ext(integer, (value_string_ext *) (hfinfo->strings), "%d"), size-offset);
|
||||
offset_r += (int)g_strlcpy(result+offset_r, val_to_str_ext(integer, (value_string_ext *) (hfinfo->strings), "%d"), size-offset_r);
|
||||
} else {
|
||||
offset += (int)g_strlcpy(result+offset, val_to_str(integer, cVALS(hfinfo->strings), "%d"), size-offset);
|
||||
offset_r += (int)g_strlcpy(result+offset_r, val_to_str(integer, cVALS(hfinfo->strings), "%d"), size-offset_r);
|
||||
}
|
||||
} else if (IS_BASE_DUAL(hfinfo->display)) {
|
||||
g_snprintf(result+offset, size-offset, hfinfo_int_value_format(hfinfo), integer, integer);
|
||||
offset = (int)strlen(result);
|
||||
g_snprintf(result+offset_r, size-offset_r, hfinfo_int_value_format(hfinfo), integer, integer);
|
||||
offset_r = (int)strlen(result);
|
||||
} else {
|
||||
g_snprintf(result+offset, size-offset, hfinfo_int_value_format(hfinfo), integer);
|
||||
offset = (int)strlen(result);
|
||||
g_snprintf(result+offset_r, size-offset_r, hfinfo_int_value_format(hfinfo), integer);
|
||||
offset_r = (int)strlen(result);
|
||||
}
|
||||
|
||||
g_snprintf(expr+offset_e, size-offset_e, hfinfo_numeric_value_format(hfinfo), fvalue_get_sinteger(&finfo->value));
|
||||
offset_e = (int)strlen(expr);
|
||||
break;
|
||||
|
||||
case FT_IPv4:
|
||||
ipv4 = fvalue_get(&finfo->value);
|
||||
n_addr = ipv4_get_net_order_addr(ipv4);
|
||||
offset += (int)g_strlcpy(result+offset, ip_to_str((guint8 *)&n_addr), size-offset);
|
||||
offset_r += (int)g_strlcpy(result+offset_r, ip_to_str((guint8 *)&n_addr), size-offset_r);
|
||||
break;
|
||||
|
||||
case FT_IPv6:
|
||||
ipv6 = fvalue_get(&finfo->value);
|
||||
SET_ADDRESS (&addr, AT_IPv6, sizeof(struct e_in6_addr), ipv6);
|
||||
address_to_str_buf(&addr, result+offset, size-offset);
|
||||
offset = (int)strlen(result);
|
||||
address_to_str_buf(&addr, result+offset_r, size-offset_r);
|
||||
offset_r = (int)strlen(result);
|
||||
break;
|
||||
|
||||
case FT_ETHER:
|
||||
offset += (int)g_strlcpy(result+offset, bytes_to_str_punct(fvalue_get(&finfo->value), 6, ':'), size-offset);
|
||||
offset_r += (int)g_strlcpy(result+offset_r, bytes_to_str_punct(fvalue_get(&finfo->value), 6, ':'), size-offset_r);
|
||||
break;
|
||||
|
||||
case FT_GUID:
|
||||
offset += (int)g_strlcpy(result+offset, guid_to_str((e_guid_t *)fvalue_get(&finfo->value)), size-offset);
|
||||
offset_r += (int)g_strlcpy(result+offset_r, guid_to_str((e_guid_t *)fvalue_get(&finfo->value)), size-offset_r);
|
||||
break;
|
||||
|
||||
case FT_OID:
|
||||
bytes = fvalue_get(&finfo->value);
|
||||
offset += (int)g_strlcpy(result+offset, oid_resolved_from_encoded(bytes, fvalue_length(&finfo->value)), size-offset);
|
||||
offset_r += (int)g_strlcpy(result+offset_r, oid_resolved_from_encoded(bytes, fvalue_length(&finfo->value)), size-offset_r);
|
||||
offset_e += (int)g_strlcpy(expr+offset_e, oid_encoded2string(bytes, fvalue_length(&finfo->value)), size-offset_e);
|
||||
break;
|
||||
|
||||
case FT_FLOAT:
|
||||
g_snprintf(result+offset, size-offset, "%." STRINGIFY(FLT_DIG) "f", fvalue_get_floating(&finfo->value));
|
||||
offset = (int)strlen(result);
|
||||
g_snprintf(result+offset_r, size-offset_r, "%." STRINGIFY(FLT_DIG) "f", fvalue_get_floating(&finfo->value));
|
||||
offset_r = (int)strlen(result);
|
||||
break;
|
||||
|
||||
case FT_DOUBLE:
|
||||
g_snprintf(result+offset, size-offset, "%." STRINGIFY(DBL_DIG) "g", fvalue_get_floating(&finfo->value));
|
||||
offset = (int)strlen(result);
|
||||
g_snprintf(result+offset_r, size-offset_r, "%." STRINGIFY(DBL_DIG) "g", fvalue_get_floating(&finfo->value));
|
||||
offset_r = (int)strlen(result);
|
||||
break;
|
||||
|
||||
case FT_EBCDIC:
|
||||
|
@ -3602,7 +3615,7 @@ proto_custom_set(proto_tree* tree, const int field_id, gint occurrence,
|
|||
case FT_STRINGZ:
|
||||
case FT_UINT_STRING:
|
||||
bytes = fvalue_get(&finfo->value);
|
||||
offset += (int)g_strlcpy(result+offset, format_text(bytes, strlen(bytes)), size-offset);
|
||||
offset_r += (int)g_strlcpy(result+offset_r, format_text(bytes, strlen(bytes)), size-offset_r);
|
||||
break;
|
||||
|
||||
case FT_IPXNET: /*XXX really No column custom ?*/
|
||||
|
@ -3617,39 +3630,27 @@ proto_custom_set(proto_tree* tree, const int field_id, gint occurrence,
|
|||
i++;
|
||||
}
|
||||
|
||||
if(occurrence) {
|
||||
switch(hfinfo->type) {
|
||||
switch(hfinfo->type) {
|
||||
|
||||
case FT_BOOLEAN:
|
||||
g_snprintf(expr, size, "%u", fvalue_get_uinteger(&finfo->value) ? 1 : 0);
|
||||
break;
|
||||
case FT_BOOLEAN:
|
||||
case FT_UINT8:
|
||||
case FT_UINT16:
|
||||
case FT_UINT24:
|
||||
case FT_UINT32:
|
||||
case FT_FRAMENUM:
|
||||
case FT_INT8:
|
||||
case FT_INT16:
|
||||
case FT_INT24:
|
||||
case FT_INT32:
|
||||
case FT_OID:
|
||||
/* for these types, "expr" is filled in the loop above */
|
||||
break;
|
||||
|
||||
case FT_UINT8:
|
||||
case FT_UINT16:
|
||||
case FT_UINT24:
|
||||
case FT_UINT32:
|
||||
case FT_FRAMENUM:
|
||||
g_snprintf(expr, size, hfinfo_numeric_value_format(hfinfo), fvalue_get_uinteger(&finfo->value));
|
||||
break;
|
||||
|
||||
case FT_INT8:
|
||||
case FT_INT16:
|
||||
case FT_INT24:
|
||||
case FT_INT32:
|
||||
g_snprintf(expr, size, hfinfo_numeric_value_format(hfinfo), fvalue_get_sinteger(&finfo->value));
|
||||
break;
|
||||
|
||||
case FT_OID:
|
||||
bytes = fvalue_get(&finfo->value);
|
||||
g_strlcpy(expr, oid_encoded2string(bytes, fvalue_length(&finfo->value)), size);
|
||||
break;
|
||||
|
||||
default:
|
||||
g_strlcpy(expr, result, size);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
/* for all others, just copy "result" to "expr" */
|
||||
g_strlcpy(expr, result, size);
|
||||
break;
|
||||
}
|
||||
/*XXSLBXX*/
|
||||
|
||||
return hfinfo->abbrev;
|
||||
}
|
||||
|
|
39
gtk/main.c
39
gtk/main.c
|
@ -603,24 +603,33 @@ get_filter_from_packet_list_row_and_column(gpointer data)
|
|||
&cfile.cinfo);
|
||||
epan_dissect_fill_in_columns(&edt, TRUE, TRUE);
|
||||
|
||||
if (strlen(cfile.cinfo.col_expr.col_expr[column]) != 0 &&
|
||||
strlen(cfile.cinfo.col_expr.col_expr_val[column]) != 0) {
|
||||
/* leak a little but safer than ep_ here */
|
||||
if (cfile.cinfo.col_fmt[column] == COL_CUSTOM) {
|
||||
header_field_info *hfi = proto_registrar_get_byname(cfile.cinfo.col_custom_field[column]);
|
||||
if (hfi->parent == -1) {
|
||||
/* Protocol only */
|
||||
buf = se_strdup(cfile.cinfo.col_expr.col_expr[column]);
|
||||
} else if (hfi->type == FT_STRING) {
|
||||
/* Custom string, add quotes */
|
||||
buf = se_strdup_printf("%s == \"%s\"", cfile.cinfo.col_expr.col_expr[column],
|
||||
if (cfile.cinfo.col_custom_occurrence[column]) {
|
||||
/* Only construct the filter when a single occurrence is displayed
|
||||
* otherwise we might end up with a filter like "ip.proto==1,6".
|
||||
*
|
||||
* Or do we want to be able to filter on multiple occurrences so that
|
||||
* the filter might be calculated as "ip.proto==1 && ip.proto==6"
|
||||
* instead?
|
||||
*/
|
||||
if (strlen(cfile.cinfo.col_expr.col_expr[column]) != 0 &&
|
||||
strlen(cfile.cinfo.col_expr.col_expr_val[column]) != 0) {
|
||||
/* leak a little but safer than ep_ here */
|
||||
if (cfile.cinfo.col_fmt[column] == COL_CUSTOM) {
|
||||
header_field_info *hfi = proto_registrar_get_byname(cfile.cinfo.col_custom_field[column]);
|
||||
if (hfi->parent == -1) {
|
||||
/* Protocol only */
|
||||
buf = se_strdup(cfile.cinfo.col_expr.col_expr[column]);
|
||||
} else if (hfi->type == FT_STRING) {
|
||||
/* Custom string, add quotes */
|
||||
buf = se_strdup_printf("%s == \"%s\"", cfile.cinfo.col_expr.col_expr[column],
|
||||
cfile.cinfo.col_expr.col_expr_val[column]);
|
||||
}
|
||||
}
|
||||
if (buf == NULL) {
|
||||
buf = se_strdup_printf("%s == %s", cfile.cinfo.col_expr.col_expr[column],
|
||||
cfile.cinfo.col_expr.col_expr_val[column]);
|
||||
}
|
||||
}
|
||||
if (buf == NULL) {
|
||||
buf = se_strdup_printf("%s == %s", cfile.cinfo.col_expr.col_expr[column],
|
||||
cfile.cinfo.col_expr.col_expr_val[column]);
|
||||
}
|
||||
}
|
||||
|
||||
epan_dissect_cleanup(&edt);
|
||||
|
|
|
@ -326,6 +326,7 @@ column_prefs_show(GtkWidget *prefs_window) {
|
|||
gtk_widget_show(occurrence_lb);
|
||||
|
||||
occurrence_te = gtk_entry_new();
|
||||
gtk_entry_set_max_length (GTK_ENTRY(occurrence_te),4);
|
||||
g_object_set_data (G_OBJECT(occurrence_te), "occurrence", "");
|
||||
|
||||
/* XXX: column_occurrence_changed_cb will be called for every character entered in the entry box. */
|
||||
|
|
Loading…
Reference in New Issue