mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-12 12:58:30 +00:00
Merge "chan_pjsip: Fix PJSIP_MEDIA_OFFER dialplan function read."
This commit is contained in:
@@ -927,36 +927,40 @@ int pjsip_acf_dial_contacts_read(struct ast_channel *chan, const char *cmd, char
|
|||||||
static int media_offer_read_av(struct ast_sip_session *session, char *buf,
|
static int media_offer_read_av(struct ast_sip_session *session, char *buf,
|
||||||
size_t len, enum ast_media_type media_type)
|
size_t len, enum ast_media_type media_type)
|
||||||
{
|
{
|
||||||
int i, size = 0;
|
int idx;
|
||||||
|
size_t accum = 0;
|
||||||
|
|
||||||
for (i = 0; i < ast_format_cap_count(session->req_caps); i++) {
|
/* Note: buf is not terminated while the string is being built. */
|
||||||
struct ast_format *fmt = ast_format_cap_get_format(session->req_caps, i);
|
for (idx = 0; idx < ast_format_cap_count(session->req_caps); ++idx) {
|
||||||
|
struct ast_format *fmt;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
fmt = ast_format_cap_get_format(session->req_caps, idx);
|
||||||
if (ast_format_get_type(fmt) != media_type) {
|
if (ast_format_get_type(fmt) != media_type) {
|
||||||
ao2_ref(fmt, -1);
|
ao2_ref(fmt, -1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add one since we'll include a comma */
|
/* Add one for a comma or terminator */
|
||||||
size = strlen(ast_format_get_name(fmt)) + 1;
|
size = strlen(ast_format_get_name(fmt)) + 1;
|
||||||
if (len < size) {
|
if (len < size) {
|
||||||
ao2_ref(fmt, -1);
|
ao2_ref(fmt, -1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Append the format name */
|
||||||
|
strcpy(buf + accum, ast_format_get_name(fmt));/* Safe */
|
||||||
|
ao2_ref(fmt, -1);
|
||||||
|
|
||||||
|
accum += size;
|
||||||
len -= size;
|
len -= size;
|
||||||
|
|
||||||
/* no reason to use strncat here since we have already ensured buf has
|
/* The last comma on the built string will be set to the terminator. */
|
||||||
enough space, so strcat can be safely used */
|
buf[accum - 1] = ',';
|
||||||
strcat(buf, ast_format_get_name(fmt));
|
|
||||||
strcat(buf, ",");
|
|
||||||
|
|
||||||
ao2_ref(fmt, -1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size) {
|
/* Remove the trailing comma or terminate an empty buffer. */
|
||||||
/* remove the extra comma */
|
buf[accum ? accum - 1 : 0] = '\0';
|
||||||
buf[strlen(buf) - 1] = '\0';
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -996,6 +1000,9 @@ int pjsip_acf_media_offer_read(struct ast_channel *chan, const char *cmd, char *
|
|||||||
return media_offer_read_av(channel->session, buf, len, AST_MEDIA_TYPE_AUDIO);
|
return media_offer_read_av(channel->session, buf, len, AST_MEDIA_TYPE_AUDIO);
|
||||||
} else if (!strcmp(data, "video")) {
|
} else if (!strcmp(data, "video")) {
|
||||||
return media_offer_read_av(channel->session, buf, len, AST_MEDIA_TYPE_VIDEO);
|
return media_offer_read_av(channel->session, buf, len, AST_MEDIA_TYPE_VIDEO);
|
||||||
|
} else {
|
||||||
|
/* Ensure that the buffer is empty */
|
||||||
|
buf[0] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user