res_format_attr_*: Parameter Names are Case-Insensitive.

see RFC 4855:
parameter names are case-insensitive both in media type strings and
in the default mapping to the SDP a=fmtp attribute.

This change is required for H.263+ because some implementations are
known to use even mixed-case. This does not fix ASTERISK~29268 because
H.264 was not fixed. This approach here lowers/uppers both parameter
names and parameter values. H.264 needs a different approach because
one of its parameter values is not case-insensitive:
sprop-parameter-sets is Base64.

Change-Id: Idf2a73457be231647aed3c87b1da197afba86892
This commit is contained in:
Alexander Traud
2021-03-05 18:16:56 +01:00
committed by Joshua Colp
parent 4fc0e16838
commit 262473c6d9
8 changed files with 100 additions and 21 deletions

View File

@@ -31,10 +31,12 @@
#include "asterisk.h"
#include <ctype.h> /* for tolower */
#include "asterisk/module.h"
#include "asterisk/format.h"
#include "asterisk/strings.h" /* for ast_str_append */
#include "asterisk/utils.h" /* for ast_calloc, ast_free */
#include "asterisk/utils.h" /* for ast_free */
#include "asterisk/ilbc.h"
@@ -71,6 +73,7 @@ static int ilbc_clone(const struct ast_format *src, struct ast_format *dst)
static struct ast_format *ilbc_parse_sdp_fmtp(const struct ast_format *format, const char *attributes)
{
char *attribs = ast_strdupa(attributes), *attrib;
struct ast_format *cloned;
struct ilbc_attr *attr;
const char *kvp;
@@ -82,7 +85,12 @@ static struct ast_format *ilbc_parse_sdp_fmtp(const struct ast_format *format, c
}
attr = ast_format_get_attribute_data(cloned);
if ((kvp = strstr(attributes, "mode")) && sscanf(kvp, "mode=%30u", &val) == 1) {
/* lower-case everything, so we are case-insensitive */
for (attrib = attribs; *attrib; ++attrib) {
*attrib = tolower(*attrib);
} /* based on channels/chan_sip.c:process_a_sdp_image() */
if ((kvp = strstr(attribs, "mode")) && sscanf(kvp, "mode=%30u", &val) == 1) {
attr->mode = val;
} else {
attr->mode = 30; /* optional attribute; 30 is default value */