diff --git a/daemon/rtcp.c b/daemon/rtcp.c index 7022a90ae..ee64a09f5 100644 --- a/daemon/rtcp.c +++ b/daemon/rtcp.c @@ -1505,34 +1505,36 @@ static GString *rtcp_sender_report(struct ssrc_sender_report *ssr, sr->rtcp.header.length = htons((ret->len >> 2) - 1); // sdes - assert(rtpe_instance_id.len == 12); - + // cname struct { struct source_description_packet sdes; struct sdes_chunk chunk; struct sdes_item cname; - char str[12]; - char nul; - char pad; } __attribute__ ((packed)) *sdes; - assert(sizeof(*sdes) == 24); - - g_string_set_size(ret, ret->len + sizeof(*sdes)); - sdes = (void *) ret->str + ret->len - sizeof(*sdes); + size_t sdes_start_len = ret->len; + g_string_set_size(ret, sdes_start_len + sizeof(*sdes)); + sdes = (void *) ret->str + sdes_start_len; *sdes = (__typeof(*sdes)) { .sdes.header.version = 2, .sdes.header.pt = RTCP_PT_SDES, .sdes.header.count = 1, - .sdes.header.length = htons((sizeof(*sdes) >> 2) - 1), .chunk.ssrc = htonl(ssrc), .cname.type = SDES_TYPE_CNAME, .cname.length = rtpe_instance_id.len, - .nul = 0, - .pad = 0, }; - memcpy(sdes->str, rtpe_instance_id.s, rtpe_instance_id.len); + g_string_append_len(ret, rtpe_instance_id.s, rtpe_instance_id.len); + + // padding and set final length + size_t sdes_end_len = ret->len; + size_t padded_len = (sdes_end_len + 3L) & ~3L; + g_string_set_size(ret, padded_len); + memset(ret->str + sdes_end_len, 0, padded_len - sdes_end_len); + + // reset pointer for length field + sdes = (void *) ret->str + sdes_start_len; + sdes->sdes.header.length = htons((padded_len - sdes_start_len) / 4 - 1); return ret; }