Index: channels/chan_sip.c =================================================================== --- channels/chan_sip.c (revision 95233) +++ channels/chan_sip.c (working copy) @@ -3258,10 +3258,13 @@ static int sip_addrcmp(char *name, struct sockaddr_in *sin) { /* We know name is the first field, so we can cast */ - struct sip_peer *p = (struct sip_peer *) name; - return !(!inaddrcmp(&p->addr, sin) || - (ast_test_flag(&p->flags[0], SIP_INSECURE_PORT) && - (p->addr.sin_addr.s_addr == sin->sin_addr.s_addr))); + union { + char *name; + struct sip_peer *p; + } u = { name, }; + return !(!inaddrcmp(&u.p->addr, sin) || + (ast_test_flag(&u.p->flags[0], SIP_INSECURE_PORT) && + (u.p->addr.sin_addr.s_addr == sin->sin_addr.s_addr))); } /*! \brief Locate peer by name or ip address Index: channels/chan_iax2.c =================================================================== --- channels/chan_iax2.c (revision 95233) +++ channels/chan_iax2.c (working copy) @@ -6919,15 +6919,18 @@ static int send_trunk(struct iax2_trunk_peer *tpeer, struct timeval *now) { int res = 0; - struct iax_frame *fr; + union { + struct iax_frame *fr; + unsigned char *trunkdata; + } u; struct ast_iax2_meta_hdr *meta; struct ast_iax2_meta_trunk_hdr *mth; int calls = 0; /* Point to frame */ - fr = (struct iax_frame *)tpeer->trunkdata; + u.trunkdata = tpeer->trunkdata; /* Point to meta data */ - meta = (struct ast_iax2_meta_hdr *)fr->afdata; + meta = (struct ast_iax2_meta_hdr *)u.fr->afdata; mth = (struct ast_iax2_meta_trunk_hdr *)meta->data; if (tpeer->trunkdatalen) { /* We're actually sending a frame, so fill the meta trunk header and meta header */ @@ -6939,16 +6942,16 @@ meta->cmddata = IAX_META_TRUNK_SUPERMINI; mth->ts = htonl(calc_txpeerstamp(tpeer, trunkfreq, now)); /* And the rest of the ast_iax2 header */ - fr->direction = DIRECTION_OUTGRESS; - fr->retrans = -1; - fr->transfer = 0; + u.fr->direction = DIRECTION_OUTGRESS; + u.fr->retrans = -1; + u.fr->transfer = 0; /* Any appropriate call will do */ - fr->data = fr->afdata; - fr->datalen = tpeer->trunkdatalen + sizeof(struct ast_iax2_meta_hdr) + sizeof(struct ast_iax2_meta_trunk_hdr); - res = transmit_trunk(fr, &tpeer->addr, tpeer->sockfd); + u.fr->data = u.fr->afdata; + u.fr->datalen = tpeer->trunkdatalen + sizeof(struct ast_iax2_meta_hdr) + sizeof(struct ast_iax2_meta_trunk_hdr); + res = transmit_trunk(u.fr, &tpeer->addr, tpeer->sockfd); calls = tpeer->calls; #if 0 - ast_debug(1, "Trunking %d call chunks in %d bytes to %s:%d, ts=%d\n", calls, fr->datalen, ast_inet_ntoa(tpeer->addr.sin_addr), ntohs(tpeer->addr.sin_port), ntohl(mth->ts)); + ast_debug(1, "Trunking %d call chunks in %d bytes to %s:%d, ts=%d\n", calls, u.fr->datalen, ast_inet_ntoa(tpeer->addr.sin_addr), ntohs(tpeer->addr.sin_port), ntohl(mth->ts)); #endif /* Reset transmit trunk side data */ tpeer->trunkdatalen = 0; Index: channels/iax2-parser.c =================================================================== --- channels/iax2-parser.c (revision 95233) +++ channels/iax2-parser.c (working copy) @@ -610,11 +610,23 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen) { /* Parse data into information elements */ - int len; - int ie; char tmp[256], *tmp2; struct ast_variable *var, *var2, *prev; unsigned int count; + struct { + char ie; + unsigned char len; + union { + struct sockaddr_in sin; + char str[255]; + unsigned char byte; + int value; + struct { + unsigned char count; + char tok[254]; + } osp; + } ata; + } *d = (void *)data; memset(ies, 0, (int)sizeof(struct iax_ies)); ies->msgcount = -1; ies->firmwarever = -1; @@ -622,154 +634,152 @@ ies->calling_tns = -1; ies->calling_pres = -1; ies->samprate = IAX_RATE_8KHZ; - while(datalen >= 2) { - ie = data[0]; - len = data[1]; - if (len > datalen - 2) { + while (datalen >= 2) { + if (d->len > datalen - 2) { errorf("Information element length exceeds message size\n"); return -1; } - switch(ie) { + switch(d->ie) { case IAX_IE_CALLED_NUMBER: - ies->called_number = (char *)data + 2; + ies->called_number = d->ata.str; break; case IAX_IE_CALLING_NUMBER: - ies->calling_number = (char *)data + 2; + ies->calling_number = d->ata.str; break; case IAX_IE_CALLING_ANI: - ies->calling_ani = (char *)data + 2; + ies->calling_ani = d->ata.str; break; case IAX_IE_CALLING_NAME: - ies->calling_name = (char *)data + 2; + ies->calling_name = d->ata.str; break; case IAX_IE_CALLED_CONTEXT: - ies->called_context = (char *)data + 2; + ies->called_context = d->ata.str; break; case IAX_IE_USERNAME: - ies->username = (char *)data + 2; + ies->username = d->ata.str; break; case IAX_IE_PASSWORD: - ies->password = (char *)data + 2; + ies->password = d->ata.str; break; case IAX_IE_CODEC_PREFS: - ies->codec_prefs = (char *)data + 2; + ies->codec_prefs = d->ata.str; break; case IAX_IE_CAPABILITY: - if (len != (int)sizeof(unsigned int)) { - snprintf(tmp, (int)sizeof(tmp), "Expecting capability to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); + if (d->len != (int)sizeof(unsigned int)) { + snprintf(tmp, (int)sizeof(tmp), "Expecting capability to be %d bytes long but was %d\n", (int)sizeof(unsigned int), d->len); errorf(tmp); } else - ies->capability = ntohl(get_unaligned_uint32(data + 2)); + ies->capability = ntohl(get_unaligned_uint32(&d->ata.value)); break; case IAX_IE_FORMAT: - if (len != (int)sizeof(unsigned int)) { - snprintf(tmp, (int)sizeof(tmp), "Expecting format to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); + if (d->len != (int)sizeof(unsigned int)) { + snprintf(tmp, (int)sizeof(tmp), "Expecting format to be %d bytes long but was %d\n", (int)sizeof(unsigned int), d->len); errorf(tmp); } else - ies->format = ntohl(get_unaligned_uint32(data + 2)); + ies->format = ntohl(get_unaligned_uint32(&d->ata.value)); break; case IAX_IE_LANGUAGE: - ies->language = (char *)data + 2; + ies->language = d->ata.str; break; case IAX_IE_VERSION: - if (len != (int)sizeof(unsigned short)) { - snprintf(tmp, (int)sizeof(tmp), "Expecting version to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); + if (d->len != (int)sizeof(unsigned short)) { + snprintf(tmp, (int)sizeof(tmp), "Expecting version to be %d bytes long but was %d\n", (int)sizeof(unsigned short), d->len); errorf(tmp); } else - ies->version = ntohs(get_unaligned_uint16(data + 2)); + ies->version = ntohs(get_unaligned_uint16(&d->ata.value)); break; case IAX_IE_ADSICPE: - if (len != (int)sizeof(unsigned short)) { - snprintf(tmp, (int)sizeof(tmp), "Expecting adsicpe to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); + if (d->len != (int)sizeof(unsigned short)) { + snprintf(tmp, (int)sizeof(tmp), "Expecting adsicpe to be %d bytes long but was %d\n", (int)sizeof(unsigned short), d->len); errorf(tmp); } else - ies->adsicpe = ntohs(get_unaligned_uint16(data + 2)); + ies->adsicpe = ntohs(get_unaligned_uint16(&d->ata.value)); break; case IAX_IE_SAMPLINGRATE: - if (len != (int)sizeof(unsigned short)) { - snprintf(tmp, (int)sizeof(tmp), "Expecting samplingrate to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); + if (d->len != (int)sizeof(unsigned short)) { + snprintf(tmp, (int)sizeof(tmp), "Expecting samplingrate to be %d bytes long but was %d\n", (int)sizeof(unsigned short), d->len); errorf(tmp); } else - ies->samprate = ntohs(get_unaligned_uint16(data + 2)); + ies->samprate = ntohs(get_unaligned_uint16(&d->ata.value)); break; case IAX_IE_DNID: - ies->dnid = (char *)data + 2; + ies->dnid = d->ata.str; break; case IAX_IE_RDNIS: - ies->rdnis = (char *)data + 2; + ies->rdnis = d->ata.str; break; case IAX_IE_AUTHMETHODS: - if (len != (int)sizeof(unsigned short)) { - snprintf(tmp, (int)sizeof(tmp), "Expecting authmethods to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); + if (d->len != (int)sizeof(unsigned short)) { + snprintf(tmp, (int)sizeof(tmp), "Expecting authmethods to be %d bytes long but was %d\n", (int)sizeof(unsigned short), d->len); errorf(tmp); } else - ies->authmethods = ntohs(get_unaligned_uint16(data + 2)); + ies->authmethods = ntohs(get_unaligned_uint16(&d->ata.value)); break; case IAX_IE_ENCRYPTION: - if (len != (int)sizeof(unsigned short)) { - snprintf(tmp, (int)sizeof(tmp), "Expecting encryption to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); + if (d->len != (int)sizeof(unsigned short)) { + snprintf(tmp, (int)sizeof(tmp), "Expecting encryption to be %d bytes long but was %d\n", (int)sizeof(unsigned short), d->len); errorf(tmp); } else - ies->encmethods = ntohs(get_unaligned_uint16(data + 2)); + ies->encmethods = ntohs(get_unaligned_uint16(&d->ata.value)); break; case IAX_IE_CHALLENGE: - ies->challenge = (char *)data + 2; + ies->challenge = d->ata.str; break; case IAX_IE_MD5_RESULT: - ies->md5_result = (char *)data + 2; + ies->md5_result = d->ata.str; break; case IAX_IE_RSA_RESULT: - ies->rsa_result = (char *)data + 2; + ies->rsa_result = d->ata.str; break; case IAX_IE_APPARENT_ADDR: - ies->apparent_addr = ((struct sockaddr_in *)(data + 2)); + ies->apparent_addr = &d->ata.sin; break; case IAX_IE_REFRESH: - if (len != (int)sizeof(unsigned short)) { - snprintf(tmp, (int)sizeof(tmp), "Expecting refresh to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); + if (d->len != (int)sizeof(unsigned short)) { + snprintf(tmp, sizeof(tmp), "Expecting refresh to be %d bytes long but was %d\n", (int)sizeof(unsigned short), d->len); errorf(tmp); } else - ies->refresh = ntohs(get_unaligned_uint16(data + 2)); + ies->refresh = ntohs(get_unaligned_uint16(&d->ata.value)); break; case IAX_IE_DPSTATUS: - if (len != (int)sizeof(unsigned short)) { - snprintf(tmp, (int)sizeof(tmp), "Expecting dpstatus to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); + if (d->len != (int)sizeof(unsigned short)) { + snprintf(tmp, sizeof(tmp), "Expecting dpstatus to be %d bytes long but was %d\n", (int)sizeof(unsigned short), d->len); errorf(tmp); } else - ies->dpstatus = ntohs(get_unaligned_uint16(data + 2)); + ies->dpstatus = ntohs(get_unaligned_uint16(&d->ata.value)); break; case IAX_IE_CALLNO: - if (len != (int)sizeof(unsigned short)) { - snprintf(tmp, (int)sizeof(tmp), "Expecting callno to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); + if (d->len != (int)sizeof(unsigned short)) { + snprintf(tmp, sizeof(tmp), "Expecting callno to be %d bytes long but was %d\n", (int)sizeof(unsigned short), d->len); errorf(tmp); } else - ies->callno = ntohs(get_unaligned_uint16(data + 2)); + ies->callno = ntohs(get_unaligned_uint16(&d->ata.value)); break; case IAX_IE_CAUSE: - ies->cause = (char *)data + 2; + ies->cause = d->ata.str; break; case IAX_IE_CAUSECODE: - if (len != 1) { - snprintf(tmp, (int)sizeof(tmp), "Expecting causecode to be single byte but was %d\n", len); + if (d->len != 1) { + snprintf(tmp, (int)sizeof(tmp), "Expecting causecode to be single byte but was %d\n", d->len); errorf(tmp); } else { - ies->causecode = data[2]; + ies->causecode = d->ata.byte; } break; case IAX_IE_IAX_UNKNOWN: - if (len == 1) - ies->iax_unknown = data[2]; + if (d->len == 1) + ies->iax_unknown = d->ata.byte; else { - snprintf(tmp, (int)sizeof(tmp), "Expected single byte Unknown command, but was %d long\n", len); + snprintf(tmp, (int)sizeof(tmp), "Expected single byte Unknown command, but was %d long\n", d->len); errorf(tmp); } break; case IAX_IE_MSGCOUNT: - if (len != (int)sizeof(unsigned short)) { - snprintf(tmp, (int)sizeof(tmp), "Expecting msgcount to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); + if (d->len != (int)sizeof(unsigned short)) { + snprintf(tmp, (int)sizeof(tmp), "Expecting msgcount to be %d bytes long but was %d\n", (int)sizeof(unsigned short), d->len); errorf(tmp); } else - ies->msgcount = ntohs(get_unaligned_uint16(data + 2)); + ies->msgcount = ntohs(get_unaligned_uint16(&d->ata.value)); break; case IAX_IE_AUTOANSWER: ies->autoanswer = 1; @@ -778,129 +788,129 @@ ies->musiconhold = 1; break; case IAX_IE_TRANSFERID: - if (len != (int)sizeof(unsigned int)) { - snprintf(tmp, (int)sizeof(tmp), "Expecting transferid to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); + if (d->len != (int)sizeof(unsigned int)) { + snprintf(tmp, (int)sizeof(tmp), "Expecting transferid to be %d bytes long but was %d\n", (int)sizeof(unsigned int), d->len); errorf(tmp); } else - ies->transferid = ntohl(get_unaligned_uint32(data + 2)); + ies->transferid = ntohl(get_unaligned_uint32(&d->ata.value)); break; case IAX_IE_DATETIME: - if (len != (int)sizeof(unsigned int)) { - snprintf(tmp, (int)sizeof(tmp), "Expecting date/time to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); + if (d->len != (int)sizeof(unsigned int)) { + snprintf(tmp, (int)sizeof(tmp), "Expecting date/time to be %d bytes long but was %d\n", (int)sizeof(unsigned int), d->len); errorf(tmp); } else - ies->datetime = ntohl(get_unaligned_uint32(data + 2)); + ies->datetime = ntohl(get_unaligned_uint32(&d->ata.value)); break; case IAX_IE_FIRMWAREVER: - if (len != (int)sizeof(unsigned short)) { - snprintf(tmp, (int)sizeof(tmp), "Expecting firmwarever to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); + if (d->len != (int)sizeof(unsigned short)) { + snprintf(tmp, (int)sizeof(tmp), "Expecting firmwarever to be %d bytes long but was %d\n", (int)sizeof(unsigned short), d->len); errorf(tmp); } else - ies->firmwarever = ntohs(get_unaligned_uint16(data + 2)); + ies->firmwarever = ntohs(get_unaligned_uint16(&d->ata.value)); break; case IAX_IE_DEVICETYPE: - ies->devicetype = (char *)data + 2; + ies->devicetype = d->ata.str; break; case IAX_IE_SERVICEIDENT: - ies->serviceident = (char *)data + 2; + ies->serviceident = d->ata.str; break; case IAX_IE_FWBLOCKDESC: - if (len != (int)sizeof(unsigned int)) { - snprintf(tmp, (int)sizeof(tmp), "Expected block desc to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); + if (d->len != (int)sizeof(unsigned int)) { + snprintf(tmp, (int)sizeof(tmp), "Expected block desc to be %d bytes long but was %d\n", (int)sizeof(unsigned int), d->len); errorf(tmp); } else - ies->fwdesc = ntohl(get_unaligned_uint32(data + 2)); + ies->fwdesc = ntohl(get_unaligned_uint32(&d->ata.value)); break; case IAX_IE_FWBLOCKDATA: - ies->fwdata = data + 2; - ies->fwdatalen = len; + ies->fwdata = (unsigned char *)d->ata.str; + ies->fwdatalen = d->len; break; case IAX_IE_ENCKEY: - ies->enckey = data + 2; - ies->enckeylen = len; + ies->enckey = (unsigned char *)d->ata.str; + ies->enckeylen = d->len; break; case IAX_IE_PROVVER: - if (len != (int)sizeof(unsigned int)) { - snprintf(tmp, (int)sizeof(tmp), "Expected provisioning version to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); + if (d->len != (int)sizeof(unsigned int)) { + snprintf(tmp, (int)sizeof(tmp), "Expected provisioning version to be %d bytes long but was %d\n", (int)sizeof(unsigned int), d->len); errorf(tmp); } else { ies->provverpres = 1; - ies->provver = ntohl(get_unaligned_uint32(data + 2)); + ies->provver = ntohl(get_unaligned_uint32(&d->ata.value)); } break; case IAX_IE_CALLINGPRES: - if (len == 1) - ies->calling_pres = data[2]; + if (d->len == 1) + ies->calling_pres = d->ata.byte; else { - snprintf(tmp, (int)sizeof(tmp), "Expected single byte callingpres, but was %d long\n", len); + snprintf(tmp, (int)sizeof(tmp), "Expected single byte callingpres, but was %d long\n", d->len); errorf(tmp); } break; case IAX_IE_CALLINGTON: - if (len == 1) - ies->calling_ton = data[2]; + if (d->len == 1) + ies->calling_ton = d->ata.byte; else { - snprintf(tmp, (int)sizeof(tmp), "Expected single byte callington, but was %d long\n", len); + snprintf(tmp, (int)sizeof(tmp), "Expected single byte callington, but was %d long\n", d->len); errorf(tmp); } break; case IAX_IE_CALLINGTNS: - if (len != (int)sizeof(unsigned short)) { - snprintf(tmp, (int)sizeof(tmp), "Expecting callingtns to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); + if (d->len != (int)sizeof(unsigned short)) { + snprintf(tmp, (int)sizeof(tmp), "Expecting callingtns to be %d bytes long but was %d\n", (int)sizeof(unsigned short), d->len); errorf(tmp); } else - ies->calling_tns = ntohs(get_unaligned_uint16(data + 2)); + ies->calling_tns = ntohs(get_unaligned_uint16(&d->ata.value)); break; - case IAX_IE_RR_JITTER: - if (len != (int)sizeof(unsigned int)) { - snprintf(tmp, (int)sizeof(tmp), "Expected jitter rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); - errorf(tmp); - } else { - ies->rr_jitter = ntohl(get_unaligned_uint32(data + 2)); - } - break; - case IAX_IE_RR_LOSS: - if (len != (int)sizeof(unsigned int)) { - snprintf(tmp, (int)sizeof(tmp), "Expected loss rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); - errorf(tmp); - } else { - ies->rr_loss = ntohl(get_unaligned_uint32(data + 2)); - } - break; - case IAX_IE_RR_PKTS: - if (len != (int)sizeof(unsigned int)) { - snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); - errorf(tmp); - } else { - ies->rr_pkts = ntohl(get_unaligned_uint32(data + 2)); - } - break; - case IAX_IE_RR_DELAY: - if (len != (int)sizeof(unsigned short)) { - snprintf(tmp, (int)sizeof(tmp), "Expected loss rr to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); - errorf(tmp); - } else { - ies->rr_delay = ntohs(get_unaligned_uint16(data + 2)); - } - break; + case IAX_IE_RR_JITTER: + if (d->len != (int)sizeof(unsigned int)) { + snprintf(tmp, (int)sizeof(tmp), "Expected jitter rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), d->len); + errorf(tmp); + } else { + ies->rr_jitter = ntohl(get_unaligned_uint32(&d->ata.value)); + } + break; + case IAX_IE_RR_LOSS: + if (d->len != (int)sizeof(unsigned int)) { + snprintf(tmp, (int)sizeof(tmp), "Expected loss rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), d->len); + errorf(tmp); + } else { + ies->rr_loss = ntohl(get_unaligned_uint32(&d->ata.value)); + } + break; + case IAX_IE_RR_PKTS: + if (d->len != (int)sizeof(unsigned int)) { + snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), d->len); + errorf(tmp); + } else { + ies->rr_pkts = ntohl(get_unaligned_uint32(&d->ata.value)); + } + break; + case IAX_IE_RR_DELAY: + if (d->len != (int)sizeof(unsigned short)) { + snprintf(tmp, (int)sizeof(tmp), "Expected loss rr to be %d bytes long but was %d\n", (int)sizeof(unsigned short), d->len); + errorf(tmp); + } else { + ies->rr_delay = ntohs(get_unaligned_uint16(&d->ata.value)); + } + break; case IAX_IE_RR_DROPPED: - if (len != (int)sizeof(unsigned int)) { - snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); + if (d->len != (int)sizeof(unsigned int)) { + snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), d->len); errorf(tmp); } else { - ies->rr_dropped = ntohl(get_unaligned_uint32(data + 2)); + ies->rr_dropped = ntohl(get_unaligned_uint32(&d->ata.value)); } break; case IAX_IE_RR_OOO: - if (len != (int)sizeof(unsigned int)) { - snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); + if (d->len != (int)sizeof(unsigned int)) { + snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), d->len); errorf(tmp); } else { - ies->rr_ooo = ntohl(get_unaligned_uint32(data + 2)); + ies->rr_ooo = ntohl(get_unaligned_uint32(&d->ata.value)); } break; case IAX_IE_VARIABLE: - ast_copy_string(tmp, (char *)data + 2, len + 1); + ast_copy_string(tmp, d->ata.str, d->len + 1); tmp2 = strchr(tmp, '='); if (tmp2) *tmp2++ = '\0'; @@ -929,25 +939,25 @@ } break; case IAX_IE_OSPTOKEN: - if ((count = data[2]) < IAX_MAX_OSPBLOCK_NUM) { - ies->osptokenblock[count] = (char *)data + 2 + 1; - ies->ospblocklength[count] = len - 1; + if ((count = d->ata.osp.count) < IAX_MAX_OSPBLOCK_NUM) { + ies->osptokenblock[count] = d->ata.osp.tok; + ies->ospblocklength[count] = d->len - 1; } else { snprintf(tmp, (int)sizeof(tmp), "Expected OSP token block index to be 0~%d but was %d\n", IAX_MAX_OSPBLOCK_NUM - 1, count); errorf(tmp); } break; default: - snprintf(tmp, (int)sizeof(tmp), "Ignoring unknown information element '%s' (%d) of length %d\n", iax_ie2str(ie), ie, len); + snprintf(tmp, (int)sizeof(tmp), "Ignoring unknown information element '%s' (%d) of length %d\n", iax_ie2str(d->ie), d->ie, d->len); outputf(tmp); } /* Overwrite information element with 0, to null terminate previous portion */ - data[0] = 0; - datalen -= (len + 2); - data += (len + 2); + d->ie = 0; + datalen -= (d->len + 2); + d += (d->len + 2); } /* Null-terminate last field */ - *data = '\0'; + d->ie = '\0'; if (datalen) { errorf("Invalid information element contents, strange boundary\n"); return -1;