mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-30 02:26:23 +00:00
If we get a codec offer using a well-known payload type, but using it for another
codec that we don't know, Asterisk did not remove that codec from the list. With this patch, we remove the codec from audio and video rtp objects and deny it ever existed. Thanks to lasse for testing. (closes issue #11376) Reported by: lasse Patches: bug11376.txt uploaded by oej (license 306) Tested by: lasse git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@89630 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -5203,16 +5203,37 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req)
|
|||||||
continue;
|
continue;
|
||||||
} else if (sscanf(a, "rtpmap: %u %[^/]/", &codec, mimeSubtype) == 2) {
|
} else if (sscanf(a, "rtpmap: %u %[^/]/", &codec, mimeSubtype) == 2) {
|
||||||
/* We have a rtpmap to handle */
|
/* We have a rtpmap to handle */
|
||||||
if (debug)
|
int found = FALSE;
|
||||||
ast_verbose("Found description format %s for ID %d\n", mimeSubtype, codec);
|
/* We should propably check if this is an audio or video codec
|
||||||
found_rtpmap_codecs[last_rtpmap_codec] = codec;
|
so we know where to look */
|
||||||
last_rtpmap_codec++;
|
|
||||||
|
|
||||||
/* Note: should really look at the 'freq' and '#chans' params too */
|
/* Note: should really look at the 'freq' and '#chans' params too */
|
||||||
ast_rtp_set_rtpmap_type(newaudiortp, codec, "audio", mimeSubtype,
|
if(ast_rtp_set_rtpmap_type(newaudiortp, codec, "audio", mimeSubtype,
|
||||||
ast_test_flag(&p->flags[0], SIP_G726_NONSTANDARD) ? AST_RTP_OPT_G726_NONSTANDARD : 0);
|
ast_test_flag(&p->flags[0], SIP_G726_NONSTANDARD) ? AST_RTP_OPT_G726_NONSTANDARD : 0) != -1) {
|
||||||
if (p->vrtp)
|
if (debug)
|
||||||
ast_rtp_set_rtpmap_type(newvideortp, codec, "video", mimeSubtype, 0);
|
ast_verbose("Found audio description format %s for ID %d\n", mimeSubtype, codec);
|
||||||
|
found_rtpmap_codecs[last_rtpmap_codec] = codec;
|
||||||
|
last_rtpmap_codec++;
|
||||||
|
found = TRUE;
|
||||||
|
|
||||||
|
} else if (p->vrtp) {
|
||||||
|
if(ast_rtp_set_rtpmap_type(newvideortp, codec, "video", mimeSubtype, 0) != -1) {
|
||||||
|
if (debug)
|
||||||
|
ast_verbose("Found video description format %s for ID %d\n", mimeSubtype, codec);
|
||||||
|
found_rtpmap_codecs[last_rtpmap_codec] = codec;
|
||||||
|
last_rtpmap_codec++;
|
||||||
|
found = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
/* Remove this codec since it's an unknown media type for us */
|
||||||
|
/* XXX This is buggy since the media line for audio and video can have the
|
||||||
|
same numbers. We need to check as described above, but for testing this works... */
|
||||||
|
ast_rtp_unset_m_type(newaudiortp, codec);
|
||||||
|
ast_rtp_unset_m_type(newvideortp, codec);
|
||||||
|
if (debug)
|
||||||
|
ast_verbose("Found unknown media description format %s for ID %d\n", mimeSubtype, codec);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -170,8 +170,14 @@ void ast_rtp_pt_default(struct ast_rtp* rtp);
|
|||||||
/*! \brief Copy payload types between RTP structures */
|
/*! \brief Copy payload types between RTP structures */
|
||||||
void ast_rtp_pt_copy(struct ast_rtp *dest, struct ast_rtp *src);
|
void ast_rtp_pt_copy(struct ast_rtp *dest, struct ast_rtp *src);
|
||||||
|
|
||||||
|
/*! \brief Activate payload type */
|
||||||
void ast_rtp_set_m_type(struct ast_rtp* rtp, int pt);
|
void ast_rtp_set_m_type(struct ast_rtp* rtp, int pt);
|
||||||
void ast_rtp_set_rtpmap_type(struct ast_rtp* rtp, int pt,
|
|
||||||
|
/*! \brief clear payload type */
|
||||||
|
void ast_rtp_unset_m_type(struct ast_rtp* rtp, int pt);
|
||||||
|
|
||||||
|
/*! \brief Initiate payload type to a known MIME media type for a codec */
|
||||||
|
int ast_rtp_set_rtpmap_type(struct ast_rtp* rtp, int pt,
|
||||||
char *mimeType, char *mimeSubtype,
|
char *mimeType, char *mimeSubtype,
|
||||||
enum ast_rtp_options options);
|
enum ast_rtp_options options);
|
||||||
|
|
||||||
|
19
main/rtp.c
19
main/rtp.c
@@ -1640,23 +1640,36 @@ void ast_rtp_set_m_type(struct ast_rtp* rtp, int pt)
|
|||||||
ast_mutex_unlock(&rtp->bridge_lock);
|
ast_mutex_unlock(&rtp->bridge_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*! \brief remove setting from payload type list if the rtpmap header indicates
|
||||||
|
an unknown media type */
|
||||||
|
void ast_rtp_unset_m_type(struct ast_rtp* rtp, int pt)
|
||||||
|
{
|
||||||
|
ast_mutex_lock(&rtp->bridge_lock);
|
||||||
|
rtp->current_RTP_PT[pt].isAstFormat = 0;
|
||||||
|
rtp->current_RTP_PT[pt].code = 0;
|
||||||
|
ast_mutex_unlock(&rtp->bridge_lock);
|
||||||
|
}
|
||||||
|
|
||||||
/*! \brief Make a note of a RTP payload type (with MIME type) that was seen in
|
/*! \brief Make a note of a RTP payload type (with MIME type) that was seen in
|
||||||
* an SDP "a=rtpmap:" line.
|
* an SDP "a=rtpmap:" line.
|
||||||
|
* \return 0 if the MIME type was found and set, -1 if it wasn't found
|
||||||
*/
|
*/
|
||||||
void ast_rtp_set_rtpmap_type(struct ast_rtp *rtp, int pt,
|
int ast_rtp_set_rtpmap_type(struct ast_rtp *rtp, int pt,
|
||||||
char *mimeType, char *mimeSubtype,
|
char *mimeType, char *mimeSubtype,
|
||||||
enum ast_rtp_options options)
|
enum ast_rtp_options options)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
if (pt < 0 || pt > MAX_RTP_PT)
|
if (pt < 0 || pt > MAX_RTP_PT)
|
||||||
return; /* bogus payload type */
|
return -1; /* bogus payload type */
|
||||||
|
|
||||||
ast_mutex_lock(&rtp->bridge_lock);
|
ast_mutex_lock(&rtp->bridge_lock);
|
||||||
|
|
||||||
for (i = 0; i < sizeof(mimeTypes)/sizeof(mimeTypes[0]); ++i) {
|
for (i = 0; i < sizeof(mimeTypes)/sizeof(mimeTypes[0]); ++i) {
|
||||||
if (strcasecmp(mimeSubtype, mimeTypes[i].subtype) == 0 &&
|
if (strcasecmp(mimeSubtype, mimeTypes[i].subtype) == 0 &&
|
||||||
strcasecmp(mimeType, mimeTypes[i].type) == 0) {
|
strcasecmp(mimeType, mimeTypes[i].type) == 0) {
|
||||||
|
found = 1;
|
||||||
rtp->current_RTP_PT[pt] = mimeTypes[i].payloadType;
|
rtp->current_RTP_PT[pt] = mimeTypes[i].payloadType;
|
||||||
if ((mimeTypes[i].payloadType.code == AST_FORMAT_G726) &&
|
if ((mimeTypes[i].payloadType.code == AST_FORMAT_G726) &&
|
||||||
mimeTypes[i].payloadType.isAstFormat &&
|
mimeTypes[i].payloadType.isAstFormat &&
|
||||||
@@ -1668,7 +1681,7 @@ void ast_rtp_set_rtpmap_type(struct ast_rtp *rtp, int pt,
|
|||||||
|
|
||||||
ast_mutex_unlock(&rtp->bridge_lock);
|
ast_mutex_unlock(&rtp->bridge_lock);
|
||||||
|
|
||||||
return;
|
return (found ? 0 : -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Return the union of all of the codecs that were set by rtp_set...() calls
|
/*! \brief Return the union of all of the codecs that were set by rtp_set...() calls
|
||||||
|
Reference in New Issue
Block a user