From 6aedcb664a44fbad48d35437c0633eb2d700053e Mon Sep 17 00:00:00 2001 From: Ethan Hugg Date: Mon, 8 Oct 2012 16:43:33 -0700 Subject: [PATCH] Bug 798873 - Signaling SDP construction uses flex_string r=jesup --- .../webrtc/signaling/src/sipcc/core/sdp/sdp.h | 4 +- .../signaling/src/sipcc/core/sdp/sdp_attr.c | 1495 ++++++----------- .../signaling/src/sipcc/core/sdp/sdp_main.c | 41 +- .../src/sipcc/core/sdp/sdp_private.h | 116 +- .../signaling/src/sipcc/core/sdp/sdp_token.c | 117 +- .../src/sipcc/core/sipstack/ccsip_sdp.c | 62 +- .../src/sipcc/core/sipstack/h/ccsip_sdp.h | 4 +- .../src/sipcc/cpr/common/cpr_string.c | 101 ++ .../src/sipcc/cpr/include/cpr_string.h | 48 + .../signaling/test/signaling_unittests.cpp | 2 +- 10 files changed, 779 insertions(+), 1211 deletions(-) diff --git a/media/webrtc/signaling/src/sipcc/core/sdp/sdp.h b/media/webrtc/signaling/src/sipcc/core/sdp/sdp.h index 91c3b62dffb..faf54272f84 100644 --- a/media/webrtc/signaling/src/sipcc/core/sdp/sdp.h +++ b/media/webrtc/signaling/src/sipcc/core/sdp/sdp.h @@ -53,8 +53,6 @@ #define SDP_CHOOSE_PARAM (-1) #define SDP_SESSION_LEVEL 0xFFFF -#define SDP_MAX_LEN 4096 - #define UNKNOWN_CRYPTO_SUITE "UNKNOWN_CRYPTO_SUITE" #define AES_CM_128_HMAC_SHA1_32 "AES_CM_128_HMAC_SHA1_32" #define AES_CM_128_HMAC_SHA1_80 "AES_CM_128_HMAC_SHA1_80" @@ -575,7 +573,7 @@ extern void *sdp_init_description(void *config_p); extern void sdp_debug(void *sdp_ptr, sdp_debug_e debug_type, tinybool debug_flag); extern void sdp_set_string_debug(void *sdp_ptr, char *debug_str); extern sdp_result_e sdp_parse(void *sdp_ptr, char **bufp, u16 len); -extern sdp_result_e sdp_build(void *sdp_ptr, char **bufp, u16 len); +extern sdp_result_e sdp_build(void *sdp_ptr, flex_string *fs); extern void *sdp_copy(void *sdp_ptr); extern sdp_result_e sdp_free_description(void *sdp_ptr); diff --git a/media/webrtc/signaling/src/sipcc/core/sdp/sdp_attr.c b/media/webrtc/signaling/src/sipcc/core/sdp/sdp_attr.c index 41309826d5d..087ae044599 100644 --- a/media/webrtc/signaling/src/sipcc/core/sdp/sdp_attr.c +++ b/media/webrtc/signaling/src/sipcc/core/sdp/sdp_attr.c @@ -47,6 +47,67 @@ #include "sdp_base64.h" #include "mozilla/Assertions.h" +/* + * Macro for sdp_build_attr_fmtp + * Adds name-value pair where value is char* + */ +#define FMTP_BUILD_STRING(condition, name, value) \ + if ((condition)) { \ + sdp_append_name_and_string(fs, (name), (value), semicolon); \ + semicolon = TRUE; \ + } + +/* + * Macro for sdp_build_attr_fmtp + * Adds name-value pair where value is unsigned + */ +#define FMTP_BUILD_UNSIGNED(condition, name, value) \ + if ((condition)) { \ + sdp_append_name_and_unsigned(fs, (name), (value), semicolon); \ + semicolon = TRUE; \ + } + +/* + * Macro for sdp_build_attr_fmtp + * Adds flag string on condition + */ +#define FMTP_BUILD_FLAG(condition, name) \ + if ((condition)) { \ + if (semicolon) { \ + flex_string_append(fs, ";"); \ + } \ + flex_string_append(fs, name); \ + semicolon = TRUE; \ + } + +/* + * Helper function for adding nv-pair where value is string. + */ +static void sdp_append_name_and_string(flex_string *fs, + const char *name, + const char *value, + tinybool semicolon) +{ + flex_string_sprintf(fs, "%s%s=%s", + semicolon ? ";" : "", + name, + value); +} + +/* + * Helper function for adding nv-pair where value is unsigned. + */ +static void sdp_append_name_and_unsigned(flex_string *fs, + const char *name, + unsigned int value, + tinybool semicolon) +{ + flex_string_sprintf(fs, "%s%s=%u", + semicolon ? ";" : "", + name, + value); +} + /* Function: sdp_parse_attribute * Description: Figure out the type of attribute and call the appropriate * parsing routine. If parsing errors are encountered, @@ -174,12 +235,11 @@ sdp_result_e sdp_parse_attribute (sdp_t *sdp_p, u16 level, const char *ptr) } /* Build all of the attributes defined for the specified level. */ -sdp_result_e sdp_build_attribute (sdp_t *sdp_p, u16 level, char **ptr, u16 len) +sdp_result_e sdp_build_attribute (sdp_t *sdp_p, u16 level, flex_string *fs) { sdp_attr_t *attr_p; sdp_mca_t *mca_p=NULL; sdp_result_e result; - char *endbuf_p; if (level == SDP_SESSION_LEVEL) { attr_p = sdp_p->sess_attrs_p; @@ -193,9 +253,6 @@ sdp_result_e sdp_build_attribute (sdp_t *sdp_p, u16 level, char **ptr, u16 len) /* Re-initialize the current capability number for this new level. */ sdp_p->cur_cap_num = 1; - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; - /* Build all of the attributes for this level. Note that if there * is a problem building an attribute, we don't fail but just ignore it.*/ while (attr_p != NULL) { @@ -205,25 +262,22 @@ sdp_result_e sdp_build_attribute (sdp_t *sdp_p, u16 level, char **ptr, u16 len) sdp_p->debug_str, attr_p->type); } } else { - result = sdp_attr[attr_p->type].build_func(sdp_p, attr_p, - ptr, (u16)(endbuf_p - *ptr)); - /* If we ran out of buffer space, though, we must error out */ - /* FIX - re-enable this assert after we check the results from snprintfs in the build_funcs */ - /* MOZ_ASSERT(endbuf_p - *ptr > 0); */ - if (endbuf_p - *ptr <= 0) - return (SDP_POTENTIAL_SDP_OVERFLOW); + result = sdp_attr[attr_p->type].build_func(sdp_p, attr_p, fs); - if (result == SDP_SUCCESS) { - if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) { - SDP_PRINT("%s Built a=%s attribute line", sdp_p->debug_str, - sdp_get_attr_name(attr_p->type)); - } + if (result != SDP_SUCCESS) { + SDP_ERROR("%s error building attribute %d", __FUNCTION__, result); + return result; + } + + if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) { + SDP_PRINT("%s Built a=%s attribute line", sdp_p->debug_str, + sdp_get_attr_name(attr_p->type)); } } attr_p = attr_p->next_p; } - return (SDP_SUCCESS); + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_simple_string (sdp_t *sdp_p, sdp_attr_t *attr_p, @@ -231,7 +285,8 @@ sdp_result_e sdp_parse_attr_simple_string (sdp_t *sdp_p, sdp_attr_t *attr_p, { sdp_result_e result; - ptr = sdp_getnextstrtok(ptr, attr_p->attr.string_val, sizeof(attr_p->attr.string_val), " \t", &result); + ptr = sdp_getnextstrtok(ptr, attr_p->attr.string_val, + sizeof(attr_p->attr.string_val), " \t", &result); if (result != SDP_SUCCESS) { if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) { @@ -251,14 +306,12 @@ sdp_result_e sdp_parse_attr_simple_string (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_simple_string (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - char *endbuf_p = *ptr + len; + flex_string_sprintf(fs, "a=%s:%s\r\n", sdp_attr[attr_p->type].name, + attr_p->attr.string_val); - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr),0), "a=%s:%s\r\n", sdp_attr[attr_p->type].name, - attr_p->attr.string_val); - - return (SDP_SUCCESS); + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_simple_u32 (sdp_t *sdp_p, sdp_attr_t *attr_p, @@ -285,14 +338,12 @@ sdp_result_e sdp_parse_attr_simple_u32 (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_simple_u32 (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - char *endbuf_p = *ptr + len; + flex_string_sprintf(fs, "a=%s:%u\r\n", sdp_attr[attr_p->type].name, + attr_p->attr.u32_val); - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr),0), "a=%s:%u\r\n", sdp_attr[attr_p->type].name, - attr_p->attr.u32_val); - - return (SDP_SUCCESS); + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_simple_bool (sdp_t *sdp_p, sdp_attr_t *attr_p, @@ -328,22 +379,12 @@ sdp_result_e sdp_parse_attr_simple_bool (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_simple_bool (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - char *endbuf_p; + flex_string_sprintf(fs, "a=%s:%s\r\n", sdp_attr[attr_p->type].name, + attr_p->attr.boolean_val ? "1" : "0"); - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; - - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr),0), "a=%s:", sdp_attr[attr_p->type].name); - len = endbuf_p - *ptr; - - if (attr_p->attr.boolean_val == TRUE) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr),0), "1\r\n"); - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr),0), "0\r\n"); - } - return (SDP_SUCCESS); + return SDP_SUCCESS; } /* @@ -366,7 +407,8 @@ sdp_result_e sdp_parse_attr_maxprate (sdp_t *sdp_p, sdp_attr_t *attr_p, { sdp_result_e result; - ptr = sdp_getnextstrtok(ptr, attr_p->attr.string_val, sizeof(attr_p->attr.string_val), " \t", &result); + ptr = sdp_getnextstrtok(ptr, attr_p->attr.string_val, + sizeof(attr_p->attr.string_val), " \t", &result); if (result != SDP_SUCCESS) { if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) { @@ -416,7 +458,8 @@ static void sdp_attr_fmtp_no_value(sdp_t *sdp, char *param_name) * */ -static void sdp_attr_fmtp_invalid_value(sdp_t *sdp, char *param_name, char* param_value) +static void sdp_attr_fmtp_invalid_value(sdp_t *sdp, char *param_name, + char* param_value) { if (sdp->debug_flag[SDP_DEBUG_WARNINGS]) { SDP_WARN("%s Warning: Invalid %s: %s specified for fmtp attribute", @@ -1919,596 +1962,186 @@ sdp_result_e sdp_parse_attr_fmtp (sdp_t *sdp_p, sdp_attr_t *attr_p, return (SDP_SUCCESS); } -sdp_result_e sdp_build_attr_fmtp (sdp_t *sdp_p, sdp_attr_t *attr_p, char **ptr, - u16 len) +sdp_result_e sdp_build_attr_fmtp (sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs) { - u16 event_id; - u32 mask; - u32 mapword; - u8 min = 0; - u8 max = 0; - tinybool range_start = FALSE; - tinybool range_end = FALSE; - tinybool semicolon = FALSE; - char *endbuf_p; - sdp_fmtp_t *fmtp_p; - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; + u16 event_id; + u32 mask; + u32 mapword; + u8 min = 0; + u8 max = 0; + tinybool range_start = FALSE; + tinybool range_end = FALSE; + tinybool semicolon = FALSE; + sdp_fmtp_t *fmtp_p; - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%u ", sdp_attr[attr_p->type].name, - attr_p->attr.fmtp.payload_num); - len = endbuf_p - *ptr; + flex_string_sprintf(fs, "a=%s:%u ", + sdp_attr[attr_p->type].name, + attr_p->attr.fmtp.payload_num); - fmtp_p = &(attr_p->attr.fmtp); - switch (fmtp_p->fmtp_format) { - case SDP_FMTP_MODE: - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "mode=%u",attr_p->attr.fmtp.mode); - break; - - case SDP_FMTP_CODEC_INFO: - if (fmtp_p->bitrate > 0) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "bitrate=%u",attr_p->attr.fmtp.bitrate); - semicolon = TRUE; - } - if (fmtp_p->annexa_required) { - if (fmtp_p->annexa) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";annexa=yes"); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "annexa=yes"); - semicolon = TRUE; - } - } else { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";annexa=no");; - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "annexa=no"); - semicolon = TRUE; - } - } - - } - - if (fmtp_p->annexb_required) { - if (fmtp_p->annexb) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";annexb=yes"); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "annexb=yes"); - semicolon = TRUE; - } - } else { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";annexb=no"); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "annexb=no"); - semicolon = TRUE; - } - } - } - - if (fmtp_p->qcif > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";QCIF=%u",attr_p->attr.fmtp.qcif); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "QCIF=%u",attr_p->attr.fmtp.qcif); - semicolon = TRUE; - } - } - - if (fmtp_p->cif> 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";CIF=%u",attr_p->attr.fmtp.cif); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "CIF=%u",attr_p->attr.fmtp.cif); - semicolon = TRUE; - } - } + fmtp_p = &(attr_p->attr.fmtp); + switch (fmtp_p->fmtp_format) { + case SDP_FMTP_MODE: + sdp_append_name_and_unsigned(fs, "mode", fmtp_p->mode, FALSE); + break; - if (fmtp_p->maxbr > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";MAXBR=%u",attr_p->attr.fmtp.maxbr); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "MAXBR=%u",attr_p->attr.fmtp.maxbr); - semicolon = TRUE; - } - } - - if (fmtp_p->sqcif > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";SQCIF=%u",attr_p->attr.fmtp.sqcif); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "SQCIF=%u",attr_p->attr.fmtp.sqcif); - semicolon = TRUE; - } - } + case SDP_FMTP_CODEC_INFO: + FMTP_BUILD_UNSIGNED(fmtp_p->bitrate > 0, "bitrate", fmtp_p->bitrate) - if (fmtp_p->cif4 > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";CIF4=%u",attr_p->attr.fmtp.cif4); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "CIF4=%u",attr_p->attr.fmtp.cif4); - semicolon = TRUE; - } - } + FMTP_BUILD_STRING(fmtp_p->annexa_required, + "annexa", (fmtp_p->annexa ? "yes" : "no")) - if (fmtp_p->cif16 > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";CIF16=%u",attr_p->attr.fmtp.cif16); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "CIF16=%u",attr_p->attr.fmtp.cif16); - semicolon = TRUE; - } - } + FMTP_BUILD_STRING(fmtp_p->annexb_required, + "annexb", (fmtp_p->annexa ? "yes" : "no")) - if ((fmtp_p->custom_x > 0) && (fmtp_p->custom_y > 0) && - (fmtp_p->custom_mpi > 0)) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";CUSTOM=%u,%u,%u", attr_p->attr.fmtp.custom_x, attr_p->attr.fmtp.custom_y, attr_p->attr.fmtp.custom_mpi); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "CUSTOM=%u,%u,%u", attr_p->attr.fmtp.custom_x, attr_p->attr.fmtp.custom_y, attr_p->attr.fmtp.custom_mpi); - semicolon = TRUE; - } - } + FMTP_BUILD_UNSIGNED(fmtp_p->qcif > 0, "QCIF", fmtp_p->qcif) - if ((fmtp_p->par_height > 0) && (fmtp_p->par_width > 0)) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";PAR=%u:%u", attr_p->attr.fmtp.par_width, attr_p->attr.fmtp.par_width); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "PAR=%u:%u", attr_p->attr.fmtp.par_width, attr_p->attr.fmtp.par_width); - semicolon = TRUE; - } - } + FMTP_BUILD_UNSIGNED(fmtp_p->cif > 0, "CIF", fmtp_p->cif) - if (fmtp_p->cpcf > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";CPCF=%u", attr_p->attr.fmtp.cpcf); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "CPCF=%u", attr_p->attr.fmtp.cpcf); - semicolon = TRUE; - } - } + FMTP_BUILD_UNSIGNED(fmtp_p->maxbr > 0, "MAXBR", fmtp_p->maxbr) - if (fmtp_p->bpp > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";BPP=%u", attr_p->attr.fmtp.bpp); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "BPP=%u", attr_p->attr.fmtp.bpp); - semicolon = TRUE; - } - } + FMTP_BUILD_UNSIGNED(fmtp_p->sqcif > 0, "SQCIF", fmtp_p->sqcif) - if (fmtp_p->hrd > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";HRD=%u", attr_p->attr.fmtp.hrd); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "HRD=%u", attr_p->attr.fmtp.hrd); - semicolon = TRUE; - } - } + FMTP_BUILD_UNSIGNED(fmtp_p->cif4 > 0, "CIF4", fmtp_p->cif4) - if (fmtp_p->profile >= 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";PROFILE=%u", - attr_p->attr.fmtp.profile); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "PROFILE=%u", - attr_p->attr.fmtp.profile); - semicolon = TRUE; - } - } + FMTP_BUILD_UNSIGNED(fmtp_p->cif16 > 0, "CIF16", fmtp_p->cif16) - if (fmtp_p->level >= 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";LEVEL=%u", - attr_p->attr.fmtp.level); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "LEVEL=%u", - attr_p->attr.fmtp.level); - semicolon = TRUE; - } - } + if ((fmtp_p->custom_x > 0) && (fmtp_p->custom_y > 0) && + (fmtp_p->custom_mpi > 0)) { + flex_string_sprintf(fs, "%sCUSTOM=%u,%u,%u", + semicolon ? ";" : "", + fmtp_p->custom_x, + fmtp_p->custom_y, + fmtp_p->custom_mpi); - if (fmtp_p->is_interlace) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";INTERLACE"); - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "INTERLACE"); - } - semicolon = TRUE; - } + semicolon = TRUE; + } - if (fmtp_p->annex_d) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";D"); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "D"); - semicolon = TRUE; - } - } + if ((fmtp_p->par_height > 0) && (fmtp_p->par_width > 0)) { + flex_string_sprintf(fs, "%sPAR=%u:%u", + semicolon ? ";" : "", + fmtp_p->par_width, + fmtp_p->par_width); - if (fmtp_p->annex_f) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";F"); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "F"); - semicolon = TRUE; - } - } - if (fmtp_p->annex_i) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";I"); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "I"); - semicolon = TRUE; - } - } - if (fmtp_p->annex_j) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";J"); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "J"); - semicolon = TRUE; - } - } - if (fmtp_p->annex_t) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";T"); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "T"); - semicolon = TRUE; - } - } - if (fmtp_p->annex_k_val >0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";K=%u", - attr_p->attr.fmtp.annex_k_val); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "K=%u", - attr_p->attr.fmtp.annex_k_val); - semicolon = TRUE; - } - } - if (fmtp_p->annex_n_val >0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";N=%u", - attr_p->attr.fmtp.annex_n_val); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "N=%u", - attr_p->attr.fmtp.annex_n_val); - semicolon = TRUE; - } - } - if ((fmtp_p->annex_p_val_picture_resize > 0) && (fmtp_p->annex_p_val_warp > 0)) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";P=%d,%d", - attr_p->attr.fmtp.annex_p_val_picture_resize, - attr_p->attr.fmtp.annex_p_val_warp); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "P=%d,%d", - attr_p->attr.fmtp.annex_p_val_picture_resize, - attr_p->attr.fmtp.annex_p_val_warp); - semicolon = TRUE; - } - } + semicolon = TRUE; + } - if (fmtp_p->profile_level_id[0] != '\0') { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";profile-level-id=%s", - attr_p->attr.fmtp.profile_level_id); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "profile-level-id=%s", - attr_p->attr.fmtp.profile_level_id); - semicolon = TRUE; - } - } - - if (fmtp_p->parameter_sets[0] != '\0') { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";sprop-parameter-sets=%s", - attr_p->attr.fmtp.parameter_sets); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "sprop-parameter-sets=%s", - attr_p->attr.fmtp.parameter_sets); - semicolon = TRUE; - } - } - - if (fmtp_p->packetization_mode < SDP_MAX_PACKETIZATION_MODE_VALUE ) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";packetization-mode=%u", - attr_p->attr.fmtp.packetization_mode); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "packetization-mode=%u", - attr_p->attr.fmtp.packetization_mode); - semicolon = TRUE; - } - } - if (fmtp_p->level_asymmetry_allowed <= SDP_MAX_LEVEL_ASYMMETRY_ALLOWED_VALUE ) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";level-asymmetry-allowed=%u", - attr_p->attr.fmtp.level_asymmetry_allowed); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "level-asymmetry-allowed=%u", - attr_p->attr.fmtp.level_asymmetry_allowed); - semicolon = TRUE; - } - } - if (fmtp_p->interleaving_depth > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";sprop-interleaving-depth=%u", - attr_p->attr.fmtp.interleaving_depth); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "sprop-interleaving-depth=%u", - attr_p->attr.fmtp.interleaving_depth); - semicolon = TRUE; - } - } - if (fmtp_p->flag & SDP_DEINT_BUF_REQ_FLAG) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";sprop-deint-buf-req=%u", - attr_p->attr.fmtp.deint_buf_req); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "sprop-deint-buf-req=%u", - attr_p->attr.fmtp.deint_buf_req); - semicolon = TRUE; - } - } - if (fmtp_p->max_don_diff > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";sprop-max-don-diff=%u", - attr_p->attr.fmtp.max_don_diff); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "sprop-max-don-diff=%u", - attr_p->attr.fmtp.max_don_diff); - semicolon = TRUE; - } - } + FMTP_BUILD_UNSIGNED(fmtp_p->cpcf > 0, "CPCF", fmtp_p->cpcf) - if (fmtp_p->flag & SDP_INIT_BUF_TIME_FLAG) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";sprop-init-buf-time=%u", - attr_p->attr.fmtp.init_buf_time); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "sprop-init-buf-time=%u", - attr_p->attr.fmtp.init_buf_time); - semicolon = TRUE; - } - } + FMTP_BUILD_UNSIGNED(fmtp_p->bpp > 0, "BPP", fmtp_p->bpp) + + FMTP_BUILD_UNSIGNED(fmtp_p->hrd > 0, "HRD", fmtp_p->hrd) + + FMTP_BUILD_UNSIGNED(fmtp_p->profile >= 0, "PROFILE", fmtp_p->profile) + + FMTP_BUILD_UNSIGNED(fmtp_p->level >= 0, "LEVEL", fmtp_p->level) + + FMTP_BUILD_FLAG(fmtp_p->is_interlace, "INTERLACE") + + FMTP_BUILD_FLAG(fmtp_p->annex_d, "D") + + FMTP_BUILD_FLAG(fmtp_p->annex_f, "F") + + FMTP_BUILD_FLAG(fmtp_p->annex_i, "I") + + FMTP_BUILD_FLAG(fmtp_p->annex_j, "J") + + FMTP_BUILD_FLAG(fmtp_p->annex_t, "T") + + FMTP_BUILD_UNSIGNED(fmtp_p->annex_k_val > 0, + "K", fmtp_p->annex_k_val) + + FMTP_BUILD_UNSIGNED(fmtp_p->annex_n_val > 0, + "N", fmtp_p->annex_n_val) + + if ((fmtp_p->annex_p_val_picture_resize > 0) && + (fmtp_p->annex_p_val_warp > 0)) { + flex_string_sprintf(fs, "%sP=%d:%d", + semicolon ? ";" : "", + fmtp_p->annex_p_val_picture_resize, + fmtp_p->annex_p_val_warp); + + semicolon = TRUE; + } + + FMTP_BUILD_STRING(strlen(fmtp_p->profile_level_id) > 0, + "profile-level-id", fmtp_p->profile_level_id) + + FMTP_BUILD_STRING(strlen(fmtp_p->parameter_sets) > 0, + "sprop-parameter-sets", fmtp_p->parameter_sets) + + FMTP_BUILD_UNSIGNED( + fmtp_p->packetization_mode < SDP_MAX_PACKETIZATION_MODE_VALUE, + "packetization-mode", fmtp_p->packetization_mode) + + FMTP_BUILD_UNSIGNED( + fmtp_p->level_asymmetry_allowed <= + SDP_MAX_LEVEL_ASYMMETRY_ALLOWED_VALUE, + "level-asymmetry-allowed", fmtp_p->level_asymmetry_allowed) + + FMTP_BUILD_UNSIGNED(fmtp_p->interleaving_depth > 0, + "sprop-interleaving-depth", fmtp_p->interleaving_depth) + + FMTP_BUILD_UNSIGNED(fmtp_p->flag & SDP_DEINT_BUF_REQ_FLAG, + "sprop-deint-buf-req", fmtp_p->deint_buf_req) + + FMTP_BUILD_UNSIGNED(fmtp_p->max_don_diff > 0, + "sprop-max-don-diff", fmtp_p->max_don_diff) + + FMTP_BUILD_UNSIGNED(fmtp_p->flag & SDP_INIT_BUF_TIME_FLAG, + "sprop-init-buf-time", fmtp_p->init_buf_time) + + FMTP_BUILD_UNSIGNED(fmtp_p->max_mbps > 0, + "max-mbps", fmtp_p->max_mbps) - if (fmtp_p->max_mbps > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";max-mbps=%u", - attr_p->attr.fmtp.max_mbps); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "max-mbps=%u", - attr_p->attr.fmtp.max_mbps); - semicolon = TRUE; - } - } + FMTP_BUILD_UNSIGNED(fmtp_p->max_fs > 0, "max-fs", fmtp_p->max_fs) + + FMTP_BUILD_UNSIGNED(fmtp_p->max_cpb > 0, "max-cpb", fmtp_p->max_cpb) + + FMTP_BUILD_UNSIGNED(fmtp_p->max_dpb > 0, "max-dpb", fmtp_p->max_dpb) + + FMTP_BUILD_UNSIGNED(fmtp_p->max_br > 0, "max-br", fmtp_p->max_br) + + FMTP_BUILD_UNSIGNED(fmtp_p->redundant_pic_cap > 0, + "redundant-pic-cap", fmtp_p->redundant_pic_cap) + + FMTP_BUILD_UNSIGNED(fmtp_p->flag & SDP_DEINT_BUF_CAP_FLAG, + "deint-buf-cap", fmtp_p->deint_buf_cap) + + FMTP_BUILD_UNSIGNED(fmtp_p->flag & SDP_MAX_RCMD_NALU_SIZE_FLAG, + "max-rcmd-naFMTP_BUILD_FLlu-size", fmtp_p->max_rcmd_nalu_size) + + FMTP_BUILD_UNSIGNED(fmtp_p->parameter_add > 0, + "parameter-add", fmtp_p->parameter_add) + + FMTP_BUILD_UNSIGNED(fmtp_p->maxaveragebitrate > 0, + "maxaveragebitrate", fmtp_p->maxaveragebitrate) + + FMTP_BUILD_UNSIGNED(fmtp_p->usedtx <= 1, "usedtx", fmtp_p->usedtx) + + FMTP_BUILD_UNSIGNED(fmtp_p->stereo <= 1, "stereo", fmtp_p->stereo) + + FMTP_BUILD_UNSIGNED(fmtp_p->useinbandfec <= 1, + "useinbandfec", fmtp_p->useinbandfec) + + FMTP_BUILD_STRING(strlen(fmtp_p->maxcodedaudiobandwidth) > 0, + "maxcodedaudiobandwidth", fmtp_p->maxcodedaudiobandwidth) + + FMTP_BUILD_UNSIGNED(fmtp_p->cbr <= 1, "cbr", fmtp_p->cbr) + + break; + + case SDP_FMTP_DATACHANNEL: + FMTP_BUILD_STRING(strlen(fmtp_p->protocol) > 0, + "protocol", fmtp_p->protocol) + + FMTP_BUILD_UNSIGNED(fmtp_p->streams > 0, "streams", fmtp_p->streams) + + break; - if (fmtp_p->max_fs > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";max-fs=%u", - attr_p->attr.fmtp.max_fs); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "max-fs=%u", - attr_p->attr.fmtp.max_fs); - semicolon = TRUE; - } - } - - if (fmtp_p->max_cpb > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";max-cpb=%u", - attr_p->attr.fmtp.max_cpb); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "max-cpb=%u", - attr_p->attr.fmtp.max_cpb); - semicolon = TRUE; - } - } - - if (fmtp_p->max_dpb > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";max-dpb=%u", - attr_p->attr.fmtp.max_dpb); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "max-dpb=%u", - attr_p->attr.fmtp.max_dpb); - semicolon = TRUE; - } - } - - if (fmtp_p->max_br > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";max-br=%u", - attr_p->attr.fmtp.max_br); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "max-br=%u", - attr_p->attr.fmtp.max_br); - semicolon = TRUE; - } - } - - if (fmtp_p->redundant_pic_cap > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";redundant-pic-cap=%u", - attr_p->attr.fmtp.redundant_pic_cap); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "redundant-pic-cap=%u", - attr_p->attr.fmtp.redundant_pic_cap); - semicolon = TRUE; - } - } - - if (fmtp_p->flag & SDP_DEINT_BUF_CAP_FLAG) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";deint-buf-cap=%u", - attr_p->attr.fmtp.deint_buf_cap); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "deint-buf-cap=%u", - attr_p->attr.fmtp.deint_buf_cap); - semicolon = TRUE; - } - } - - if (fmtp_p->flag & SDP_MAX_RCMD_NALU_SIZE_FLAG) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";max-rcmd-nalu-size=%u", - attr_p->attr.fmtp.max_rcmd_nalu_size); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "max-rcmd-nalu-size=%u", - attr_p->attr.fmtp.max_rcmd_nalu_size); - semicolon = TRUE; - } - } - - if (fmtp_p->parameter_add == FALSE) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";parameter-add=%u", - attr_p->attr.fmtp.parameter_add); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "parameter-add=%u", - attr_p->attr.fmtp.parameter_add); - semicolon = TRUE; - } - } - - if (fmtp_p->maxaveragebitrate > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";maxaveragebitrate=%u",attr_p->attr.fmtp.maxaveragebitrate); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "maxaveragebitrate=%u",attr_p->attr.fmtp.maxaveragebitrate); - semicolon = TRUE; - } - } - - if (fmtp_p->usedtx <= 1) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";usedtx=%u",attr_p->attr.fmtp.usedtx); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "usedtx=%u",attr_p->attr.fmtp.usedtx); - semicolon = TRUE; - } - } - - if (fmtp_p->stereo <= 1) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";stereo=%u",attr_p->attr.fmtp.stereo); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "stereo=%u",attr_p->attr.fmtp.stereo); - semicolon = TRUE; - } - } - - if (fmtp_p->useinbandfec <= 1) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";useinbandfec=%u",attr_p->attr.fmtp.useinbandfec); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "useinbandfec=%u",attr_p->attr.fmtp.useinbandfec); - semicolon = TRUE; - } - } - - if (fmtp_p->maxcodedaudiobandwidth[0] != '\0') { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";maxcodedaudiobandwidth=%s", - attr_p->attr.fmtp.maxcodedaudiobandwidth); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "maxcodedaudiobandwidth=%s", - attr_p->attr.fmtp.maxcodedaudiobandwidth); - semicolon = TRUE; - } - } - - if (fmtp_p->cbr <= 1) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";cbr=%u",attr_p->attr.fmtp.cbr); - semicolon = TRUE; - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "cbr=%u",attr_p->attr.fmtp.cbr); - semicolon = TRUE; - } - } - - break; - - case SDP_FMTP_DATACHANNEL: - - if (fmtp_p->protocol[0] != '\0') { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";protocol=%s", - attr_p->attr.fmtp.protocol); - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "protocol=%s", - attr_p->attr.fmtp.protocol); - semicolon = TRUE; - } - } - - if (fmtp_p->streams > 0) { - if (semicolon) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ";streams=%u",attr_p->attr.fmtp.streams); - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "streams=%u",attr_p->attr.fmtp.streams); - semicolon = TRUE; - } - } - - break; - - case SDP_FMTP_NTE: - default: - break; - } + case SDP_FMTP_NTE: + default: + break; + } for(event_id = 0, mapword = 0, mask = SDP_NE_BIT_0; event_id <= fmtp_p->maxval; @@ -2545,21 +2178,21 @@ sdp_result_e sdp_build_attr_fmtp (sdp_t *sdp_p, sdp_attr_t *attr_p, char **ptr, if (range_end) { range_start = range_end = FALSE; - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%u", min); + flex_string_sprintf(fs, "%u", min); if (min != max) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "-%u", max); + flex_string_sprintf(fs, "-%u", max); } if (max != fmtp_p->maxval) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ","); + flex_string_append(fs, ","); } } } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\r\n"); + flex_string_append(fs, "\r\n"); - return (SDP_SUCCESS); + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_direction (sdp_t *sdp_p, sdp_attr_t *attr_p, @@ -2574,15 +2207,11 @@ sdp_result_e sdp_parse_attr_direction (sdp_t *sdp_p, sdp_attr_t *attr_p, return (SDP_SUCCESS); } -sdp_result_e sdp_build_attr_direction (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) +sdp_result_e sdp_build_attr_direction (sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs) { - char *endbuf_p = *ptr + len; + flex_string_sprintf(fs, "a=%s\r\n", sdp_get_attr_name(attr_p->type)); - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s\r\n", - sdp_get_attr_name(attr_p->type)); - - return (SDP_SUCCESS); + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_qos (sdp_t *sdp_p, sdp_attr_t *attr_p, @@ -2672,26 +2301,14 @@ sdp_result_e sdp_parse_attr_qos (sdp_t *sdp_p, sdp_attr_t *attr_p, return (SDP_SUCCESS); } -sdp_result_e sdp_build_attr_qos (sdp_t *sdp_p, sdp_attr_t *attr_p, char **ptr, - u16 len) +sdp_result_e sdp_build_attr_qos (sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs) { - char *endbuf_p; + flex_string_sprintf(fs, "a=%s:%s %s%s\r\n", sdp_attr[attr_p->type].name, + sdp_get_qos_strength_name(attr_p->attr.qos.strength), + sdp_get_qos_direction_name(attr_p->attr.qos.direction), + attr_p->attr.qos.confirm ? " confirm" : ""); - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; - - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s %s", - sdp_attr[attr_p->type].name, - sdp_get_qos_strength_name(attr_p->attr.qos.strength), - sdp_get_qos_direction_name(attr_p->attr.qos.direction)); - - if (attr_p->attr.qos.confirm == TRUE) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), " confirm\r\n"); - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\r\n"); - } - - return (SDP_SUCCESS); + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_curr (sdp_t *sdp_p, sdp_attr_t *attr_p, @@ -2784,23 +2401,15 @@ sdp_result_e sdp_parse_attr_curr (sdp_t *sdp_p, sdp_attr_t *attr_p, return (SDP_SUCCESS); } -sdp_result_e sdp_build_attr_curr (sdp_t *sdp_p, sdp_attr_t *attr_p, char **ptr, - u16 len) +sdp_result_e sdp_build_attr_curr (sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs) { - char *endbuf_p; + flex_string_sprintf(fs, "a=%s:%s %s %s\r\n", + sdp_attr[attr_p->type].name, + sdp_get_curr_type_name(attr_p->attr.curr.type), + sdp_get_qos_status_type_name(attr_p->attr.curr.status_type), + sdp_get_qos_direction_name(attr_p->attr.curr.direction)); - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; - - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s %s %s", - sdp_attr[attr_p->type].name, - sdp_get_curr_type_name(attr_p->attr.curr.type), - sdp_get_qos_status_type_name(attr_p->attr.curr.status_type), - sdp_get_qos_direction_name(attr_p->attr.curr.direction)); - - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\r\n"); - - return (SDP_SUCCESS); + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_des (sdp_t *sdp_p, sdp_attr_t *attr_p, @@ -2921,24 +2530,16 @@ sdp_result_e sdp_parse_attr_des (sdp_t *sdp_p, sdp_attr_t *attr_p, } -sdp_result_e sdp_build_attr_des (sdp_t *sdp_p, sdp_attr_t *attr_p, char **ptr, - u16 len) +sdp_result_e sdp_build_attr_des (sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs) { - char *endbuf_p; + flex_string_sprintf(fs, "a=%s:%s %s %s %s\r\n", + sdp_attr[attr_p->type].name, + sdp_get_curr_type_name((sdp_curr_type_e)attr_p->attr.des.type), + sdp_get_qos_strength_name(attr_p->attr.des.strength), + sdp_get_qos_status_type_name(attr_p->attr.des.status_type), + sdp_get_qos_direction_name(attr_p->attr.des.direction)); - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; - - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s %s %s %s", - sdp_attr[attr_p->type].name, - sdp_get_curr_type_name((sdp_curr_type_e)attr_p->attr.des.type), - sdp_get_qos_strength_name(attr_p->attr.des.strength), - sdp_get_qos_status_type_name(attr_p->attr.des.status_type), - sdp_get_qos_direction_name(attr_p->attr.des.direction)); - - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\r\n"); - - return (SDP_SUCCESS); + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_conf (sdp_t *sdp_p, sdp_attr_t *attr_p, @@ -3031,23 +2632,15 @@ sdp_result_e sdp_parse_attr_conf (sdp_t *sdp_p, sdp_attr_t *attr_p, return (SDP_SUCCESS); } -sdp_result_e sdp_build_attr_conf (sdp_t *sdp_p, sdp_attr_t *attr_p, char **ptr, - u16 len) +sdp_result_e sdp_build_attr_conf (sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs) { - char *endbuf_p; + flex_string_sprintf(fs, "a=%s:%s %s %s\r\n", + sdp_attr[attr_p->type].name, + sdp_get_conf_type_name(attr_p->attr.conf.type), + sdp_get_qos_status_type_name(attr_p->attr.conf.status_type), + sdp_get_qos_direction_name(attr_p->attr.conf.direction)); - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; - - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s %s %s", - sdp_attr[attr_p->type].name, - sdp_get_conf_type_name(attr_p->attr.conf.type), - sdp_get_qos_status_type_name(attr_p->attr.conf.status_type), - sdp_get_qos_direction_name(attr_p->attr.conf.direction)); - - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\r\n"); - - return (SDP_SUCCESS); + return SDP_SUCCESS; } /* @@ -3139,27 +2732,24 @@ sdp_result_e sdp_parse_attr_transport_map (sdp_t *sdp_p, sdp_attr_t *attr_p, * rtpmap field in the sdp_attr_t is used for both mappings. */ sdp_result_e sdp_build_attr_transport_map (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - char *endbuf_p; + if (attr_p->attr.transport_map.num_chan == 1) { + flex_string_sprintf(fs, "a=%s:%u %s/%u\r\n", + sdp_attr[attr_p->type].name, + attr_p->attr.transport_map.payload_num, + attr_p->attr.transport_map.encname, + attr_p->attr.transport_map.clockrate); + } else { + flex_string_sprintf(fs, "a=%s:%u %s/%u/%u\r\n", + sdp_attr[attr_p->type].name, + attr_p->attr.transport_map.payload_num, + attr_p->attr.transport_map.encname, + attr_p->attr.transport_map.clockrate, + attr_p->attr.transport_map.num_chan); + } - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; - - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%u %s/%u", - sdp_attr[attr_p->type].name, - attr_p->attr.transport_map.payload_num, - attr_p->attr.transport_map.encname, - attr_p->attr.transport_map.clockrate); - - if (attr_p->attr.transport_map.num_chan != 1) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "/%u\r\n", - attr_p->attr.transport_map.num_chan); - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\r\n"); - } - - return (SDP_SUCCESS); + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_subnet (sdp_t *sdp_p, sdp_attr_t *attr_p, @@ -3280,24 +2870,24 @@ sdp_result_e sdp_parse_attr_subnet (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_subnet (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - char *endbuf_p; + if (attr_p->attr.subnet.prefix == SDP_INVALID_VALUE) { + flex_string_sprintf(fs, "a=%s:%s %s %s\r\n", + sdp_attr[attr_p->type].name, + sdp_get_network_name(attr_p->attr.subnet.nettype), + sdp_get_address_name(attr_p->attr.subnet.addrtype), + attr_p->attr.subnet.addr); + } else { + flex_string_sprintf(fs, "a=%s:%s %s %s/%u\r\n", + sdp_attr[attr_p->type].name, + sdp_get_network_name(attr_p->attr.subnet.nettype), + sdp_get_address_name(attr_p->attr.subnet.addrtype), + attr_p->attr.subnet.addr, + (ushort)attr_p->attr.subnet.prefix); + } - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; - - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s %s %s", sdp_attr[attr_p->type].name, - sdp_get_network_name(attr_p->attr.subnet.nettype), - sdp_get_address_name(attr_p->attr.subnet.addrtype), - attr_p->attr.subnet.addr); - - if (attr_p->attr.subnet.prefix != SDP_INVALID_VALUE) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "/%u", (ushort)attr_p->attr.subnet.prefix); - } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\r\n"); - - return (SDP_SUCCESS); + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_t38_ratemgmt (sdp_t *sdp_p, sdp_attr_t *attr_p, @@ -3335,15 +2925,13 @@ sdp_result_e sdp_parse_attr_t38_ratemgmt (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_t38_ratemgmt (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - char *endbuf_p = *ptr + len; + flex_string_sprintf(fs, "a=%s:%s\r\n", + sdp_attr[attr_p->type].name, + sdp_get_t38_ratemgmt_name(attr_p->attr.t38ratemgmt)); - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s\r\n", - sdp_attr[attr_p->type].name, - sdp_get_t38_ratemgmt_name(attr_p->attr.t38ratemgmt)); - - return (SDP_SUCCESS); + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_t38_udpec (sdp_t *sdp_p, sdp_attr_t *attr_p, @@ -3381,15 +2969,13 @@ sdp_result_e sdp_parse_attr_t38_udpec (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_t38_udpec (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - char *endbuf_p = *ptr + len; + flex_string_sprintf(fs, "a=%s:%s\r\n", + sdp_attr[attr_p->type].name, + sdp_get_t38_udpec_name(attr_p->attr.t38udpec)); - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s\r\n", - sdp_attr[attr_p->type].name, - sdp_get_t38_udpec_name(attr_p->attr.t38udpec)); - - return (SDP_SUCCESS); + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_pc_codec (sdp_t *sdp_p, sdp_attr_t *attr_p, @@ -3429,24 +3015,19 @@ sdp_result_e sdp_parse_attr_pc_codec (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_pc_codec (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - u16 i; - char *endbuf_p; + int i; - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; + flex_string_sprintf(fs, "a=%s: ", sdp_attr[attr_p->type].name); - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s: ", sdp_attr[attr_p->type].name); + for (i=0; i < attr_p->attr.pccodec.num_payloads; i++) { + flex_string_sprintf(fs, "%u ", attr_p->attr.pccodec.payload_type[i]); + } - for (i=0; i < attr_p->attr.pccodec.num_payloads; i++) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%u ", - attr_p->attr.pccodec.payload_type[i]); - } + flex_string_append(fs, "\r\n"); - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\r\n"); - - return (SDP_SUCCESS); + return SDP_SUCCESS; } @@ -3595,17 +3176,12 @@ sdp_result_e sdp_parse_attr_cap (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_cap (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { u16 i, j; - char *endbuf_p; sdp_mca_t *cap_p; - sdp_result_e result; sdp_media_profiles_t *profile_p; - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; - /* Get a pointer to the capability structure. */ cap_p = attr_p->attr.cap_p; @@ -3633,11 +3209,8 @@ sdp_result_e sdp_build_attr_cap (sdp_t *sdp_p, sdp_attr_t *attr_p, return (SDP_SUCCESS); } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s: %u ", sdp_attr[attr_p->type].name, - sdp_p->cur_cap_num); - - /* Build the media type */ - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%s ", sdp_get_media_name(cap_p->media)); + flex_string_sprintf(fs, "a=%s: %u %s ", sdp_attr[attr_p->type].name, + sdp_p->cur_cap_num, sdp_get_media_name(cap_p->media)); /* If the X-cap line has AAL2 profiles, build them differently. */ if ((cap_p->transport == SDP_TRANSPORT_AAL2_ITU) || @@ -3645,45 +3218,44 @@ sdp_result_e sdp_build_attr_cap (sdp_t *sdp_p, sdp_attr_t *attr_p, (cap_p->transport == SDP_TRANSPORT_AAL2_CUSTOM)) { profile_p = cap_p->media_profiles_p; for (i=0; i < profile_p->num_profiles; i++) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%s", + flex_string_sprintf(fs, "%s", sdp_get_transport_name(profile_p->profile[i])); for (j=0; j < profile_p->num_payloads[i]; j++) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), " %u", + flex_string_sprintf(fs, " %u", profile_p->payload_type[i][j]); } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), " "); + flex_string_append(fs, " "); } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\n"); + + flex_string_append(fs, "\r\n"); if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) { SDP_PRINT("%s Built m= media line", sdp_p->debug_str); } - return (SDP_SUCCESS); + return SDP_SUCCESS; } /* Build the transport name */ - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%s", - sdp_get_transport_name(cap_p->transport)); + flex_string_sprintf(fs, "%s", sdp_get_transport_name(cap_p->transport)); /* Build the format lists */ for (i=0; i < cap_p->num_payloads; i++) { if (cap_p->payload_indicator[i] == SDP_PAYLOAD_ENUM) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), " %s", + flex_string_sprintf(fs, " %s", sdp_get_payload_name((sdp_payload_e)cap_p->payload_type[i])); } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), " %u", cap_p->payload_type[i]); + flex_string_sprintf(fs, " %u", cap_p->payload_type[i]); } } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\r\n"); + + flex_string_append(fs, "\r\n"); /* Increment the current capability number for the next X-cap/cdsc attr. */ sdp_p->cur_cap_num += cap_p->num_payloads; sdp_p->last_cap_type = attr_p->type; /* Build any X-cpar/cpar attributes associated with this X-cap/cdsc line. */ - result = sdp_build_attr_cpar(sdp_p, cap_p->media_attrs_p, ptr, len); - - return (result); + return sdp_build_attr_cpar(sdp_p, cap_p->media_attrs_p, fs); } @@ -3846,9 +3418,8 @@ sdp_result_e sdp_parse_attr_cpar (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_cpar (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - char *endbuf_p; sdp_result_e result; const char *cpar_name; @@ -3863,23 +3434,14 @@ sdp_result_e sdp_build_attr_cpar (sdp_t *sdp_p, sdp_attr_t *attr_p, cpar_name = sdp_get_attr_name(SDP_ATTR_X_CPAR); } - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; - while (attr_p != NULL) { if (attr_p->type >= SDP_MAX_ATTR_TYPES) { SDP_WARN("%s Invalid attribute type to build (%u)", sdp_p->debug_str, attr_p->type); } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s: ", cpar_name); + flex_string_sprintf(fs, "a=%s: ", cpar_name); - result = sdp_attr[attr_p->type].build_func(sdp_p, attr_p, - ptr, (u16)(endbuf_p - *ptr)); - /* If we ran out of buffer space, though, we must error out */ - /* FIX - re-enable this assert after we check the result from snprintf above */ - /* MOZ_ASSERT(endbuf_p - *ptr > 0); */ - if (endbuf_p - *ptr <= 0) - return (SDP_POTENTIAL_SDP_OVERFLOW); + result = sdp_attr[attr_p->type].build_func(sdp_p, attr_p, fs); if (result == SDP_SUCCESS) { if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) { @@ -3935,17 +3497,13 @@ sdp_result_e sdp_parse_attr_rtr (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_rtr (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - char *endbuf_p = *ptr + len; + flex_string_sprintf(fs, "a=%s%s\r\n", + sdp_attr[attr_p->type].name, + attr_p->attr.rtr.confirm ? ":confirm" : ""); - if (attr_p->attr.rtr.confirm){ - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s\r\n", sdp_attr[attr_p->type].name, - "confirm"); - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s\r\n", sdp_attr[attr_p->type].name); - } - return (SDP_SUCCESS); + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_comediadir (sdp_t *sdp_p, sdp_attr_t *attr_p, @@ -4101,20 +3659,13 @@ sdp_result_e sdp_parse_attr_comediadir (sdp_t *sdp_p, sdp_attr_t *attr_p, sdp_result_e sdp_build_attr_comediadir (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - char *endbuf_p; + flex_string_sprintf(fs, "a=%s:%s\r\n", + sdp_attr[attr_p->type].name, + sdp_get_mediadir_role_name(attr_p->attr.comediadir.role)); - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s", - sdp_attr[attr_p->type].name, - sdp_get_mediadir_role_name(attr_p->attr. - comediadir.role)); - - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\r\n"); - - return (SDP_SUCCESS); + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_silencesupp (sdp_t *sdp_p, sdp_attr_t *attr_p, @@ -4257,38 +3808,32 @@ sdp_result_e sdp_parse_attr_silencesupp (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_silencesupp (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - char *endbuf_p; + char temp_timer_string[11]; + char temp_fxnslevel_string[11]; - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; + if (attr_p->attr.silencesupp.timer_null) { + snprintf(temp_timer_string, sizeof(temp_timer_string), "-"); + } else { + snprintf(temp_timer_string, sizeof(temp_timer_string), "%u", attr_p->attr.silencesupp.timer); + } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s ", - sdp_attr[attr_p->type].name, - (attr_p->attr.silencesupp.enabled ? "on" : "off")); + if (attr_p->attr.silencesupp.fxnslevel_null) { + snprintf(temp_fxnslevel_string, sizeof(temp_fxnslevel_string), "-"); + } else { + snprintf(temp_fxnslevel_string, sizeof(temp_fxnslevel_string), "%u", attr_p->attr.silencesupp.fxnslevel); + } - if (attr_p->attr.silencesupp.timer_null) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "-"); - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%u", attr_p->attr.silencesupp.timer); - } + flex_string_sprintf(fs, "a=%s:%s %s %s %s %s\r\n", + sdp_attr[attr_p->type].name, + (attr_p->attr.silencesupp.enabled ? "on" : "off"), + temp_timer_string, + sdp_get_silencesupp_pref_name(attr_p->attr.silencesupp.pref), + sdp_get_silencesupp_siduse_name(attr_p->attr.silencesupp.siduse), + temp_fxnslevel_string); - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), " %s %s ", - sdp_get_silencesupp_pref_name( - attr_p->attr.silencesupp.pref), - sdp_get_silencesupp_siduse_name( - attr_p->attr.silencesupp.siduse)); - - if (attr_p->attr.silencesupp.fxnslevel_null) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "-"); - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%u", attr_p->attr.silencesupp.fxnslevel); - } - - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\r\n"); - - return (SDP_SUCCESS); + return SDP_SUCCESS; } /* @@ -4330,7 +3875,7 @@ tinybool sdp_parse_context_crypto_suite(char * str, sdp_attr_t *attr_p, sdp_t * sdp_result_e sdp_build_attr_srtpcontext (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { #define MAX_BASE64_ENCODE_SIZE_BYTES 60 int output_len = MAX_BASE64_ENCODE_SIZE_BYTES; @@ -4339,7 +3884,6 @@ sdp_result_e sdp_build_attr_srtpcontext (sdp_t *sdp_p, sdp_attr_t *attr_p, unsigned char base64_encoded_data[MAX_BASE64_ENCODE_SIZE_BYTES]; unsigned char base64_encoded_input[MAX_BASE64_ENCODE_SIZE_BYTES]; base64_result_t status; - char *endbuf_p = *ptr + len; output_len = MAX_BASE64_ENCODE_SIZE_BYTES; @@ -4360,12 +3904,12 @@ sdp_result_e sdp_build_attr_srtpcontext (sdp_t *sdp_p, sdp_attr_t *attr_p, *(base64_encoded_data + output_len) = '\0'; - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s inline:%s||\r\n", - sdp_attr[attr_p->type].name, - sdp_srtp_context_crypto_suite[attr_p->attr.srtp_context.suite].name, - base64_encoded_data); + flex_string_sprintf(fs, "a=%s:%s inline:%s||\r\n", + sdp_attr[attr_p->type].name, + sdp_srtp_context_crypto_suite[attr_p->attr.srtp_context.suite].name, + base64_encoded_data); - return (SDP_SUCCESS); + return SDP_SUCCESS; } /* @@ -4437,41 +3981,31 @@ sdp_result_e sdp_parse_attr_mptime ( sdp_result_e sdp_build_attr_mptime ( sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, - u16 len) + flex_string *fs) { - u16 i; - char *endbuf_p; + int i; - /* - * Find the pointer to the end of the buffer - * for recalculating the length remaining. - */ - endbuf_p = *ptr + len; + flex_string_sprintf(fs, "a=%s:", sdp_attr[attr_p->type].name); - /* - * Write out the fixed part of the sdp line. - */ - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:", sdp_attr[attr_p->type].name); - - /* - * Run the list of mptime parameter values and write each one - * to the sdp line. Replace zeros with hyphens. - */ - for (i=0; iattr.mptime.num_intervals; i++) { - if (attr_p->attr.mptime.intervals[i]==0) { - *ptr += snprintf(*ptr,MAX((endbuf_p - *ptr), 0),"-"); - } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%s%u", (i==0)?"":" ", attr_p->attr.mptime.intervals[i]); - } + /* + * Run the list of mptime parameter values and write each one + * to the sdp line. Replace zeros with hyphens. + */ + for (i=0; i < attr_p->attr.mptime.num_intervals; i++) { + if (i > 0) { + flex_string_append(fs, " "); } - /* - * Close out the line. - */ - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\r\n"); + if (attr_p->attr.mptime.intervals[i] == 0) { + flex_string_append(fs, "-"); + } else { + flex_string_sprintf(fs, "%u", attr_p->attr.mptime.intervals[i]); + } + } - return SDP_SUCCESS; + flex_string_append(fs, "\r\n"); + + return SDP_SUCCESS; } @@ -4508,14 +4042,13 @@ sdp_result_e sdp_parse_attr_x_sidin (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_x_sidin (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - char *endbuf_p = *ptr + len; + flex_string_sprintf(fs, "a=%s:%s\r\n", + sdp_attr[attr_p->type].name, + attr_p->attr.stream_data.x_sidin); - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s\r\n", - sdp_attr[attr_p->type].name, - attr_p->attr.stream_data.x_sidin); - return (SDP_SUCCESS); + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_x_sidout (sdp_t *sdp_p, sdp_attr_t *attr_p, @@ -4550,14 +4083,13 @@ sdp_result_e sdp_parse_attr_x_sidout (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_x_sidout (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - char *endbuf_p = *ptr + len; + flex_string_sprintf(fs, "a=%s:%s\r\n", + sdp_attr[attr_p->type].name, + attr_p->attr.stream_data.x_sidout); - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s\r\n", - sdp_attr[attr_p->type].name, - attr_p->attr.stream_data.x_sidout); - return (SDP_SUCCESS); + return SDP_SUCCESS; } @@ -4593,21 +4125,22 @@ sdp_result_e sdp_parse_attr_x_confid (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_x_confid (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - char *endbuf_p = *ptr + len; - - if (attr_p->attr.stream_data.x_confid[0] != '\0') { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s\r\n", - sdp_attr[attr_p->type].name, - attr_p->attr.stream_data.x_confid); - } else { - if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) { - SDP_PRINT("%s X-confid value is not set. Cannot build a=X-confid line\n", - sdp_p->debug_str); - } + if (strlen(attr_p->attr.stream_data.x_confid) <= 0) { + if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) { + SDP_PRINT("%s X-confid value is not set. Cannot build a=X-confid line\n", + sdp_p->debug_str); } - return (SDP_SUCCESS); + + return SDP_INVALID_PARAMETER; + } + + flex_string_sprintf(fs, "a=%s:%s\r\n", + sdp_attr[attr_p->type].name, + attr_p->attr.stream_data.x_confid); + + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_group (sdp_t *sdp_p, sdp_attr_t *attr_p, @@ -4678,26 +4211,24 @@ sdp_result_e sdp_parse_attr_group (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_group (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - int i=0; - char *endbuf_p = *ptr + len; - - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s", - sdp_attr[attr_p->type].name, - sdp_get_group_attr_name (attr_p->attr.stream_data.group_attr)); + int i; - for (i=0; i < attr_p->attr.stream_data.num_group_id; i++) { - if (attr_p->attr.stream_data.group_id_arr[i] > 0) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), " %u", - attr_p->attr.stream_data.group_id_arr[i]); - } + flex_string_sprintf(fs, "a=%s:%s", + sdp_attr[attr_p->type].name, + sdp_get_group_attr_name(attr_p->attr.stream_data.group_attr)); + + for (i=0; i < attr_p->attr.stream_data.num_group_id; i++) { + if (attr_p->attr.stream_data.group_id_arr[i] > 0) { + flex_string_sprintf(fs, " %u", + attr_p->attr.stream_data.group_id_arr[i]); } + } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\r\n"); - - return (SDP_SUCCESS); + flex_string_append(fs, "\r\n"); + return SDP_SUCCESS; } /* Parse the source-filter attribute @@ -4828,26 +4359,25 @@ sdp_result_e sdp_parse_attr_source_filter (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_source_filter (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - int i = 0; - char *endbuf_p = *ptr + len; + int i; - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s %s %s %s", - sdp_get_attr_name(attr_p->type), - sdp_get_src_filter_mode_name(attr_p->attr.source_filter.mode), - sdp_get_network_name(attr_p->attr.source_filter.nettype), - sdp_get_address_name(attr_p->attr.source_filter.addrtype), - attr_p->attr.source_filter.dest_addr); + flex_string_sprintf(fs, "a=%s:%s %s %s %s", + sdp_get_attr_name(attr_p->type), + sdp_get_src_filter_mode_name(attr_p->attr.source_filter.mode), + sdp_get_network_name(attr_p->attr.source_filter.nettype), + sdp_get_address_name(attr_p->attr.source_filter.addrtype), + attr_p->attr.source_filter.dest_addr); - for (i = 0; i < attr_p->attr.source_filter.num_src_addr; i++) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0)," %s", - attr_p->attr.source_filter.src_list[i]); - } + for (i = 0; i < attr_p->attr.source_filter.num_src_addr; i++) { + flex_string_append(fs, " "); + flex_string_append(fs, attr_p->attr.source_filter.src_list[i]); + } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\r\n"); + flex_string_append(fs, "\r\n"); - return (SDP_SUCCESS); + return SDP_SUCCESS; } /* Parse the rtcp-unicast attribute @@ -4892,19 +4422,17 @@ sdp_result_e sdp_parse_attr_rtcp_unicast (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_rtcp_unicast (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { - char *endbuf_p = *ptr + len; + if (attr_p->attr.u32_val >= SDP_RTCP_MAX_UNICAST_MODE) { + return SDP_INVALID_PARAMETER; + } - if (attr_p->attr.u32_val >= SDP_RTCP_MAX_UNICAST_MODE) { - return (SDP_INVALID_PARAMETER); - } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%s\r\n", - sdp_get_attr_name(attr_p->type), - sdp_get_rtcp_unicast_mode_name( - (sdp_rtcp_unicast_mode_e)attr_p->attr.u32_val)); + flex_string_sprintf(fs, "a=%s:%s\r\n", + sdp_get_attr_name(attr_p->type), + sdp_get_rtcp_unicast_mode_name((sdp_rtcp_unicast_mode_e)attr_p->attr.u32_val)); - return (SDP_SUCCESS); + return SDP_SUCCESS; } @@ -5081,7 +4609,7 @@ sdp_parse_sdescriptions_key_param (const char *str, sdp_attr_t *attr_p, sdp_result_e sdp_build_attr_sdescriptions (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) + flex_string *fs) { unsigned char base64_encoded_data[MAX_BASE64_STRING_LEN]; @@ -5090,7 +4618,6 @@ sdp_build_attr_sdescriptions (sdp_t *sdp_p, sdp_attr_t *attr_p, saltSize, outputLen; base64_result_t status; - char *endbuf_p = *ptr + len; keySize = attr_p->attr.srtp_context.master_key_size_bytes; saltSize = attr_p->attr.srtp_context.master_salt_size_bytes; @@ -5124,18 +4651,16 @@ sdp_build_attr_sdescriptions (sdp_t *sdp_p, sdp_attr_t *attr_p, if (attr_p->attr.srtp_context.master_key_lifetime[0] != 0 && attr_p->attr.srtp_context.mki[0] != 0) { - - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%d %s inline:%s|%s|%s:%d\r\n", - sdp_attr[attr_p->type].name, - attr_p->attr.srtp_context.tag, - sdp_srtp_context_crypto_suite[attr_p->attr.srtp_context.suite].name, - base64_encoded_data, - attr_p->attr.srtp_context.master_key_lifetime, - attr_p->attr.srtp_context.mki, - attr_p->attr.srtp_context.mki_size_bytes); - - return SDP_SUCCESS; - + flex_string_sprintf(fs, "a=%s:%d %s inline:%s|%s|%s:%d\r\n", + sdp_attr[attr_p->type].name, + attr_p->attr.srtp_context.tag, + sdp_srtp_context_crypto_suite[attr_p->attr.srtp_context.suite].name, + base64_encoded_data, + attr_p->attr.srtp_context.master_key_lifetime, + attr_p->attr.srtp_context.mki, + attr_p->attr.srtp_context.mki_size_bytes); + + return SDP_SUCCESS; } /* if we get here, either lifetime is populated and mki and is not or mki is populated @@ -5143,28 +4668,28 @@ sdp_build_attr_sdescriptions (sdp_t *sdp_p, sdp_attr_t *attr_p, */ if (attr_p->attr.srtp_context.master_key_lifetime[0] != 0) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%d %s inline:%s|%s\r\n", - sdp_attr[attr_p->type].name, - attr_p->attr.srtp_context.tag, - sdp_srtp_context_crypto_suite[attr_p->attr.srtp_context.suite].name, - base64_encoded_data, - attr_p->attr.srtp_context.master_key_lifetime); - + flex_string_sprintf(fs, "a=%s:%d %s inline:%s|%s\r\n", + sdp_attr[attr_p->type].name, + attr_p->attr.srtp_context.tag, + sdp_srtp_context_crypto_suite[attr_p->attr.srtp_context.suite].name, + base64_encoded_data, + attr_p->attr.srtp_context.master_key_lifetime); + } else if (attr_p->attr.srtp_context.mki[0] != 0) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%d %s inline:%s|%s:%d\r\n", - sdp_attr[attr_p->type].name, - attr_p->attr.srtp_context.tag, - sdp_srtp_context_crypto_suite[attr_p->attr.srtp_context.suite].name, - base64_encoded_data, - attr_p->attr.srtp_context.mki, - attr_p->attr.srtp_context.mki_size_bytes); - + flex_string_sprintf(fs, "a=%s:%d %s inline:%s|%s:%d\r\n", + sdp_attr[attr_p->type].name, + attr_p->attr.srtp_context.tag, + sdp_srtp_context_crypto_suite[attr_p->attr.srtp_context.suite].name, + base64_encoded_data, + attr_p->attr.srtp_context.mki, + attr_p->attr.srtp_context.mki_size_bytes); + } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "a=%s:%d %s inline:%s\r\n", - sdp_attr[attr_p->type].name, - attr_p->attr.srtp_context.tag, - sdp_srtp_context_crypto_suite[attr_p->attr.srtp_context.suite].name, - base64_encoded_data); + flex_string_sprintf(fs, "a=%s:%d %s inline:%s\r\n", + sdp_attr[attr_p->type].name, + attr_p->attr.srtp_context.tag, + sdp_srtp_context_crypto_suite[attr_p->attr.srtp_context.suite].name, + base64_encoded_data); } @@ -5308,17 +4833,11 @@ sdp_result_e sdp_parse_attr_srtpcontext (sdp_t *sdp_p, sdp_attr_t *attr_p, } -sdp_result_e sdp_build_attr_from_str (sdp_t *sdp_p, const char *str, - char **ptr, u16 len) -{ - *ptr += snprintf(*ptr, len, "a=%s\r\n", str); - - return (SDP_SUCCESS); -} - sdp_result_e sdp_build_attr_ice_attr (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) { - return sdp_build_attr_from_str(sdp_p, attr_p->attr.ice_attr, ptr, len); + flex_string *fs) { + flex_string_sprintf(fs, "a=%s\r\n", attr_p->attr.ice_attr); + + return SDP_SUCCESS; } @@ -5372,8 +4891,10 @@ sdp_result_e sdp_parse_attr_fingerprint_attr (sdp_t *sdp_p, sdp_attr_t *attr_p, } sdp_result_e sdp_build_attr_rtcp_mux_attr (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len) { - return sdp_build_attr_from_str(sdp_p, "rtcp-mux", ptr, len); + flex_string *fs) { + flex_string_append(fs, "a=rtcp-mux\r\n"); + + return SDP_SUCCESS; } sdp_result_e sdp_parse_attr_rtcp_mux_attr (sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr) { diff --git a/media/webrtc/signaling/src/sipcc/core/sdp/sdp_main.c b/media/webrtc/signaling/src/sipcc/core/sdp/sdp_main.c index 4553ce5aeb2..4abda5a6bb4 100644 --- a/media/webrtc/signaling/src/sipcc/core/sdp/sdp_main.c +++ b/media/webrtc/signaling/src/sipcc/core/sdp/sdp_main.c @@ -1141,18 +1141,14 @@ sdp_result_e sdp_parse (void *sdp_ptr, char **bufp, u16 len) * Description: Build an SDP description in the specified buffer based * on the information in the given SDP structure. * Parameters: sdp_ptr The SDP handle returned by sdp_init_description - * bufp Pointer to the buffer where the SDP description - * should be built. - * len The maximum length of the SDP/length of the buffer. + * fs A flex_string where the SDP description should be built. * Returns: A result value indicating if the build was successful and * if not, what type of error was encountered - e.g., * description was too long for the given buffer. */ -sdp_result_e sdp_build (void *sdp_ptr, char **bufp, u16 len) +sdp_result_e sdp_build (void *sdp_ptr, flex_string *fs) { int i, j; - char *ptr = NULL; - char *endbuf_p; sdp_t *sdp_p = (sdp_t *)sdp_ptr; sdp_result_e result = SDP_SUCCESS; @@ -1160,7 +1156,7 @@ sdp_result_e sdp_build (void *sdp_ptr, char **bufp, u16 len) return (SDP_INVALID_SDP_PTR); } - if ((bufp == NULL) || (*bufp == NULL)) { + if (!fs) { return (SDP_NULL_BUF_PTR); } @@ -1168,26 +1164,22 @@ sdp_result_e sdp_build (void *sdp_ptr, char **bufp, u16 len) SDP_PRINT("%s Trace SDP Build:", sdp_p->debug_str); } - ptr = *bufp; sdp_p->conf_p->num_builds++; - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = ptr + len; - for (i=0; ((i < SDP_TOKEN_M) && - (result == SDP_SUCCESS) && (endbuf_p - ptr > 0)); i++) { - result = sdp_token[i].build_func(sdp_p, SDP_SESSION_LEVEL, &ptr, (u16)(endbuf_p - ptr)); + (result == SDP_SUCCESS)); i++) { + result = sdp_token[i].build_func(sdp_p, SDP_SESSION_LEVEL, fs); /* ok not to check buffer space (yet) as the if() checks it */ } /* If the session level was ok, build the media lines. */ - if ((result == SDP_SUCCESS) && (endbuf_p - ptr > 0)) { + if (result == SDP_SUCCESS) { for (i=1; ((i <= sdp_p->mca_count) && - (result == SDP_SUCCESS) && (endbuf_p - ptr > 0)); i++) { - result = sdp_token[SDP_TOKEN_M].build_func(sdp_p, (u16)i, &ptr, (u16)(endbuf_p - ptr)); + (result == SDP_SUCCESS)); i++) { + result = sdp_token[SDP_TOKEN_M].build_func(sdp_p, (u16)i, fs); /* ok not to check buffer space (yet) as the for() checks it */ for (j=SDP_TOKEN_I; - ((j < SDP_TOKEN_M) && (result == SDP_SUCCESS) && (endbuf_p - ptr > 0)); + ((j < SDP_TOKEN_M) && (result == SDP_SUCCESS)); j++) { if ((j == SDP_TOKEN_U) || (j == SDP_TOKEN_E) || (j == SDP_TOKEN_P) || (j == SDP_TOKEN_T) || @@ -1195,25 +1187,12 @@ sdp_result_e sdp_build (void *sdp_ptr, char **bufp, u16 len) /* These tokens not valid at media level. */ continue; } - result = sdp_token[j].build_func(sdp_p, (u16)i, &ptr, (u16)(endbuf_p - ptr)); + result = sdp_token[j].build_func(sdp_p, (u16)i, fs); /* ok not to check buffer space (yet) as the for() checks it */ } } } - /* Return the pointer where we left off. */ - *bufp = ptr; - - if (result == SDP_SUCCESS) { - if ((endbuf_p - ptr) <= 1) { - /* - * The buffer was too small, or just big enough, to hold - * the sdp. Some of the sdp may have gotten dropped. - */ - result = SDP_POTENTIAL_SDP_OVERFLOW; - } - } - return (result); } diff --git a/media/webrtc/signaling/src/sipcc/core/sdp/sdp_private.h b/media/webrtc/signaling/src/sipcc/core/sdp/sdp_private.h index abcf46c0ae5..daabfd8bcf3 100644 --- a/media/webrtc/signaling/src/sipcc/core/sdp/sdp_private.h +++ b/media/webrtc/signaling/src/sipcc/core/sdp/sdp_private.h @@ -46,7 +46,6 @@ /* SDP Defines */ #define SDP_MAX_STRING_LEN 256 /* Max len for SDP string */ -#define SDP_MAX_CANDIDATE_LEN 256 /* Max len for SDP string */ #define SDP_MAX_SHORT_STRING_LEN 12 /* Max len for a short SDP string */ #define SDP_MAX_PAYLOAD_TYPES 23 /* Max payload types in m= line */ #define SDP_TOKEN_LEN 2 /* Len of = */ @@ -453,7 +452,7 @@ typedef struct sdp_attr { tinybool boolean_val; u32 u32_val; char string_val[SDP_MAX_STRING_LEN+1]; - char ice_attr[SDP_MAX_CANDIDATE_LEN]; + char ice_attr[SDP_MAX_STRING_LEN+1]; sdp_fmtp_t fmtp; sdp_qos_t qos; sdp_curr_t curr; @@ -552,7 +551,7 @@ typedef struct { typedef struct { char *name; sdp_result_e (*parse_func)(sdp_t *sdp_p, u16 level, const char *ptr); - sdp_result_e (*build_func)(sdp_t *sdp_p, u16 level, char **ptr, u16 len); + sdp_result_e (*build_func)(sdp_t *sdp_p, u16 level, flex_string *fs); } sdp_tokenarray_t; @@ -563,7 +562,7 @@ typedef struct { sdp_result_e (*parse_func)(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); sdp_result_e (*build_func)(sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); } sdp_attrarray_t; @@ -608,139 +607,139 @@ extern sdp_result_e sdp_parse_attribute(sdp_t *sdp_p, u16 level, extern sdp_result_e sdp_parse_attr_simple_string(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_simple_string(sdp_t *sdp_p, - sdp_attr_t *attr_p, char **ptr, u16 len); + sdp_attr_t *attr_p, flex_string *fs); extern sdp_result_e sdp_parse_attr_simple_u32(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_simple_u32(sdp_t *sdp_p, - sdp_attr_t *attr_p, char **ptr, u16 len); + sdp_attr_t *attr_p, flex_string *fs); extern sdp_result_e sdp_parse_attr_simple_bool(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_simple_bool(sdp_t *sdp_p, - sdp_attr_t *attr_p, char **ptr, u16 len); + sdp_attr_t *attr_p, flex_string *fs); extern sdp_result_e sdp_parse_attr_maxprate(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_parse_attr_fmtp(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_fmtp(sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_direction(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_direction(sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_qos(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_qos(sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_curr(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_curr (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_des(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_des (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_conf(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_conf (sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_transport_map(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_transport_map(sdp_t *sdp_p, - sdp_attr_t *attr_p, char **ptr, u16 len); + sdp_attr_t *attr_p, flex_string *fs); extern sdp_result_e sdp_parse_attr_subnet(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_subnet(sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_t38_ratemgmt(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_t38_ratemgmt(sdp_t *sdp_p, - sdp_attr_t *attr_p, char **ptr, u16 len); + sdp_attr_t *attr_p, flex_string *fs); extern sdp_result_e sdp_parse_attr_t38_udpec(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_t38_udpec(sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_cap(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_cap(sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_cpar(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_cpar(sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_pc_codec(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_pc_codec(sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_xcap(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_xcap(sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_xcpar(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_xcpar(sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_rtr(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_rtr(sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_comediadir(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_comediadir(sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_silencesupp(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_silencesupp(sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_srtpcontext(sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_srtpcontext(sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); extern sdp_result_e sdp_parse_attr_mptime( sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_mptime( - sdp_t *sdp_p, sdp_attr_t *attr_p, char **ptr, u16 len); + sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs); extern sdp_result_e sdp_parse_attr_x_sidin( sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_x_sidin( - sdp_t *sdp_p, sdp_attr_t *attr_p, char **ptr, u16 len); + sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs); extern sdp_result_e sdp_parse_attr_x_sidout( sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_x_sidout( - sdp_t *sdp_p, sdp_attr_t *attr_p, char **ptr, u16 len); + sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs); extern sdp_result_e sdp_parse_attr_x_confid( sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_x_confid( - sdp_t *sdp_p, sdp_attr_t *attr_p, char **ptr, u16 len); + sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs); extern sdp_result_e sdp_parse_attr_group( sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_group( - sdp_t *sdp_p, sdp_attr_t *attr_p, char **ptr, u16 len); + sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs); extern sdp_result_e sdp_parse_attr_source_filter( sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_source_filter( - sdp_t *sdp_p, sdp_attr_t *attr_p, char **ptr, u16 len); + sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs); extern sdp_result_e sdp_parse_attr_rtcp_unicast( sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_rtcp_unicast( - sdp_t *sdp_p, sdp_attr_t *attr_p, char **ptr, u16 len); + sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs); extern sdp_result_e sdp_build_attr_ice_attr ( - sdp_t *sdp_p, sdp_attr_t *attr_p, char **ptr, u16 len); + sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs); extern sdp_result_e sdp_parse_attr_ice_attr ( sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_build_attr_rtcp_mux_attr ( - sdp_t *sdp_p, sdp_attr_t *attr_p, char **ptr, u16 len); + sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs); extern sdp_result_e sdp_parse_attr_rtcp_mux_attr ( sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr); extern sdp_result_e sdp_parse_attr_fingerprint_attr ( @@ -789,61 +788,46 @@ extern tinybool sdp_verify_sdp_ptr(sdp_t *sdp_p); /* sdp_tokens.c */ extern sdp_result_e sdp_parse_version(sdp_t *sdp_p, u16 token, const char *ptr); -extern sdp_result_e sdp_build_version(sdp_t *sdp_p, u16 token, char **ptr, - u16 len); +extern sdp_result_e sdp_build_version(sdp_t *sdp_p, u16 token, flex_string *fs); extern sdp_result_e sdp_parse_owner(sdp_t *sdp_p, u16 token, const char *ptr); -extern sdp_result_e sdp_build_owner(sdp_t *sdp_p, u16 token, char **ptr, - u16 len); +extern sdp_result_e sdp_build_owner(sdp_t *sdp_p, u16 token, flex_string *fs); extern sdp_result_e sdp_parse_sessname(sdp_t *sdp_p, u16 token, const char *ptr); -extern sdp_result_e sdp_build_sessname(sdp_t *sdp_p, u16 token, char **ptr, - u16 len); +extern sdp_result_e sdp_build_sessname(sdp_t *sdp_p, u16 token, flex_string *fs); extern sdp_result_e sdp_parse_sessinfo(sdp_t *sdp_p, u16 token, const char *ptr); -extern sdp_result_e sdp_build_sessinfo(sdp_t *sdp_p, u16 token, char **ptr, - u16 len); +extern sdp_result_e sdp_build_sessinfo(sdp_t *sdp_p, u16 token, flex_string *fs); extern sdp_result_e sdp_parse_uri(sdp_t *sdp_p, u16 token, const char *ptr); -extern sdp_result_e sdp_build_uri(sdp_t *sdp_p, u16 token, char **ptr, - u16 len); +extern sdp_result_e sdp_build_uri(sdp_t *sdp_p, u16 token, flex_string *fs); extern sdp_result_e sdp_parse_email(sdp_t *sdp_p, u16 token, const char *ptr); -extern sdp_result_e sdp_build_email(sdp_t *sdp_p, u16 token, char **ptr, - u16 len); +extern sdp_result_e sdp_build_email(sdp_t *sdp_p, u16 token, flex_string *fs); extern sdp_result_e sdp_parse_phonenum(sdp_t *sdp_p, u16 token, const char *ptr); -extern sdp_result_e sdp_build_phonenum(sdp_t *sdp_p, u16 token, char **ptr, - u16 len); +extern sdp_result_e sdp_build_phonenum(sdp_t *sdp_p, u16 token, flex_string *fs); extern sdp_result_e sdp_parse_connection(sdp_t *sdp_p, u16 token, const char *ptr); -extern sdp_result_e sdp_build_connection(sdp_t *sdp_p, u16 token, char **ptr, - u16 len); +extern sdp_result_e sdp_build_connection(sdp_t *sdp_p, u16 token, flex_string *fs); extern sdp_result_e sdp_parse_bandwidth(sdp_t *sdp_p, u16 token, const char *ptr); -extern sdp_result_e sdp_build_bandwidth(sdp_t *sdp_p, u16 token, char **ptr, - u16 len); +extern sdp_result_e sdp_build_bandwidth(sdp_t *sdp_p, u16 token, flex_string *fs); extern sdp_result_e sdp_parse_timespec(sdp_t *sdp_p, u16 token, const char *ptr); -extern sdp_result_e sdp_build_timespec(sdp_t *sdp_p, u16 token, char **ptr, - u16 len); +extern sdp_result_e sdp_build_timespec(sdp_t *sdp_p, u16 token, flex_string *fs); extern sdp_result_e sdp_parse_repeat_time(sdp_t *sdp_p, u16 token, const char *ptr); -extern sdp_result_e sdp_build_repeat_time(sdp_t *sdp_p, u16 token, char **ptr, - u16 len); +extern sdp_result_e sdp_build_repeat_time(sdp_t *sdp_p, u16 token, flex_string *fs); extern sdp_result_e sdp_parse_timezone_adj(sdp_t *sdp_p, u16 token, const char *ptr); -extern sdp_result_e sdp_build_timezone_adj(sdp_t *sdp_p, u16 token, char **ptr, - u16 len); +extern sdp_result_e sdp_build_timezone_adj(sdp_t *sdp_p, u16 token, flex_string *fs); extern sdp_result_e sdp_parse_encryption(sdp_t *sdp_p, u16 token, const char *ptr); -extern sdp_result_e sdp_build_encryption(sdp_t *sdp_p, u16 token, char **ptr, - u16 len); +extern sdp_result_e sdp_build_encryption(sdp_t *sdp_p, u16 token, flex_string *fs); extern sdp_result_e sdp_parse_media(sdp_t *sdp_p, u16 token, const char *ptr); -extern sdp_result_e sdp_build_media(sdp_t *sdp_p, u16 token, char **ptr, - u16 len); +extern sdp_result_e sdp_build_media(sdp_t *sdp_p, u16 token, flex_string *fs); extern sdp_result_e sdp_parse_attribute(sdp_t *sdp_p, u16 token, const char *ptr); -extern sdp_result_e sdp_build_attribute(sdp_t *sdp_p, u16 token, char **ptr, - u16 len); +extern sdp_result_e sdp_build_attribute(sdp_t *sdp_p, u16 token, flex_string *fs); extern void sdp_parse_payload_types(sdp_t *sdp_p, sdp_mca_t *mca_p, const char *ptr); @@ -856,7 +840,7 @@ sdp_parse_attr_sdescriptions(sdp_t *sdp_p, sdp_attr_t *attr_p, extern sdp_result_e sdp_build_attr_sdescriptions(sdp_t *sdp_p, sdp_attr_t *attr_p, - char **ptr, u16 len); + flex_string *fs); /* sdp_utils.c */ diff --git a/media/webrtc/signaling/src/sipcc/core/sdp/sdp_token.c b/media/webrtc/signaling/src/sipcc/core/sdp/sdp_token.c index a90ac512012..0982bc80b41 100644 --- a/media/webrtc/signaling/src/sipcc/core/sdp/sdp_token.c +++ b/media/webrtc/signaling/src/sipcc/core/sdp/sdp_token.c @@ -70,10 +70,8 @@ sdp_result_e sdp_parse_version (sdp_t *sdp_p, u16 level, const char *ptr) return (SDP_SUCCESS); } -sdp_result_e sdp_build_version (sdp_t *sdp_p, u16 level, char **ptr, u16 len) +sdp_result_e sdp_build_version (sdp_t *sdp_p, u16 level, flex_string *fs) { - char *endbuf_p = *ptr + len; - if (sdp_p->version == SDP_INVALID_VALUE) { if (sdp_p->conf_p->version_reqd == TRUE) { if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) { @@ -87,7 +85,8 @@ sdp_result_e sdp_build_version (sdp_t *sdp_p, u16 level, char **ptr, u16 len) return (SDP_SUCCESS); } } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "v=%u\r\n", (u16)sdp_p->version); + + flex_string_sprintf(fs, "v=%u\r\n", (u16)sdp_p->version); if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) { SDP_PRINT("%s Built v= version line", sdp_p->debug_str); @@ -239,10 +238,8 @@ sdp_result_e sdp_parse_owner (sdp_t *sdp_p, u16 level, const char *ptr) return (SDP_SUCCESS); } -sdp_result_e sdp_build_owner (sdp_t *sdp_p, u16 level, char **ptr, u16 len) +sdp_result_e sdp_build_owner (sdp_t *sdp_p, u16 level, flex_string *fs) { - char *endbuf_p = *ptr + len; - if ((sdp_p->owner_name[0] == '\0') || (sdp_p->owner_network_type >= SDP_MAX_NETWORK_TYPES) || (sdp_p->owner_addr_type >= SDP_MAX_ADDR_TYPES) || @@ -250,7 +247,7 @@ sdp_result_e sdp_build_owner (sdp_t *sdp_p, u16 level, char **ptr, u16 len) if((sdp_p->owner_network_type == SDP_NT_ATM) && (sdp_p->owner_addr_type == SDP_AT_INVALID)) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "o=%s %s %s %s - -\r\n", + flex_string_sprintf(fs, "o=%s %s %s %s - -\r\n", sdp_p->owner_name, sdp_p->owner_sessid, sdp_p->owner_version, sdp_get_network_name(sdp_p->owner_network_type)); @@ -269,7 +266,7 @@ sdp_result_e sdp_build_owner (sdp_t *sdp_p, u16 level, char **ptr, u16 len) } } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "o=%s %s %s %s %s %s\r\n", + flex_string_sprintf(fs, "o=%s %s %s %s %s %s\r\n", sdp_p->owner_name, sdp_p->owner_sessid, sdp_p->owner_version, sdp_get_network_name(sdp_p->owner_network_type), @@ -312,10 +309,8 @@ sdp_result_e sdp_parse_sessname (sdp_t *sdp_p, u16 level, const char *ptr) return (SDP_SUCCESS); } -sdp_result_e sdp_build_sessname (sdp_t *sdp_p, u16 level, char **ptr, u16 len) +sdp_result_e sdp_build_sessname (sdp_t *sdp_p, u16 level, flex_string *fs) { - char *endbuf_p = *ptr + len; - if (sdp_p->sessname[0] == '\0') { if (sdp_p->conf_p->session_name_reqd == TRUE) { if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) { @@ -330,7 +325,7 @@ sdp_result_e sdp_build_sessname (sdp_t *sdp_p, u16 level, char **ptr, u16 len) } } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "s=%s\r\n", sdp_p->sessname); + flex_string_sprintf(fs, "s=%s\r\n", sdp_p->sessname); if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) { SDP_PRINT("%s Built s= session name line", sdp_p->debug_str); @@ -385,7 +380,7 @@ sdp_result_e sdp_parse_sessinfo (sdp_t *sdp_p, u16 level, const char *ptr) return (SDP_SUCCESS); } -sdp_result_e sdp_build_sessinfo (sdp_t *sdp_p, u16 level, char **ptr, u16 len) +sdp_result_e sdp_build_sessinfo (sdp_t *sdp_p, u16 level, flex_string *fs) { /* Build session info line not supported. */ return (SDP_SUCCESS); @@ -417,7 +412,7 @@ sdp_result_e sdp_parse_uri (sdp_t *sdp_p, u16 level, const char *ptr) return (SDP_SUCCESS); } -sdp_result_e sdp_build_uri (sdp_t *sdp_p, u16 level, char **ptr, u16 len) +sdp_result_e sdp_build_uri (sdp_t *sdp_p, u16 level, flex_string *fs) { /* Build URI line not supported. */ return (SDP_SUCCESS); @@ -440,7 +435,7 @@ sdp_result_e sdp_parse_email (sdp_t *sdp_p, u16 level, const char *ptr) return (SDP_SUCCESS); } -sdp_result_e sdp_build_email (sdp_t *sdp_p, u16 level, char **ptr, u16 len) +sdp_result_e sdp_build_email (sdp_t *sdp_p, u16 level, flex_string *fs) { /* Build email line not supported. */ return (SDP_SUCCESS); @@ -464,7 +459,7 @@ sdp_result_e sdp_parse_phonenum (sdp_t *sdp_p, u16 level, const char *ptr) return (SDP_SUCCESS); } -sdp_result_e sdp_build_phonenum (sdp_t *sdp_p, u16 level, char **ptr, u16 len) +sdp_result_e sdp_build_phonenum (sdp_t *sdp_p, u16 level, flex_string *fs) { /* Build phone number line not supported. */ return (SDP_SUCCESS); @@ -692,12 +687,10 @@ sdp_result_e sdp_parse_connection (sdp_t *sdp_p, u16 level, const char *ptr) return (SDP_SUCCESS); } -sdp_result_e sdp_build_connection (sdp_t *sdp_p, u16 level, char **ptr, - u16 len) +sdp_result_e sdp_build_connection (sdp_t *sdp_p, u16 level, flex_string *fs) { sdp_mca_t *mca_p; sdp_conn_t *conn_p; - char *endbuf_p = *ptr + len; if (level == SDP_SESSION_LEVEL) { conn_p = &(sdp_p->default_conn); @@ -713,7 +706,7 @@ sdp_result_e sdp_build_connection (sdp_t *sdp_p, u16 level, char **ptr, (conn_p->addrtype == SDP_AT_INVALID)) { /*allow c= line to be built without address type and address fields * This is a special case for ATM PVC*/ - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "c=%s\r\n", + flex_string_sprintf(fs, "c=%s\r\n", sdp_get_network_name(conn_p->nettype)); return SDP_SUCCESS; } @@ -726,20 +719,20 @@ sdp_result_e sdp_build_connection (sdp_t *sdp_p, u16 level, char **ptr, if (conn_p->is_multicast) { if (conn_p->num_of_addresses > 1) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "c=%s %s %s/%d/%d\r\n", + flex_string_sprintf(fs, "c=%s %s %s/%d/%d\r\n", sdp_get_network_name(conn_p->nettype), sdp_get_address_name(conn_p->addrtype), conn_p->conn_addr, conn_p->ttl, conn_p->num_of_addresses); } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "c=%s %s %s/%d\r\n", + flex_string_sprintf(fs, "c=%s %s %s/%d\r\n", sdp_get_network_name(conn_p->nettype), sdp_get_address_name(conn_p->addrtype), conn_p->conn_addr, conn_p->ttl); } } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "c=%s %s %s\r\n", + flex_string_sprintf(fs, "c=%s %s %s\r\n", sdp_get_network_name(conn_p->nettype), sdp_get_address_name(conn_p->addrtype), conn_p->conn_addr); @@ -877,12 +870,11 @@ sdp_result_e sdp_parse_bandwidth (sdp_t *sdp_p, u16 level, const char *ptr) * * Builds *all* the bandwith lines for the specified level. */ -sdp_result_e sdp_build_bandwidth (sdp_t *sdp_p, u16 level, char **ptr, u16 len) +sdp_result_e sdp_build_bandwidth (sdp_t *sdp_p, u16 level, flex_string *fs) { sdp_bw_t *bw_p; sdp_bw_data_t *bw_data_p; sdp_mca_t *mca_p; - char *endbuf_p; if (level == SDP_SESSION_LEVEL) { bw_p = &(sdp_p->bw); @@ -894,12 +886,9 @@ sdp_result_e sdp_build_bandwidth (sdp_t *sdp_p, u16 level, char **ptr, u16 len) bw_p = &(mca_p->bw); } - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; - bw_data_p = bw_p->bw_data_list; while (bw_data_p) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "b=%s:%d\r\n", + flex_string_sprintf(fs, "b=%s:%d\r\n", sdp_get_bw_modifier_name(bw_data_p->bw_modifier), bw_data_p->bw_val); @@ -982,10 +971,8 @@ sdp_result_e sdp_parse_timespec (sdp_t *sdp_p, u16 level, const char *ptr) return (SDP_SUCCESS); } -sdp_result_e sdp_build_timespec (sdp_t *sdp_p, u16 level, char **ptr, u16 len) +sdp_result_e sdp_build_timespec (sdp_t *sdp_p, u16 level, flex_string *fs) { - char *endbuf_p = *ptr + len; - if ((sdp_p->timespec_p == NULL) || (sdp_p->timespec_p->start_time == '\0') || (sdp_p->timespec_p->stop_time == '\0')) { @@ -1003,7 +990,7 @@ sdp_result_e sdp_build_timespec (sdp_t *sdp_p, u16 level, char **ptr, u16 len) } /* Note: We only support one t= line currently. */ - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "t=%s %s\r\n", sdp_p->timespec_p->start_time, + flex_string_sprintf(fs, "t=%s %s\r\n", sdp_p->timespec_p->start_time, sdp_p->timespec_p->stop_time); if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) { @@ -1030,7 +1017,7 @@ sdp_result_e sdp_parse_repeat_time (sdp_t *sdp_p, u16 level, const char *ptr) return (SDP_SUCCESS); } -sdp_result_e sdp_build_repeat_time (sdp_t *sdp_p, u16 level, char **ptr, u16 len) +sdp_result_e sdp_build_repeat_time (sdp_t *sdp_p, u16 level, flex_string *fs) { /* Build repeat time line not supported. */ return (SDP_SUCCESS); @@ -1054,8 +1041,7 @@ sdp_result_e sdp_parse_timezone_adj (sdp_t *sdp_p, u16 level, const char *ptr) return (SDP_SUCCESS); } -sdp_result_e sdp_build_timezone_adj (sdp_t *sdp_p, u16 level, char **ptr, - u16 len) +sdp_result_e sdp_build_timezone_adj (sdp_t *sdp_p, u16 level, flex_string *fs) { /* Build timezone adjustment line not supported. */ return (SDP_SUCCESS); @@ -1136,15 +1122,10 @@ sdp_result_e sdp_parse_encryption (sdp_t *sdp_p, u16 level, const char *ptr) } /* If the encryption info is valid, we build it. Else skip it. */ -sdp_result_e sdp_build_encryption (sdp_t *sdp_p, u16 level, char **ptr, - u16 len) +sdp_result_e sdp_build_encryption (sdp_t *sdp_p, u16 level, flex_string *fs) { sdp_encryptspec_t *encrypt_p; sdp_mca_t *mca_p; - char *endbuf_p; - - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; if (level == SDP_SESSION_LEVEL) { encrypt_p = &(sdp_p->encrypt); @@ -1163,14 +1144,14 @@ sdp_result_e sdp_build_encryption (sdp_t *sdp_p, u16 level, char **ptr, return (SDP_SUCCESS); } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "k=%s", + flex_string_sprintf(fs, "k=%s", sdp_get_encrypt_name(encrypt_p->encrypt_type)); if (encrypt_p->encrypt_type == SDP_ENCRYPT_PROMPT) { /* There is no key to print. */ - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\r\n"); + flex_string_sprintf(fs, "\r\n"); } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), ":%s\r\n", encrypt_p->encrypt_key); + flex_string_sprintf(fs, ":%s\r\n", encrypt_p->encrypt_key); } if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) { @@ -1539,16 +1520,12 @@ sdp_result_e sdp_parse_media (sdp_t *sdp_p, u16 level, const char *ptr) return (SDP_SUCCESS); } -sdp_result_e sdp_build_media (sdp_t *sdp_p, u16 level, char **ptr, u16 len) +sdp_result_e sdp_build_media (sdp_t *sdp_p, u16 level, flex_string *fs) { int i, j; sdp_mca_t *mca_p; tinybool invalid_params=FALSE; sdp_media_profiles_t *profile_p; - char *endbuf_p; - - /* Find ptr to the end of the buf for recalculating len remaining. */ - endbuf_p = *ptr + len; /* Find the right media line */ mca_p = sdp_find_media_level(sdp_p, level); @@ -1573,30 +1550,30 @@ sdp_result_e sdp_build_media (sdp_t *sdp_p, u16 level, char **ptr, u16 len) } /* Build the media type */ - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "m=%s ", sdp_get_media_name(mca_p->media)); + flex_string_sprintf(fs, "m=%s ", sdp_get_media_name(mca_p->media)); /* Build the port based on the specified port format */ if (mca_p->port_format == SDP_PORT_NUM_ONLY) { if (mca_p->port == SDP_CHOOSE_PARAM) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "$ "); + flex_string_sprintf(fs, "$ "); } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%u ", (u16)mca_p->port); + flex_string_sprintf(fs, "%u ", (u16)mca_p->port); } } else if (mca_p->port_format == SDP_PORT_NUM_COUNT) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%u/%u ", (u16)mca_p->port, + flex_string_sprintf(fs, "%u/%u ", (u16)mca_p->port, (u16)mca_p->num_ports); } else if (mca_p->port_format == SDP_PORT_VPI_VCI) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%u/%u ", + flex_string_sprintf(fs, "%u/%u ", (u16)mca_p->vpi, (u16)mca_p->vci); } else if (mca_p->port_format == SDP_PORT_VCCI) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%u ", (u16)mca_p->vcci); + flex_string_sprintf(fs, "%u ", (u16)mca_p->vcci); } else if (mca_p->port_format == SDP_PORT_NUM_VPI_VCI) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%u/%u/%u ", (u16)mca_p->port, + flex_string_sprintf(fs, "%u/%u/%u ", (u16)mca_p->port, (u16)mca_p->vpi, (u16)mca_p->vci); } else if (mca_p->port_format == SDP_PORT_VCCI_CID) { if ((mca_p->vcci == SDP_CHOOSE_PARAM) && (mca_p->cid == SDP_CHOOSE_PARAM)) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "$/$ "); + flex_string_sprintf(fs, "$/$ "); } else if ((mca_p->vcci == SDP_CHOOSE_PARAM) || (mca_p->cid == SDP_CHOOSE_PARAM)) { /* If one is set but not the other, this is an error. */ @@ -1607,11 +1584,11 @@ sdp_result_e sdp_build_media (sdp_t *sdp_p, u16 level, char **ptr, u16 len) sdp_p->conf_p->num_invalid_param++; return (SDP_INVALID_PARAMETER); } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%u/%u ", + flex_string_sprintf(fs, "%u/%u ", (u16)mca_p->vcci, (u16)mca_p->cid); } } else if (mca_p->port_format == SDP_PORT_NUM_VPI_VCI_CID) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%u/%u/%u/%u ", (u16)mca_p->port, + flex_string_sprintf(fs, "%u/%u/%u/%u ", (u16)mca_p->port, (u16)mca_p->vpi, (u16)mca_p->vci, (u16)mca_p->cid); } @@ -1621,16 +1598,16 @@ sdp_result_e sdp_build_media (sdp_t *sdp_p, u16 level, char **ptr, u16 len) (mca_p->transport == SDP_TRANSPORT_AAL2_CUSTOM)) { profile_p = mca_p->media_profiles_p; for (i=0; i < profile_p->num_profiles; i++) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%s", + flex_string_sprintf(fs, "%s", sdp_get_transport_name(profile_p->profile[i])); for (j=0; j < profile_p->num_payloads[i]; j++) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), " %u", + flex_string_sprintf(fs, " %u", profile_p->payload_type[i][j]); } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), " "); + flex_string_sprintf(fs, " "); } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\n"); + flex_string_sprintf(fs, "\n"); if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) { SDP_PRINT("%s Built m= media line", sdp_p->debug_str); } @@ -1638,7 +1615,7 @@ sdp_result_e sdp_build_media (sdp_t *sdp_p, u16 level, char **ptr, u16 len) } /* Build the transport name */ - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "%s", + flex_string_sprintf(fs, "%s", sdp_get_transport_name(mca_p->transport)); if(mca_p->transport != SDP_TRANSPORT_SCTPDTLS) { @@ -1646,18 +1623,18 @@ sdp_result_e sdp_build_media (sdp_t *sdp_p, u16 level, char **ptr, u16 len) /* Build the format lists */ for (i=0; i < mca_p->num_payloads; i++) { if (mca_p->payload_indicator[i] == SDP_PAYLOAD_ENUM) { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), " %s", + flex_string_sprintf(fs, " %s", sdp_get_payload_name((sdp_payload_e)mca_p->payload_type[i])); } else { - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), " %u", mca_p->payload_type[i]); + flex_string_sprintf(fs, " %u", mca_p->payload_type[i]); } } } else { /* Add port to SDP if transport is SCTP/DTLS */ - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), " %u ", (u32)mca_p->sctpport); + flex_string_sprintf(fs, " %u ", (u32)mca_p->sctpport); } - *ptr += snprintf(*ptr, MAX((endbuf_p - *ptr), 0), "\r\n"); + flex_string_sprintf(fs, "\r\n"); if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) { SDP_PRINT("%s Built m= media line", sdp_p->debug_str); diff --git a/media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_sdp.c b/media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_sdp.c index 81160a5b64a..654c7fd8f4c 100644 --- a/media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_sdp.c +++ b/media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_sdp.c @@ -404,69 +404,31 @@ sipsdp_create_from_buf (char *buf, uint32_t nbytes, cc_sdp_t *sdp) char * sipsdp_write_to_buf (cc_sdp_t *sdp_info, uint32_t *retbytes) { - const char *fname = "sipsdp_write_to_buf"; - char *buf, *new_buf; - char *sdp_buf; + flex_string fs; uint32_t sdp_len; sdp_result_e rc; + flex_string_init(&fs); + if (!sdp_info || !sdp_info->src_sdp) { - CCSIP_DEBUG_ERROR(SIP_F_PREFIX"NULL sdp_info or src_sdp\n", fname); + CCSIP_DEBUG_ERROR(SIP_F_PREFIX"NULL sdp_info or src_sdp\n", __FUNCTION__); return (NULL); } - /* - * Allocate storage for the SDP text - */ - buf = (char *) cpr_malloc(CCSIP_SDP_BUF_SIZE); - if (!buf) { - CCSIP_DEBUG_ERROR(SIP_F_PREFIX"malloc failure\n", fname); - return (NULL); - } - - sdp_buf = buf; - - if ((rc = sdp_build(sdp_info->src_sdp, &sdp_buf, CCSIP_SDP_BUF_SIZE)) + if ((rc = sdp_build(sdp_info->src_sdp, &fs)) != SDP_SUCCESS) { - CCSIP_DEBUG_TASK(DEB_F_PREFIX"sdp_build rc=%s\n", DEB_F_PREFIX_ARGS(SIP_SDP, fname), + CCSIP_DEBUG_TASK(DEB_F_PREFIX"sdp_build rc=%s\n", DEB_F_PREFIX_ARGS(SIP_SDP, __FUNCTION__), sdp_get_result_name(rc)); - if (rc == SDP_POTENTIAL_SDP_OVERFLOW) { - /* SDP may have been truncated. Issue an extra warning and abort */ - CCSIP_DEBUG_ERROR(SIP_F_PREFIX"Build SDP buffer overflow\n", fname); - } - - cpr_free(buf); + flex_string_free(&fs); *retbytes = 0; return (NULL); } - /* - * Compute length of SDP - */ - sdp_len = sdp_buf - buf; - /* - * Minimize the memory impact on the SDP buffer by reallocating buffer - * with a smaller size that fits the actual SDP body for the size. - */ - if ((CCSIP_SDP_BUF_SIZE - sdp_len) > 64) { - /* - * Allocate space with NULL string character, the - * output buffer content contains the NULL char but the - * the length represents an actual length of SDP - * without NULL char. The NULL char is added just in case, - * there is code that uses strlen() on the SDP then - * it will terminate properly. - */ - new_buf = (char *) cpr_malloc(sdp_len + 1); - if (new_buf != NULL) { - memcpy(new_buf, buf, sdp_len); - new_buf[sdp_len] = '\0'; - cpr_free(buf); - buf = new_buf; - } - } - *retbytes = sdp_len; + *retbytes = fs.string_length; - return (buf); + /* We are not calling flex_string_free on this, instead returning the buffer + * caller's responsibility to free + */ + return fs.buffer; } diff --git a/media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_sdp.h b/media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_sdp.h index 78a40dbd210..3bc95faec47 100644 --- a/media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_sdp.h +++ b/media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_sdp.h @@ -46,8 +46,6 @@ #include "sdp.h" #include "ccapi.h" -// RAMC-start -#define CCSIP_SDP_BUF_SIZE SDP_MAX_LEN /* SDP bitmask values */ #define CCSIP_SRC_SDP_BIT 0x1 @@ -92,7 +90,7 @@ PMH_EXTERN cc_sdp_t *sipsdp_create_from_buf(char *buf, uint32_t nbytes, */ #define SIPSDP_VERSION 0 // RAMC_DEBUG #define SIPSDP_ORIGIN_USERNAME "CiscoSystemsSIP-GW-UserAgent" -#define SIPSDP_ORIGIN_USERNAME "Cisco-SIPUA" +#define SIPSDP_ORIGIN_USERNAME "Mozilla-SIPUA" #define SIPSDP_SESSION_NAME "SIP Call" /* Possible encoding names fo static payload types*/ diff --git a/media/webrtc/signaling/src/sipcc/cpr/common/cpr_string.c b/media/webrtc/signaling/src/sipcc/cpr/common/cpr_string.c index 335a20676e8..c0700054754 100644 --- a/media/webrtc/signaling/src/sipcc/cpr/common/cpr_string.c +++ b/media/webrtc/signaling/src/sipcc/cpr/common/cpr_string.c @@ -37,7 +37,10 @@ * * ***** END LICENSE BLOCK ***** */ +#include +#include +#include "mozilla/Assertions.h" #include "cpr_types.h" #include "cpr_stdlib.h" #include "cpr_string.h" @@ -129,3 +132,101 @@ sstrncat (char *s1, const char *s2, unsigned long max) return s1; } + +/* + * flex_string + */ + +/* + * flex_string_init + * + * Not thread-safe + */ +void flex_string_init(flex_string *fs) { + fs->buffer_length = FLEX_STRING_CHUNK_SIZE; + fs->string_length = 0; + fs->buffer = cpr_malloc(fs->buffer_length); + fs->buffer[0] = '\0'; +} + +/* + * flex_string_free + * + * Not thread-safe + */ +void flex_string_free(flex_string *fs) { + fs->buffer_length = 0; + fs->string_length = 0; + cpr_free(fs->buffer); + fs->buffer = NULL; +} + +/* For sanity check before alloc */ +#define FLEX_STRING_MAX_SIZE (10 * 1024 * 1024) /* 10MB */ + +/* + * flex_string_check_alloc + * + * Allocate enough chunks to hold the new minimum size. + * + * Not thread-safe + */ +void flex_string_check_alloc(flex_string *fs, size_t new_min_length) { + if (new_min_length > fs->buffer_length) { + /* Oversize, allocate more */ + + /* Sanity check on allocation size */ + if (new_min_length > FLEX_STRING_MAX_SIZE) { + MOZ_CRASH(); + } + + /* Alloc to nearest chunk */ + fs->buffer_length = (((new_min_length - 1) / FLEX_STRING_CHUNK_SIZE) + 1) * FLEX_STRING_CHUNK_SIZE; + + fs->buffer = cpr_realloc(fs->buffer, fs->buffer_length); + } +} + +/* + * flex_string_append + * + * Not thread-safe + */ +void flex_string_append(flex_string *fs, const char *more) { + fs->string_length += strlen(more); + + flex_string_check_alloc(fs, fs->string_length + 1); + + sstrncat(fs->buffer, more, fs->buffer_length - strlen(fs->buffer)); +} + +/* + * flex_string_sprintf + * + * Not thread-safe + */ +void flex_string_sprintf(flex_string *fs, const char *format, ...) { + va_list ap; + int vsnprintf_result; + + va_start(ap, format); + vsnprintf_result = vsnprintf(fs->buffer + fs->string_length, fs->buffer_length - fs->string_length, format, ap); + va_end(ap); + + if (fs->string_length + vsnprintf_result >= fs->buffer_length) { + /* Buffer overflow, resize */ + flex_string_check_alloc(fs, fs->string_length + vsnprintf_result + 1); + + /* Try again with new buffer */ + va_start(ap, format); + vsnprintf_result = vsnprintf(fs->buffer + fs->string_length, fs->buffer_length - fs->string_length, format, ap); + MOZ_ASSERT(vsnprintf_result > 0 && vsnprintf_result < (fs->buffer_length - fs->string_length)); + va_end(ap); + } + + if (vsnprintf_result > 0) { + fs->string_length += vsnprintf_result; + } +} + + diff --git a/media/webrtc/signaling/src/sipcc/cpr/include/cpr_string.h b/media/webrtc/signaling/src/sipcc/cpr/include/cpr_string.h index cbc61a54f18..67095f4fb13 100644 --- a/media/webrtc/signaling/src/sipcc/cpr/include/cpr_string.h +++ b/media/webrtc/signaling/src/sipcc/cpr/include/cpr_string.h @@ -98,6 +98,54 @@ sstrncpy(char *dst, const char *src, unsigned long max); char * sstrncat(char *s1, const char *s2, unsigned long max); +/* + * flex_string + */ +#define FLEX_STRING_CHUNK_SIZE 256 + +typedef struct { + char *buffer; + size_t buffer_length; + size_t string_length; +} flex_string; + +/* + * flex_string_init + * + * Not thread-safe + */ +void flex_string_init(flex_string *fs); + +/* + * flex_string_free + * + * Not thread-safe + */ +void flex_string_free(flex_string *fs); + +/* + * flex_string_check_alloc + * + * Allocate enough chunks to hold the new minimum size. + * + * Not thread-safe + */ +void flex_string_check_alloc(flex_string *fs, size_t new_min_length); + +/* + * flex_string_append + * + * Not thread-safe + */ +void flex_string_append(flex_string *fs, const char *more); + +/* + * flex_string_sprintf + * + * Not thread-safe + */ +void flex_string_sprintf(flex_string *fs, const char *format, ...); + __END_DECLS #endif diff --git a/media/webrtc/signaling/test/signaling_unittests.cpp b/media/webrtc/signaling/test/signaling_unittests.cpp index 5905c9d8e01..26bc8a8cb5a 100644 --- a/media/webrtc/signaling/test/signaling_unittests.cpp +++ b/media/webrtc/signaling/test/signaling_unittests.cpp @@ -38,7 +38,7 @@ namespace test { static const std::string strSampleSdpAudioVideoNoIce = "v=0\r\n" - "o=Cisco-SIPUA 4949 0 IN IP4 10.86.255.143\r\n" + "o=Mozilla-SIPUA 4949 0 IN IP4 10.86.255.143\r\n" "s=SIP Call\r\n" "t=0 0\r\n" "a=ice-ufrag:qkEP\r\n"