[asterisk-commits] twilson: branch 1.4 r295628 - /branches/1.4/channels/chan_sip.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Nov 19 14:53:41 CST 2010
Author: twilson
Date: Fri Nov 19 14:53:36 2010
New Revision: 295628
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=295628
Log:
Discard responses with more than one Via
This is not a perfect solution as headers that are joined via commas are not
detected. This is a parsing issue that to fix "correctly" would necessitate
a new SIP parser.
Review: https://reviewboard.asterisk.org/r/1019/
Modified:
branches/1.4/channels/chan_sip.c
Modified: branches/1.4/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.4/channels/chan_sip.c?view=diff&rev=295628&r1=295627&r2=295628
==============================================================================
--- branches/1.4/channels/chan_sip.c (original)
+++ branches/1.4/channels/chan_sip.c Fri Nov 19 14:53:36 2010
@@ -16788,6 +16788,9 @@
const char *cmd;
const char *cseq;
const char *useragent;
+ const char *via;
+ const char *callid;
+ int via_pos = 0;
int seqno;
int len;
int ignore = FALSE;
@@ -16799,13 +16802,19 @@
int oldmethod = p->method;
int acked = 0;
- /* Get Method and Cseq */
+ /* RFC 3261 - 8.1.1 A valid SIP request must contain To, From, CSeq, Call-ID and Via.
+ * 8.2.6.2 Response must have To, From, Call-ID CSeq, and Via related to the request,
+ * so we can check to make sure these fields exist for all requests and responses */
cseq = get_header(req, "Cseq");
cmd = req->header[0];
+ /* Save the via_pos so we can check later that responses only have 1 Via header */
+ via = __get_header(req, "Via", &via_pos);
+ /* This must exist already because we've called find_call by now */
+ callid = get_header(req, "Call-ID");
/* Must have Cseq */
- if (ast_strlen_zero(cmd) || ast_strlen_zero(cseq)) {
- ast_log(LOG_ERROR, "Missing Cseq. Dropping this SIP message, it's incomplete.\n");
+ if (ast_strlen_zero(cmd) || ast_strlen_zero(cseq) || ast_strlen_zero(via)) {
+ ast_log(LOG_ERROR, "Dropping this SIP message with Call-ID '%s', it's incomplete.\n", callid);
error = 1;
}
if (!error && sscanf(cseq, "%30d%n", &seqno, &len) != 1) {
@@ -16839,6 +16848,13 @@
}
if (respid <= 0) {
ast_log(LOG_WARNING, "Invalid SIP response code: '%d'\n", respid);
+ return 0;
+ }
+ /* RFC 3261 - 8.1.3.3 If more than one Via header field value is present in a reponse
+ * the UAC SHOULD discard the message. This is not perfect, as it will not catch multiple
+ * headers joined with a comma. Fixing that would pretty much involve writing a new parser */
+ if (!ast_strlen_zero(__get_header(req, "via", &via_pos))) {
+ ast_log(LOG_WARNING, "Misrouted SIP response '%s' with Call-ID '%s', too many vias\n", e, callid);
return 0;
}
if (!p->initreq.headers) {
More information about the asterisk-commits
mailing list