Fix a bunch of dissectors to use "pi.captured_len" rather than

"fd->cap_len" for the frame length - or to use macros such as
"BYTES_ARE_IN_FRAME()", "IS_DATA_IN_FRAME()", and "END_OF_FRAME", which
use "pi.captured_len" - so that they correctly handle frames where the
actual data length of the packet is less than the size of the raw frame,
e.g. with encapsulations such as ISL.

svn path=/trunk/; revision=1531
This commit is contained in:
Guy Harris 2000-01-24 03:51:35 +00:00
parent f2246ebb65
commit 930d95c0b0
3 changed files with 41 additions and 41 deletions

View File

@ -1,7 +1,7 @@
/* packet-icmpv6.c /* packet-icmpv6.c
* Routines for ICMPv6 packet disassembly * Routines for ICMPv6 packet disassembly
* *
* $Id: packet-icmpv6.c,v 1.12 2000/01/16 02:54:46 guy Exp $ * $Id: packet-icmpv6.c,v 1.13 2000/01/24 03:51:34 guy Exp $
* *
* Ethereal - Network traffic analyzer * Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org> * By Gerald Combs <gerald@zing.org>
@ -84,7 +84,7 @@ dissect_icmpv6opt(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
return; return;
again: again:
if (!(fd->cap_len > offset)) if (!IS_DATA_IN_FRAME(offset))
return; return;
opt = (struct nd_opt_hdr *)&pd[offset]; opt = (struct nd_opt_hdr *)&pd[offset];

View File

@ -1,7 +1,7 @@
/* packet-ppp.c /* packet-ppp.c
* Routines for ppp packet disassembly * Routines for ppp packet disassembly
* *
* $Id: packet-ppp.c,v 1.25 2000/01/23 08:55:35 guy Exp $ * $Id: packet-ppp.c,v 1.26 2000/01/24 03:51:35 guy Exp $
* *
* Ethereal - Network traffic analyzer * Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org> * By Gerald Combs <gerald@zing.org>
@ -1103,7 +1103,7 @@ dissect_mp(const u_char *pd, int offset, frame_data *fd,
offset += 4; offset += 4;
if (fd->cap_len > offset) { if (IS_DATA_IN_FRAME(offset)) {
if (tree) { if (tree) {
ti = proto_tree_add_item(tree, proto_ppp, offset, 1, NULL); ti = proto_tree_add_item(tree, proto_ppp, offset, 1, NULL);
fh_tree = proto_item_add_subtree(ti, ett_ppp); fh_tree = proto_item_add_subtree(ti, ett_ppp);

View File

@ -2,7 +2,7 @@
* Routines for x25 packet disassembly * Routines for x25 packet disassembly
* Olivier Abad <abad@daba.dhis.net> * Olivier Abad <abad@daba.dhis.net>
* *
* $Id: packet-x25.c,v 1.14 1999/12/12 12:59:01 oabad Exp $ * $Id: packet-x25.c,v 1.15 2000/01/24 03:51:35 guy Exp $
* *
* Ethereal - Network traffic analyzer * Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org> * By Gerald Combs <gerald@zing.org>
@ -1259,86 +1259,86 @@ get_x25_pkt_len(const char *data, frame_data *fd, int offset)
int length, called_len, calling_len, dte_len, dce_len; int length, called_len, calling_len, dte_len, dce_len;
/* packet size should always be > 3 */ /* packet size should always be > 3 */
if (fd->cap_len - offset < 3) return fd->cap_len; if (!BYTES_ARE_IN_FRAME(offset, 3)) return END_OF_FRAME;
switch ((guint8)data[2]) switch ((guint8)data[2])
{ {
case X25_CALL_REQUEST: case X25_CALL_REQUEST:
if (fd->cap_len > offset+3) /* pkt size > 3 */ if (BYTES_ARE_IN_FRAME(offset, 4)) /* pkt size >= 4 */
{ {
called_len = (data[3] >> 0) & 0x0F; called_len = (data[3] >> 0) & 0x0F;
calling_len = (data[3] >> 4) & 0x0F; calling_len = (data[3] >> 4) & 0x0F;
length = 4 + (called_len + calling_len + 1) / 2; /* addr */ length = 4 + (called_len + calling_len + 1) / 2; /* addr */
if (length+offset < fd->cap_len) if (length+offset < pi.captured_len)
length += (1 + data[length]); /* facilities */ length += (1 + data[length]); /* facilities */
} }
else length = fd->cap_len - offset; else length = END_OF_FRAME;
return MIN(fd->cap_len-offset,length); return MIN(END_OF_FRAME,length);
case X25_CALL_ACCEPTED: case X25_CALL_ACCEPTED:
if (fd->cap_len > offset+3) /* pkt size > 3 */ if (BYTES_ARE_IN_FRAME(offset, 4)) /* pkt size >= 4 */
{ {
called_len = (data[3] >> 0) & 0x0F; called_len = (data[3] >> 0) & 0x0F;
calling_len = (data[3] >> 4) & 0x0F; calling_len = (data[3] >> 4) & 0x0F;
length = 4 + (called_len + calling_len + 1) / 2; /* addr */ length = 4 + (called_len + calling_len + 1) / 2; /* addr */
if (length+offset < fd->cap_len) if (length+offset < pi.captured_len)
length += (1 + data[length]); /* facilities */ length += (1 + data[length]); /* facilities */
} }
else length = fd->cap_len - offset; else length = END_OF_FRAME;
return MIN(fd->cap_len-offset,length); return MIN(END_OF_FRAME,length);
case X25_CLEAR_REQUEST: case X25_CLEAR_REQUEST:
case X25_RESET_REQUEST: case X25_RESET_REQUEST:
case X25_RESTART_REQUEST: case X25_RESTART_REQUEST:
return MIN(fd->cap_len-offset,5); return MIN(END_OF_FRAME,5);
case X25_DIAGNOSTIC: case X25_DIAGNOSTIC:
return MIN(fd->cap_len-offset,4); return MIN(END_OF_FRAME,4);
case X25_CLEAR_CONFIRMATION: case X25_CLEAR_CONFIRMATION:
case X25_INTERRUPT: case X25_INTERRUPT:
case X25_INTERRUPT_CONFIRMATION: case X25_INTERRUPT_CONFIRMATION:
case X25_RESET_CONFIRMATION: case X25_RESET_CONFIRMATION:
case X25_RESTART_CONFIRMATION: case X25_RESTART_CONFIRMATION:
return MIN(fd->cap_len-offset,3); return MIN(END_OF_FRAME,3);
case X25_REGISTRATION_REQUEST: case X25_REGISTRATION_REQUEST:
if (fd->cap_len > offset+3) /* pkt size > 3 */ if (BYTES_ARE_IN_FRAME(offset, 4)) /* pkt size >= 4 */
{ {
dce_len = (data[3] >> 0) & 0x0F; dce_len = (data[3] >> 0) & 0x0F;
dte_len = (data[3] >> 4) & 0x0F; dte_len = (data[3] >> 4) & 0x0F;
length = 4 + (dte_len + dce_len + 1) / 2; /* addr */ length = 4 + (dte_len + dce_len + 1) / 2; /* addr */
if (length+offset < fd->cap_len) if (length+offset < pi.captured_len)
length += (1 + data[length]); /* registration */ length += (1 + data[length]); /* registration */
} }
else length = fd->cap_len-offset; else length = END_OF_FRAME;
return MIN(fd->cap_len-offset,length); return MIN(END_OF_FRAME,length);
case X25_REGISTRATION_CONFIRMATION: case X25_REGISTRATION_CONFIRMATION:
if (fd->cap_len > offset+5) /* pkt size > 5 */ if (BYTES_ARE_IN_FRAME(offset, 6)) /* pkt size >= 6 */
{ {
dce_len = (data[5] >> 0) & 0x0F; dce_len = (data[5] >> 0) & 0x0F;
dte_len = (data[5] >> 4) & 0x0F; dte_len = (data[5] >> 4) & 0x0F;
length = 6 + (dte_len + dce_len + 1) / 2; /* addr */ length = 6 + (dte_len + dce_len + 1) / 2; /* addr */
if (length+offset < fd->cap_len) if (length+offset < pi.captured_len)
length += (1 + data[length]); /* registration */ length += (1 + data[length]); /* registration */
} }
else length = fd->cap_len-offset; else length = END_OF_FRAME;
return MIN(fd->cap_len-offset,length); return MIN(END_OF_FRAME,length);
} }
if ((data[2] & 0x01) == X25_DATA) return MIN(fd->cap_len-offset,3); if ((data[2] & 0x01) == X25_DATA) return MIN(END_OF_FRAME,3);
switch (data[2] & 0x1F) switch (data[2] & 0x1F)
{ {
case X25_RR: case X25_RR:
return MIN(fd->cap_len-offset,3); return MIN(END_OF_FRAME,3);
case X25_RNR: case X25_RNR:
return MIN(fd->cap_len-offset,3); return MIN(END_OF_FRAME,3);
case X25_REJ: case X25_REJ:
return MIN(fd->cap_len-offset,3); return MIN(END_OF_FRAME,3);
} }
return 0; return 0;
@ -1370,7 +1370,7 @@ dissect_x25(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
col_add_str(fd, COL_INFO, "Invalid/short X.25 packet"); col_add_str(fd, COL_INFO, "Invalid/short X.25 packet");
if (tree) if (tree)
proto_tree_add_item_format(tree, (modulo == 8 ? proto_x25 : proto_ex25), proto_tree_add_item_format(tree, (modulo == 8 ? proto_x25 : proto_ex25),
localoffset, fd->cap_len - offset, NULL, localoffset, END_OF_FRAME, NULL,
"Invalid/short X.25 packet"); "Invalid/short X.25 packet");
return; return;
} }
@ -1411,7 +1411,7 @@ dissect_x25(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
if (localoffset < x25_pkt_len+offset) /* facilities */ if (localoffset < x25_pkt_len+offset) /* facilities */
dump_facilities(x25_tree, &localoffset, &pd[localoffset]); dump_facilities(x25_tree, &localoffset, &pd[localoffset]);
if (localoffset < fd->cap_len) /* user data */ if (IS_DATA_IN_FRAME(localoffset)) /* user data */
{ {
if (pd[localoffset] == 0xCC) if (pd[localoffset] == 0xCC)
{ {
@ -1437,8 +1437,8 @@ dissect_x25(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
else { else {
if (x25_tree) if (x25_tree)
proto_tree_add_text(x25_tree, localoffset, proto_tree_add_text(x25_tree, localoffset,
fd->cap_len-localoffset, "Data"); pi.captured_len-localoffset, "Data");
localoffset = fd->cap_len; localoffset = pi.captured_len;
} }
} }
break; break;
@ -1464,11 +1464,11 @@ dissect_x25(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
if (localoffset < x25_pkt_len+offset) /* facilities */ if (localoffset < x25_pkt_len+offset) /* facilities */
dump_facilities(x25_tree, &localoffset, &pd[localoffset]); dump_facilities(x25_tree, &localoffset, &pd[localoffset]);
if (localoffset < fd->cap_len) { /* user data */ if (IS_DATA_IN_FRAME(localoffset)) { /* user data */
if (x25_tree) if (x25_tree)
proto_tree_add_text(x25_tree, localoffset, proto_tree_add_text(x25_tree, localoffset,
fd->cap_len-localoffset, "Data"); pi.captured_len-localoffset, "Data");
localoffset=fd->cap_len; localoffset=pi.captured_len;
} }
break; break;
case X25_CLEAR_REQUEST: case X25_CLEAR_REQUEST:
@ -1509,10 +1509,10 @@ dissect_x25(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
} }
localoffset += x25_pkt_len; localoffset += x25_pkt_len;
if (localoffset < fd->cap_len) /* extended clear conf format */ if (IS_DATA_IN_FRAME(localoffset)) /* extended clear conf format */
x25_ntoa(x25_tree, &localoffset, &pd[localoffset], fd, toa); x25_ntoa(x25_tree, &localoffset, &pd[localoffset], fd, toa);
if (localoffset < fd->cap_len) /* facilities */ if (IS_DATA_IN_FRAME(localoffset)) /* facilities */
dump_facilities(x25_tree, &localoffset, &pd[localoffset]); dump_facilities(x25_tree, &localoffset, &pd[localoffset]);
break; break;
case X25_DIAGNOSTIC: case X25_DIAGNOSTIC:
@ -1636,7 +1636,7 @@ dissect_x25(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
proto_tree_add_text(x25_tree, localoffset+1, proto_tree_add_text(x25_tree, localoffset+1,
pd[localoffset] & 0x7F, "Registration"); pd[localoffset] & 0x7F, "Registration");
} }
localoffset = fd->cap_len; localoffset = pi.captured_len;
break; break;
case X25_REGISTRATION_CONFIRMATION: case X25_REGISTRATION_CONFIRMATION:
if(check_col(fd, COL_INFO)) if(check_col(fd, COL_INFO))
@ -1663,7 +1663,7 @@ dissect_x25(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
proto_tree_add_text(x25_tree, localoffset+1, proto_tree_add_text(x25_tree, localoffset+1,
pd[localoffset] & 0x7F, "Registration"); pd[localoffset] & 0x7F, "Registration");
} }
localoffset = fd->cap_len; localoffset = pi.captured_len;
break; break;
default : default :
localoffset += 2; localoffset += 2;
@ -1794,7 +1794,7 @@ dissect_x25(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
localoffset += (modulo == 8) ? 1 : 2; localoffset += (modulo == 8) ? 1 : 2;
} }
if (localoffset >= fd->cap_len) return; if (!IS_DATA_IN_FRAME(localoffset)) return;
/* search the dissector in the hash table */ /* search the dissector in the hash table */
if ((dissect = x25_hash_get_dissect(fd->abs_secs, fd->abs_usecs, vc))) if ((dissect = x25_hash_get_dissect(fd->abs_secs, fd->abs_usecs, vc)))