summaryrefslogtreecommitdiff
path: root/epan/dfilter
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2003-06-13 07:27:46 +0000
committerGuy Harris <guy@alum.mit.edu>2003-06-13 07:27:46 +0000
commit669e203f4b2a41f2bb8b9dff432e4931b52cb6fa (patch)
tree0814bfcc8d459f6be21c9fa8ad2068a5c7348853 /epan/dfilter
parenta67a96191bae586e83a695f3aa9bf26fea8230d0 (diff)
downloadwireshark-669e203f4b2a41f2bb8b9dff432e4931b52cb6fa.tar.gz
Add some sanity checking for ranges, so that you can't say "foo[M-N]"
where N is less than or equal to M. svn path=/trunk/; revision=7873
Diffstat (limited to 'epan/dfilter')
-rw-r--r--epan/dfilter/semcheck.c67
1 files changed, 66 insertions, 1 deletions
diff --git a/epan/dfilter/semcheck.c b/epan/dfilter/semcheck.c
index 77566a4fe2..a79e5ed594 100644
--- a/epan/dfilter/semcheck.c
+++ b/epan/dfilter/semcheck.c
@@ -1,5 +1,5 @@
/*
- * $Id: semcheck.c,v 1.15 2002/12/19 02:58:49 guy Exp $
+ * $Id: semcheck.c,v 1.16 2003/06/13 07:27:46 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -393,6 +393,69 @@ check_relation_LHS_STRING(FtypeCanFunc can_func _U_, stnode_t *st_node,
}
}
+struct check_drange_sanity_args {
+ drange_node* err_node;
+};
+
+static void
+check_drange_node_sanity(gpointer data, gpointer user_data)
+{
+ drange_node* drnode = data;
+ struct check_drange_sanity_args *args = user_data;
+ gint start_offset, end_offset;
+
+ switch (drange_node_get_ending(drnode)) {
+
+ case UNINITIALIZED:
+ g_assert_not_reached();
+ break;
+
+ case LENGTH:
+ /*
+ * Any sanity checks required here?
+ */
+ break;
+
+ case OFFSET:
+ /*
+ * Make sure the start offset isn't beyond the end
+ * offset.
+ */
+ start_offset = drange_node_get_start_offset(drnode);
+ end_offset = drange_node_get_end_offset(drnode);
+ if (start_offset >= end_offset) {
+ if (args->err_node == NULL)
+ args->err_node = drnode;
+ }
+ break;
+
+ case TO_THE_END:
+ break;
+ }
+}
+
+static void
+check_drange_sanity(stnode_t *st)
+{
+ struct check_drange_sanity_args args;
+ header_field_info *hfinfo;
+ gint start_offset, end_offset;
+
+ args.err_node = NULL;
+ drange_foreach_drange_node(sttype_range_drange(st),
+ check_drange_node_sanity, &args);
+ if (args.err_node != NULL) {
+ hfinfo = sttype_range_hfinfo(st);
+ start_offset = drange_node_get_start_offset(args.err_node);
+ end_offset = drange_node_get_end_offset(args.err_node);
+ dfilter_fail("Range %d-%d specified for \"%s\" isn't valid, as %d isn't greater than %d",
+ start_offset, end_offset,
+ hfinfo->abbrev,
+ end_offset, start_offset);
+ THROW(TypeError);
+ }
+}
+
static void
check_relation_LHS_RANGE(FtypeCanFunc can_func _U_, stnode_t *st_node,
stnode_t *st_arg1, stnode_t *st_arg2)
@@ -416,6 +479,7 @@ check_relation_LHS_RANGE(FtypeCanFunc can_func _U_, stnode_t *st_node,
THROW(TypeError);
}
+ check_drange_sanity(st_arg1);
if (type2 == STTYPE_FIELD) {
hfinfo2 = sttype_range_hfinfo(st_arg2);
@@ -452,6 +516,7 @@ check_relation_LHS_RANGE(FtypeCanFunc can_func _U_, stnode_t *st_node,
stnode_free(st_arg2);
}
else if (type2 == STTYPE_RANGE) {
+ check_drange_sanity(st_arg2);
/* XXX - check lengths of both ranges */
}
else {