diff options
author | Guy Harris <guy@alum.mit.edu> | 2003-06-13 07:27:46 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2003-06-13 07:27:46 +0000 |
commit | 669e203f4b2a41f2bb8b9dff432e4931b52cb6fa (patch) | |
tree | 0814bfcc8d459f6be21c9fa8ad2068a5c7348853 | |
parent | a67a96191bae586e83a695f3aa9bf26fea8230d0 (diff) |
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
-rw-r--r-- | epan/dfilter/semcheck.c | 67 |
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 { |