Index: channels/chan_sip.c =================================================================== RCS file: /usr/cvsroot/asterisk/channels/chan_sip.c,v retrieving revision 1.616 retrieving revision 1.617 diff -u -r1.616 -r1.617 --- channels/chan_sip.c 5 Jan 2005 23:18:00 -0000 1.616 +++ channels/chan_sip.c 5 Jan 2005 23:43:34 -0000 1.617 @@ -2629,6 +2629,7 @@ struct hostent *hp; struct ast_hostent ahp; int codec; + int destiterator = 0; int iterator; int sendonly = 0; int x,y; @@ -2643,7 +2644,8 @@ return -1; } m = get_sdp(req, "m"); - c = get_sdp(req, "c"); + sdpLineNum_iterator_init(&destiterator); + c = get_sdp_iterate(&destiterator, req, "c"); if (ast_strlen_zero(m) || ast_strlen_zero(c)) { ast_log(LOG_WARNING, "Insufficient information for SDP (m = '%s', c = '%s')\n", m, c); return -1; @@ -2702,7 +2704,21 @@ } } } - + /* Check for Media-description-level-address for audio */ + if (pedanticsipchecking) { + c = get_sdp_iterate(&destiterator, req, "c"); + if (!ast_strlen_zero(c)) { + if (sscanf(c, "IN IP4 %256s", host) != 1) { + ast_log(LOG_WARNING, "Invalid secondary host in c= line, '%s'\n", c); + } else { + /* XXX This could block for a long time, and block the main thread! XXX */ + hp = ast_gethostbyname(host, &ahp); + if (!hp) { + ast_log(LOG_WARNING, "Unable to lookup host in secondary c= line, '%s'\n", c); + } + } + } + } /* RTP addresses and ports for audio and video */ sin.sin_family = AF_INET; memcpy(&sin.sin_addr, hp->h_addr, sizeof(sin.sin_addr)); @@ -2716,6 +2732,21 @@ ast_log(LOG_DEBUG,"Peer audio RTP is at port %s:%d\n",ast_inet_ntoa(iabuf, sizeof(iabuf), sin.sin_addr), ntohs(sin.sin_port)); } } + /* Check for Media-description-level-address for video */ + if (pedanticsipchecking) { + c = get_sdp_iterate(&destiterator, req, "c"); + if (!ast_strlen_zero(c)) { + if (sscanf(c, "IN IP4 %256s", host) != 1) { + ast_log(LOG_WARNING, "Invalid secondary host in c= line, '%s'\n", c); + } else { + /* XXX This could block for a long time, and block the main thread! XXX */ + hp = ast_gethostbyname(host, &ahp); + if (!hp) { + ast_log(LOG_WARNING, "Unable to lookup host in secondary c= line, '%s'\n", c); + } + } + } + } /* Setup video port number */ sin.sin_port = htons(vportno); if (p->vrtp && sin.sin_port) {