summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt4
-rw-r--r--CMakeOptions.txt1
-rw-r--r--cmakeconfig.h.in3
-rw-r--r--configure.ac8
-rw-r--r--epan/proto.c56
5 files changed, 71 insertions, 1 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0a62cbda39..571cf43fcc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -989,6 +989,10 @@ elseif(QT_FOUND)
endif()
endif()
+if(ENABLE_CHECKHF_CONFLICT)
+ set(ENABLE_CHECK_FILTER 1)
+endif()
+
message(STATUS "C-Flags: ${CMAKE_C_FLAGS}")
message(STATUS "CXX-Flags: ${CMAKE_CXX_FLAGS}")
message(STATUS "Warnings as errors: ${WERROR_COMMON_FLAGS}")
diff --git a/CMakeOptions.txt b/CMakeOptions.txt
index ac6565bcc6..e96a102530 100644
--- a/CMakeOptions.txt
+++ b/CMakeOptions.txt
@@ -25,6 +25,7 @@ option(EXTCAP_ANDROIDDUMP_LIBPCAP "Build androiddump using libpcap" OFF)
option(ENABLE_EXTRA_COMPILER_WARNINGS "Do additional compiler warnings (disables -Werror)" OFF)
option(ENABLE_CODE_ANALYSIS "Enable the compiler's static analyzer if possible" OFF)
option(ENABLE_ASAN "Enable AddressSanitizer (ASAN) for debugging (May be slow down)" OFF)
+option(ENABLE_CHECKHF_CONFLICT "Enable Check hf conflict for debugging (May be slow start)" OFF)
#
# Leave GTK2 the default on Windows, looks better than GTK3
diff --git a/cmakeconfig.h.in b/cmakeconfig.h.in
index 35cc3d06cd..6fa2dc14bd 100644
--- a/cmakeconfig.h.in
+++ b/cmakeconfig.h.in
@@ -31,6 +31,9 @@
/* Define to 1 if we want to enable plugins */
#cmakedefine HAVE_PLUGINS 1
+/* Define to 1 if we check hf conflict */
+#cmakedefine ENABLE_CHECK_FILTER 1
+
/* Link plugins statically into Wireshark */
#cmakedefine ENABLE_STATIC 1
diff --git a/configure.ac b/configure.ac
index c85651913c..e4db0d44ed 100644
--- a/configure.ac
+++ b/configure.ac
@@ -963,6 +963,14 @@ AC_ARG_ENABLE(asan,
],)
+# Add check hf conflict..
+#
+AC_ARG_ENABLE(checkhf-conflict,
+ AC_HELP_STRING( [--enable-checkhf-conflict],
+ [Enable Check hf conflict for debugging (May be slow start)@<:@default=no@:>@]),
+[
+ AC_DEFINE(ENABLE_CHECK_FILTER, 1, [Enable check hf conflict])
+],)
#
# The following are for C and C++
diff --git a/epan/proto.c b/epan/proto.c
index 696831f7c0..68a9f46c63 100644
--- a/epan/proto.c
+++ b/epan/proto.c
@@ -62,7 +62,6 @@
/* XXX - This should probably be a preference */
#define MAX_TREE_ITEMS (1 * 1000 * 1000)
-
typedef struct __subtree_lvl {
gint cursor_offset;
proto_item *it;
@@ -6675,6 +6674,54 @@ tmp_fld_check_assert(header_field_info *hfinfo)
}
}
+#ifdef ENABLE_CHECK_FILTER
+static enum ftenum
+_ftype_common(enum ftenum type)
+{
+ switch (type) {
+ case FT_INT8:
+ case FT_INT16:
+ case FT_INT24:
+ case FT_INT32:
+ return FT_INT32;
+
+ case FT_UINT8:
+ case FT_UINT16:
+ case FT_UINT24:
+ case FT_UINT32:
+ case FT_IPXNET:
+ case FT_FRAMENUM:
+ return FT_UINT32;
+
+ case FT_UINT64:
+ case FT_EUI64:
+ return FT_UINT64;
+
+ case FT_STRING:
+ case FT_STRINGZ:
+ case FT_UINT_STRING:
+ return FT_STRING;
+
+ case FT_FLOAT:
+ case FT_DOUBLE:
+ return FT_DOUBLE;
+
+ case FT_BYTES:
+ case FT_UINT_BYTES:
+ case FT_ETHER:
+ case FT_OID:
+ return FT_BYTES;
+
+ case FT_ABSOLUTE_TIME:
+ case FT_RELATIVE_TIME:
+ return FT_ABSOLUTE_TIME;
+
+ default:
+ return type;
+ }
+}
+#endif
+
static void
register_type_length_mismatch(void)
{
@@ -6803,6 +6850,13 @@ proto_register_field_init(header_field_info *hfinfo, const int parent)
same_name_hfinfo->same_name_next = hfinfo;
hfinfo->same_name_prev_id = same_name_hfinfo->id;
+#ifdef ENABLE_CHECK_FILTER
+ while (same_name_hfinfo) {
+ if (_ftype_common(hfinfo->type) != _ftype_common(same_name_hfinfo->type))
+ fprintf(stderr, "'%s' exists multiple times with NOT compatible types: %s and %s\n", hfinfo->abbrev, ftype_name(hfinfo->type), ftype_name(same_name_hfinfo->type));
+ same_name_hfinfo = same_name_hfinfo->same_name_next;
+ }
+#endif
}
}