stun: correct attribute string padding to match rfc

When sending the USERNAME attribute in an RTP STUN
response, the implementation in append_attr_string
passed the actual length, instead of padding it up
to a multiple of four bytes as required by the RFC
3489.  This change adds separate variables for the
string and padded attributed lengths, and performs
padding correctly.

Reported by: Thomas Arimont
Review: https://reviewboard.asterisk.org/r/4139/


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@427874 65c4cc65-6c06-0410-ace0-fbb531ad65f3
changes/61/61/1
Scott Griepentrog 11 years ago
parent 093db340b1
commit d0495f4139

@ -201,12 +201,15 @@ static int stun_process_attr(struct stun_state *state, struct stun_attr *attr)
/*! \brief append a string to an STUN message */
static void append_attr_string(struct stun_attr **attr, int attrval, const char *s, int *len, int *left)
{
int size = sizeof(**attr) + strlen(s);
int str_length = strlen(s);
int attr_length = str_length + ((~(str_length - 1)) & 0x3);
int size = sizeof(**attr) + attr_length;
if (*left > size) {
(*attr)->attr = htons(attrval);
(*attr)->len = htons(strlen(s));
memcpy((*attr)->value, s, strlen(s));
(*attr) = (struct stun_attr *)((*attr)->value + strlen(s));
(*attr)->len = htons(attr_length);
memcpy((*attr)->value, s, str_length);
memset((*attr)->value + str_length, 0, attr_length - str_length);
(*attr) = (struct stun_attr *)((*attr)->value + attr_length);
*len += size;
*left -= size;
}

Loading…
Cancel
Save