aboutsummaryrefslogtreecommitdiffstats
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
parent83b4a6158f615bfa4cf2370019506e285cfe03a4 (diff)
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
-rw-r--r--packet-http.c16
-rw-r--r--req_resp_hdrs.c37
2 files changed, 40 insertions, 13 deletions
diff --git a/packet-http.c b/packet-http.c
index 2f3a87bdf4..c8aa6cec31 100644
--- a/packet-http.c
+++ b/packet-http.c
@@ -6,7 +6,7 @@
* Copyright 2002, Tim Potter <tpot@samba.org>
* Copyright 1999, Andrew Tridgell <tridge@samba.org>
*
- * $Id: packet-http.c,v 1.81 2003/12/23 02:29:11 guy Exp $
+ * $Id: packet-http.c,v 1.82 2003/12/24 09:50:54 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -218,8 +218,11 @@ dissect_http_message(tvbuff_t *tvb, int offset, packet_info *pinfo,
* is not longer than what's in the buffer, so the
* "tvb_get_ptr()" call won't throw an exception.
*/
- first_linelen = tvb_find_line_end(tvb, offset, -1, &next_offset,
- FALSE);
+ first_linelen = tvb_find_line_end(tvb, offset,
+ tvb_ensure_length_remaining(tvb, offset), &next_offset,
+ TRUE);
+ if (first_linelen < 0)
+ return -1;
line = tvb_get_ptr(tvb, offset, first_linelen);
http_type = HTTP_OTHERS; /* type not known yet */
is_request_or_reply = is_http_request_or_reply(line, first_linelen,
@@ -292,12 +295,15 @@ dissect_http_message(tvbuff_t *tvb, int offset, packet_info *pinfo,
headers.content_type = NULL; /* content type not known yet */
headers.content_length = -1; /* content length not known yet */
CLEANUP_PUSH(cleanup_headers, &headers);
- while (tvb_offset_exists(tvb, offset)) {
+ while (tvb_reported_length_remaining(tvb, offset) != 0) {
/*
* Find the end of the line.
*/
- linelen = tvb_find_line_end(tvb, offset, -1, &next_offset,
+ linelen = tvb_find_line_end(tvb, offset,
+ tvb_ensure_length_remaining(tvb, offset), &next_offset,
FALSE);
+ if (linelen < 0)
+ return -1;
/*
* Get a buffer that refers to the line.
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;
}
}