aboutsummaryrefslogtreecommitdiffstats
path: root/epan/print.c
diff options
context:
space:
mode:
authorEvan Huus <eapache@gmail.com>2013-10-13 16:10:43 +0000
committerEvan Huus <eapache@gmail.com>2013-10-13 16:10:43 +0000
commitee6916b838f68b21c762293ad46390b5a137c964 (patch)
tree8c423ddb714f4862ee4f825302c06f824a7ca931 /epan/print.c
parent4e50b8bf973a6e1b3a05773753cbce850e36041d (diff)
When printing PDML, don't assume that all values with bitmasks are represented
as guint32 internally - they may be signed and/or 64-bit. svn path=/trunk/; revision=52587
Diffstat (limited to 'epan/print.c')
-rw-r--r--epan/print.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/epan/print.c b/epan/print.c
index 6aa353f9ea..01a8708e52 100644
--- a/epan/print.c
+++ b/epan/print.c
@@ -30,6 +30,7 @@
#include <string.h>
#include <glib.h>
+#include <glib/gprintf.h>
#include <epan/epan.h>
#include <epan/epan_dissect.h>
@@ -457,7 +458,28 @@ proto_tree_write_node_pdml(proto_node *node, gpointer data)
fputs("\" value=\"", pdata->fh);
if (fi->hfinfo->bitmask!=0) {
- fprintf(pdata->fh, "%X", fvalue_get_uinteger(&fi->value));
+ switch (fi->value.ftype->ftype) {
+ case FT_INT8:
+ case FT_INT16:
+ case FT_INT24:
+ case FT_INT32:
+ fprintf(pdata->fh, "%X", (guint) fvalue_get_sinteger(&fi->value));
+ break;
+ case FT_UINT8:
+ case FT_UINT16:
+ case FT_UINT24:
+ case FT_UINT32:
+ case FT_BOOLEAN:
+ fprintf(pdata->fh, "%X", fvalue_get_uinteger(&fi->value));
+ break;
+ case FT_INT64:
+ case FT_UINT64:
+ g_fprintf(pdata->fh, "%" G_GINT64_MODIFIER "X",
+ fvalue_get_integer64(&fi->value));
+ break;
+ default:
+ g_assert_not_reached();
+ }
fputs("\" unmaskedvalue=\"", pdata->fh);
write_pdml_field_hex_value(pdata, fi);
}