diff options
-rw-r--r-- | packet-http.c | 16 | ||||
-rw-r--r-- | req_resp_hdrs.c | 37 |
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; } } |