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
This commit is contained in:
Guy Harris 2003-12-24 09:50:54 +00:00
parent 83b4a6158f
commit 3f05338503
2 changed files with 40 additions and 13 deletions

View File

@ -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.

View File

@ -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;
}
}