diff options
author | Guy Harris <guy@alum.mit.edu> | 2004-01-05 03:51:28 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2004-01-05 03:51:28 +0000 |
commit | 67f467ddd9a8592791eb1409b17074bb3053a1d8 (patch) | |
tree | b0ceb7e33f7f48f6d1709ddc933a3149083b96b7 | |
parent | db85655fb01b2c06437375408fda62f4f8d18204 (diff) |
For RTSP requests, we assume that, if there's no Content-Length header,
the request has no body.
When displaying the body, use the reported length remaining, not the
captured length remaining, as the length.
svn path=/trunk/; revision=9552
-rw-r--r-- | packet-rtsp.c | 61 |
1 files changed, 44 insertions, 17 deletions
diff --git a/packet-rtsp.c b/packet-rtsp.c index 7afbd849b6..d7c3250dda 100644 --- a/packet-rtsp.c +++ b/packet-rtsp.c @@ -4,7 +4,7 @@ * Jason Lango <jal@netapp.com> * Liberally copied from packet-http.c, by Guy Harris <guy@alum.mit.edu> * - * $Id: packet-rtsp.c,v 1.59 2004/01/01 23:36:50 guy Exp $ + * $Id: packet-rtsp.c,v 1.60 2004/01/05 03:51:28 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -480,6 +480,7 @@ dissect_rtspmessage(tvbuff_t *tvb, int offset, packet_info *pinfo, int orig_offset; int first_linelen, linelen; gboolean is_request_or_reply; + gboolean body_requires_content_len; gboolean saw_req_resp_or_header; guchar c; rtsp_type_t rtsp_type; @@ -521,6 +522,32 @@ dissect_rtspmessage(tvbuff_t *tvb, int offset, packet_info *pinfo, } } + /* + * RFC 2326 says that a content length must be specified + * in requests that have a body, although section 4.4 speaks + * of a server closing the connection indicating the end of + * a reply body. + * + * We assume that an absent content length in a request means + * that we don't have a body, and that an absent content length + * in a reply means that the reply body runs to the end of + * the connection. If the first line is neither, we assume + * that whatever follows a blank line should be treated as a + * body; there's not much else we can do, as we're jumping + * into the message in the middle. + * + * XXX - if there was no Content-Length entity header, we should + * accumulate all data until the end of the connection. + * That'd require that the TCP dissector call subdissectors + * for all frames with FIN, even if they contain no data, + * which would require subdissectors to deal intelligently + * with empty segments. + */ + if (rtsp_type == RTSP_REQUEST) + body_requires_content_len = TRUE; + else + body_requires_content_len = FALSE; + if (check_col(pinfo->cinfo, COL_PROTOCOL)) col_set_str(pinfo->cinfo, COL_PROTOCOL, "RTSP"); if (check_col(pinfo->cinfo, COL_INFO)) { @@ -776,21 +803,14 @@ dissect_rtspmessage(tvbuff_t *tvb, int offset, packet_info *pinfo, * If no content length was supplied (or if a bad content length * was supplied), the amount of data to be processed is the amount * of data remaining in the frame. - * - * XXX - RFC 2326 says that a content length must be specified - * in requests that have a body, although section 4.4 speaks - * of a server closing the connection indicating the end of - * a reply body. - * - * If there was no Content-Length entity header, we should - * accumulate all data until the end of the connection. - * That'd require that the TCP dissector call subdissectors - * for all frames with FIN, even if they contain no data, - * which would require subdissectors to deal intelligently - * with empty segments. */ datalen = tvb_length_remaining(tvb, offset); + reported_datalen = tvb_reported_length_remaining(tvb, offset); if (content_length != -1) { + /* + * Content length specified; display only that amount + * as payload. + */ if (datalen > content_length) datalen = content_length; @@ -808,11 +828,17 @@ dissect_rtspmessage(tvbuff_t *tvb, int offset, packet_info *pinfo, * "packet is malformed" (running past the reassembled * length). */ - reported_datalen = tvb_reported_length_remaining(tvb, offset); if (reported_datalen > content_length) reported_datalen = content_length; - } else - reported_datalen = -1; + } else { + /* + * No content length specified; if this message doesn't + * have a body if no content length is specified, process + * nothing as payload. + */ + if (body_requires_content_len) + datalen = 0; + } if (datalen > 0) { /* @@ -858,7 +884,8 @@ dissect_rtspmessage(tvbuff_t *tvb, int offset, packet_info *pinfo, datalen = 0; } else { proto_tree_add_text(rtsp_tree, tvb, offset, - datalen, "Data (%d bytes)", datalen); + datalen, "Data (%d bytes)", + reported_datalen); } } |