aboutsummaryrefslogtreecommitdiffstats
path: root/epan/ftypes/ftypes.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2004-05-09 08:29:48 +0000
committerGuy Harris <guy@alum.mit.edu>2004-05-09 08:29:48 +0000
commit62f5077dc3cd6ec676722b935509db5f00669123 (patch)
tree10112d29025e58d3099f206c2a79eb2294be25d5 /epan/ftypes/ftypes.c
parent35cf424c08dc84ab3f40c8dafea1e08445958ecb (diff)
From Graeme Hewson:
Fix off-by-one errors in slice_func svn path=/trunk/; revision=10831
Diffstat (limited to 'epan/ftypes/ftypes.c')
-rw-r--r--epan/ftypes/ftypes.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/epan/ftypes/ftypes.c b/epan/ftypes/ftypes.c
index 6eae2d9498..77bcdcd773 100644
--- a/epan/ftypes/ftypes.c
+++ b/epan/ftypes/ftypes.c
@@ -1,5 +1,5 @@
/*
- * $Id: ftypes.c,v 1.21 2004/02/27 12:00:32 obiot Exp $
+ * $Id: ftypes.c,v 1.22 2004/05/09 08:29:48 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -347,15 +347,16 @@ slice_func(gpointer data, gpointer user_data)
}
/* Check the end type, and set both end_offset and length */
+
if (ending == TO_THE_END) {
- end_offset = field_length;
- length = end_offset - start_offset;
+ end_offset = field_length - 1;
+ length = end_offset - start_offset + 1;
}
else if (ending == LENGTH) {
length = drange_node_get_length(drnode);
if (length < 0) {
end_offset = field_length + length;
- if (end_offset > start_offset) {
+ if (end_offset >= start_offset) {
length = end_offset - start_offset + 1;
}
else {
@@ -364,14 +365,14 @@ slice_func(gpointer data, gpointer user_data)
}
}
else {
- end_offset = start_offset + length;
+ end_offset = start_offset + length - 1;
}
}
else if (ending == OFFSET) {
end_offset = drange_node_get_end_offset(drnode);
if (end_offset < 0) {
end_offset = field_length + end_offset;
- if (end_offset > start_offset) {
+ if (end_offset >= start_offset) {
length = end_offset - start_offset + 1;
}
else {
@@ -390,11 +391,12 @@ slice_func(gpointer data, gpointer user_data)
/* g_debug("(NEW) start_offset=%d length=%d end_offset=%d",
start_offset, length, end_offset); */
- if (start_offset > (int) field_length || end_offset > (int) field_length) {
+ if (end_offset >= (int) field_length) {
slice_data->slice_failure = TRUE;
return;
}
+ g_assert(start_offset >=0 && length > 0);
fv->ftype->slice(fv, slice_data->bytes, start_offset, length);
}