aboutsummaryrefslogtreecommitdiffstats
path: root/req_resp_hdrs.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2003-12-24 09:50:54 +0000
committerGuy Harris <guy@alum.mit.edu>2003-12-24 09:50:54 +0000
commit3f05338503e333053af8d2336a4e9d52656a732b (patch)
tree1c02784690fbdd7792ee505ad2698f7335851054 /req_resp_hdrs.c
parent83b4a6158f615bfa4cf2370019506e285cfe03a4 (diff)
downloadwireshark-3f05338503e333053af8d2336a4e9d52656a732b.tar.gz
wireshark-3f05338503e333053af8d2336a4e9d52656a732b.tar.bz2
wireshark-3f05338503e333053af8d2336a4e9d52656a732b.zip
In the loop that processes lines in HTTP requests and replies, loop as
long as there's reported data, don't just loop through the data in the tvbuff. Fix some problems with short frames. svn path=/trunk/; revision=9438
Diffstat (limited to 'req_resp_hdrs.c')
-rw-r--r--req_resp_hdrs.c37
1 files changed, 29 insertions, 8 deletions
diff --git a/req_resp_hdrs.c b/req_resp_hdrs.c
index a1aef35a17..e580ad8dc7 100644
--- a/req_resp_hdrs.c
+++ b/req_resp_hdrs.c
@@ -2,7 +2,7 @@
* Routines handling protocols with a request/response line, headers,
* a blank line, and an optional body.
*
- * $Id: req_resp_hdrs.c,v 1.1 2003/12/23 02:29:11 guy Exp $
+ * $Id: req_resp_hdrs.c,v 1.2 2003/12/24 09:50:54 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -43,6 +43,7 @@ req_resp_hdrs_do_reassembly(tvbuff_t *tvb, packet_info *pinfo,
gint offset = 0;
gint next_offset;
gint next_offset_sav;
+ gint length_remaining, reported_length_remaining;
int linelen;
long int content_length;
gboolean content_length_found = FALSE;
@@ -89,11 +90,19 @@ req_resp_hdrs_do_reassembly(tvbuff_t *tvb, packet_info *pinfo,
for (;;) {
next_offset_sav = next_offset;
+ length_remaining = tvb_length_remaining(tvb,
+ next_offset);
+ reported_length_remaining =
+ tvb_reported_length_remaining(tvb, next_offset);
+
/*
* Request one more byte if there're no
- * bytes left.
+ * bytes left in the reported data (if there're
+ * bytes left in the reported data, but not in
+ * the available data, requesting more bytes
+ * won't help, as those bytes weren't captured).
*/
- if (tvb_offset_exists(tvb, next_offset) == FALSE) {
+ if (reported_length_remaining < 1) {
pinfo->desegment_offset = offset;
pinfo->desegment_len = 1;
return FALSE;
@@ -105,7 +114,8 @@ req_resp_hdrs_do_reassembly(tvbuff_t *tvb, packet_info *pinfo,
*/
linelen = tvb_find_line_end(tvb, next_offset,
-1, &next_offset, TRUE);
- if (linelen == -1) {
+ if (linelen == -1 &&
+ length_remaining >= reported_length_remaining) {
/*
* Not enough data; ask for one more
* byte.
@@ -154,11 +164,22 @@ req_resp_hdrs_do_reassembly(tvbuff_t *tvb, packet_info *pinfo,
if (desegment_body && content_length_found) {
/* next_offset has been set because content-length was found */
if (!tvb_bytes_exist(tvb, next_offset, content_length)) {
- gint length = tvb_length_remaining(tvb, next_offset);
- if (length == -1)
- length = 0;
+ length_remaining = tvb_length_remaining(tvb,
+ next_offset);
+ reported_length_remaining =
+ tvb_reported_length_remaining(tvb, next_offset);
+ if (length_remaining < reported_length_remaining) {
+ /*
+ * It's a waste of time asking for more
+ * data, because that data wasn't captured.
+ */
+ return TRUE;
+ }
+ if (length_remaining == -1)
+ length_remaining = 0;
pinfo->desegment_offset = offset;
- pinfo->desegment_len = content_length - length;
+ pinfo->desegment_len =
+ content_length - length_remaining;
return FALSE;
}
}