aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorJeff Morriss <jeff.morriss@ulticom.com>2008-03-09 14:50:14 +0000
committerJeff Morriss <jeff.morriss@ulticom.com>2008-03-09 14:50:14 +0000
commit5ca9e9cbe8f27db88e7a1207957430fbcbe7e1c0 (patch)
tree451f9dc159ab5300bbf7c5394d444b0728fefaee /epan
parentaa9b4bf5412fff30eafc6a07ec119c8f4285d758 (diff)
Fix http://bugs.wireshark.org/bugzilla/show_bug.cgi?id=2009 : if the dissector told us how to format the representation of an item then indicate if we truncated it (we were already doing this if we formatted the representation). Do the same for FT_BYTES.
svn path=/trunk/; revision=24593
Diffstat (limited to 'epan')
-rw-r--r--epan/proto.c81
1 files changed, 66 insertions, 15 deletions
diff --git a/epan/proto.c b/epan/proto.c
index 4197b5c1a9..7dcf8ab8a2 100644
--- a/epan/proto.c
+++ b/epan/proto.c
@@ -3193,18 +3193,40 @@ proto_tree_set_representation_value(proto_item *pi, const char *format, va_list
if (!PROTO_ITEM_IS_HIDDEN(pi)) {
ITEM_LABEL_NEW(fi->rep);
replen = 0;
+
+ /* put in the hf name */
ret = g_snprintf(fi->rep->representation, ITEM_LABEL_LENGTH,
- "%s: ", fi->hfinfo->name);
+ "%s: ", fi->hfinfo->name);
if ((ret == -1) || (ret >= ITEM_LABEL_LENGTH)) {
/* That's all we can put in the representation. */
fi->rep->representation[ITEM_LABEL_LENGTH - 1] = '\0';
return;
}
replen = ret;
+
+ /* Put in the value of the string */
ret = g_vsnprintf(fi->rep->representation + replen,
- ITEM_LABEL_LENGTH - replen, format, ap);
- if ((ret == -1) || (ret >= ITEM_LABEL_LENGTH - replen))
+ ITEM_LABEL_LENGTH - replen, format, ap);
+ if ((ret == -1) || (ret >= ITEM_LABEL_LENGTH - replen)) {
+ /* Uh oh, we don't have enough room. Tell the user
+ * that the field is truncated.
+ */
+ char *oldrep;
+
fi->rep->representation[ITEM_LABEL_LENGTH - 1] = '\0';
+
+ /* Argh, we cannot reuse 'ap' here. So make a copy
+ * of what we formatted for (re)use below.
+ */
+ oldrep = g_strdup(fi->rep->representation);
+
+ ret = g_snprintf(fi->rep->representation,
+ ITEM_LABEL_LENGTH,
+ "[truncated] %s",
+ oldrep);
+ fi->rep->representation[ITEM_LABEL_LENGTH - 1] = '\0';
+ g_free(oldrep);
+ }
}
}
@@ -3219,9 +3241,26 @@ proto_tree_set_representation(proto_item *pi, const char *format, va_list ap)
if (!PROTO_ITEM_IS_HIDDEN(pi)) {
ITEM_LABEL_NEW(fi->rep);
- ret = g_vsnprintf(fi->rep->representation, ITEM_LABEL_LENGTH, format, ap);
- if ((ret == -1) || (ret >= ITEM_LABEL_LENGTH))
+ ret = g_vsnprintf(fi->rep->representation, ITEM_LABEL_LENGTH,
+ format, ap);
+ if ((ret == -1) || (ret >= ITEM_LABEL_LENGTH)) {
+ /* Uh oh, we don't have enough room. Tell the user
+ * that the field is truncated.
+ */
+ char *oldrep;
+
fi->rep->representation[ITEM_LABEL_LENGTH - 1] = '\0';
+
+ /* Argh, we cannot reuse 'ap' here. So make a copy
+ * of what we formatted for (re)use below.
+ */
+ oldrep = g_strdup(fi->rep->representation);
+
+ g_snprintf(fi->rep->representation, ITEM_LABEL_LENGTH,
+ "[truncated] %s", oldrep);
+ fi->rep->representation[ITEM_LABEL_LENGTH - 1] = '\0';
+ g_free(oldrep);
+ }
}
}
@@ -4067,8 +4106,16 @@ proto_item_fill_label(field_info *fi, gchar *label_str)
ret = g_snprintf(label_str, ITEM_LABEL_LENGTH,
"%s: %s", hfinfo->name,
bytes_to_str(bytes, fvalue_length(&fi->value)));
- if ((ret == -1) || (ret >= ITEM_LABEL_LENGTH))
+ if ((ret == -1) || (ret >= ITEM_LABEL_LENGTH)) {
+ /* Uh oh, we don't have enough room. Tell the
+ * user that the field is truncated.
+ */
+ ret = g_snprintf(label_str, ITEM_LABEL_LENGTH,
+ "%s [truncated]: %s",
+ hfinfo->name,
+ bytes_to_str(bytes, fvalue_length(&fi->value)));
label_str[ITEM_LABEL_LENGTH - 1] = '\0';
+ }
}
else {
ret = g_snprintf(label_str, ITEM_LABEL_LENGTH,
@@ -4230,15 +4277,19 @@ proto_item_fill_label(field_info *fi, gchar *label_str)
case FT_EBCDIC:
case FT_UINT_STRING:
bytes = fvalue_get(&fi->value);
- if(strlen(bytes) > ITEM_LABEL_LENGTH) {
- ret = g_snprintf(label_str, ITEM_LABEL_LENGTH,
- "%s [truncated]: %s", hfinfo->name,
- format_text(bytes, strlen(bytes)));
- } else {
- ret = g_snprintf(label_str, ITEM_LABEL_LENGTH,
- "%s: %s", hfinfo->name,
- format_text(bytes, strlen(bytes)));
- }
+ if(strlen(bytes) > ITEM_LABEL_LENGTH) {
+ /* Uh oh, we don't have enough room. Tell the
+ * user that the field is truncated.
+ */
+ ret = g_snprintf(label_str, ITEM_LABEL_LENGTH,
+ "%s [truncated]: %s",
+ hfinfo->name,
+ format_text(bytes, strlen(bytes)));
+ } else {
+ ret = g_snprintf(label_str, ITEM_LABEL_LENGTH,
+ "%s: %s", hfinfo->name,
+ format_text(bytes, strlen(bytes)));
+ }
if ((ret == -1) || (ret >= ITEM_LABEL_LENGTH))
label_str[ITEM_LABEL_LENGTH - 1] = '\0';
break;