comparison libfreeDiameter/messages.c @ 387:743195485eec

Additional fixes for empty octet string AVPs
author Sebastien Decugis <sdecugis@nict.go.jp>
date Tue, 06 Jul 2010 14:49:33 +0900
parents ce8d20725308
children bb8a4fa301b3
comparison
equal deleted inserted replaced
386:ce8d20725308 387:743195485eec
1136 1136
1137 /* Now we have to set the value */ 1137 /* Now we have to set the value */
1138 memcpy(&avp->avp_storage, value, sizeof(union avp_value)); 1138 memcpy(&avp->avp_storage, value, sizeof(union avp_value));
1139 1139
1140 /* Copy an octetstring if needed. */ 1140 /* Copy an octetstring if needed. */
1141 if ((type == AVP_TYPE_OCTETSTRING) && (value->os.len)) { 1141 if (type == AVP_TYPE_OCTETSTRING) {
1142 CHECK_MALLOC( avp->avp_storage.os.data = malloc(value->os.len) ); 1142 if (value->os.len) {
1143 avp->avp_mustfreeos = 1; 1143 CHECK_MALLOC( avp->avp_storage.os.data = malloc(value->os.len) );
1144 memcpy(avp->avp_storage.os.data, value->os.data, value->os.len); 1144 avp->avp_mustfreeos = 1;
1145 memcpy(avp->avp_storage.os.data, value->os.data, value->os.len);
1146 } else {
1147 avp->avp_storage.os.data = NULL;
1148 }
1145 } 1149 }
1146 1150
1147 /* Set the data pointer of the public part */ 1151 /* Set the data pointer of the public part */
1148 avp->avp_public.avp_value = &avp->avp_storage; 1152 avp->avp_public.avp_value = &avp->avp_storage;
1149 1153
1331 switch (dictdata.avp_basetype) { 1335 switch (dictdata.avp_basetype) {
1332 case AVP_TYPE_GROUPED: 1336 case AVP_TYPE_GROUPED:
1333 return bufferize_chain(buffer, buflen, offset, &avp->avp_chain.children); 1337 return bufferize_chain(buffer, buflen, offset, &avp->avp_chain.children);
1334 1338
1335 case AVP_TYPE_OCTETSTRING: 1339 case AVP_TYPE_OCTETSTRING:
1336 memcpy(&buffer[*offset], avp->avp_public.avp_value->os.data, avp->avp_public.avp_value->os.len); 1340 if (avp->avp_public.avp_value->os.len)
1341 memcpy(&buffer[*offset], avp->avp_public.avp_value->os.data, avp->avp_public.avp_value->os.len);
1337 *offset += PAD4(avp->avp_public.avp_value->os.len); 1342 *offset += PAD4(avp->avp_public.avp_value->os.len);
1338 break; 1343 break;
1339 1344
1340 case AVP_TYPE_INTEGER32: 1345 case AVP_TYPE_INTEGER32:
1341 PUT_in_buf_32(avp->avp_public.avp_value->i32, buffer + *offset); 1346 PUT_in_buf_32(avp->avp_public.avp_value->i32, buffer + *offset);
1618 /* we must copy the data from the source to the internal buffer area */ 1623 /* we must copy the data from the source to the internal buffer area */
1619 CHECK_PARAMS( !avp->avp_rawdata ); 1624 CHECK_PARAMS( !avp->avp_rawdata );
1620 1625
1621 avp->avp_rawlen = avp->avp_public.avp_len - GETAVPHDRSZ( avp->avp_public.avp_flags ); 1626 avp->avp_rawlen = avp->avp_public.avp_len - GETAVPHDRSZ( avp->avp_public.avp_flags );
1622 1627
1623 CHECK_MALLOC( avp->avp_rawdata = malloc(avp->avp_rawlen) ); 1628 if (avp->avp_rawlen) {
1624 1629 CHECK_MALLOC( avp->avp_rawdata = malloc(avp->avp_rawlen) );
1625 memcpy(avp->avp_rawdata, avp->avp_source, avp->avp_rawlen); 1630
1631 memcpy(avp->avp_rawdata, avp->avp_source, avp->avp_rawlen);
1632 }
1633
1626 avp->avp_source = NULL; 1634 avp->avp_source = NULL;
1627 1635
1628 TRACE_DEBUG(FULL, "Unsupported optional AVP found, raw source data saved in avp_rawdata."); 1636 TRACE_DEBUG(FULL, "Unsupported optional AVP found, raw source data saved in avp_rawdata.");
1629 } 1637 }
1630 1638
1672 return parsedict_do_chain(dict, &avp->avp_chain.children, mandatory && (avp->avp_public.avp_flags & AVP_FLAG_MANDATORY), error_info); 1680 return parsedict_do_chain(dict, &avp->avp_chain.children, mandatory && (avp->avp_public.avp_flags & AVP_FLAG_MANDATORY), error_info);
1673 } 1681 }
1674 1682
1675 case AVP_TYPE_OCTETSTRING: 1683 case AVP_TYPE_OCTETSTRING:
1676 /* We just have to copy the string into the storage area */ 1684 /* We just have to copy the string into the storage area */
1677 CHECK_PARAMS_DO( avp->avp_public.avp_len > GETAVPHDRSZ( avp->avp_public.avp_flags ), 1685 CHECK_PARAMS_DO( avp->avp_public.avp_len >= GETAVPHDRSZ( avp->avp_public.avp_flags ),
1678 { 1686 {
1679 if (error_info) { 1687 if (error_info) {
1680 error_info->pei_errcode = "DIAMETER_INVALID_AVP_LENGTH"; 1688 error_info->pei_errcode = "DIAMETER_INVALID_AVP_LENGTH";
1681 error_info->pei_avp = avp; 1689 error_info->pei_avp = avp;
1682 } 1690 }
1683 return EBADMSG; 1691 return EBADMSG;
1684 } ); 1692 } );
1685 avp->avp_storage.os.len = avp->avp_public.avp_len - GETAVPHDRSZ( avp->avp_public.avp_flags ); 1693 avp->avp_storage.os.len = avp->avp_public.avp_len - GETAVPHDRSZ( avp->avp_public.avp_flags );
1686 CHECK_MALLOC( avp->avp_storage.os.data = malloc(avp->avp_storage.os.len) ); 1694 if (avp->avp_storage.os.len) {
1687 avp->avp_mustfreeos = 1; 1695 CHECK_MALLOC( avp->avp_storage.os.data = malloc(avp->avp_storage.os.len) );
1688 memcpy(avp->avp_storage.os.data, avp->avp_source, avp->avp_storage.os.len); 1696 avp->avp_mustfreeos = 1;
1697 memcpy(avp->avp_storage.os.data, avp->avp_source, avp->avp_storage.os.len);
1698 } else {
1699 avp->avp_storage.os.data = NULL;
1700 }
1689 break; 1701 break;
1690 1702
1691 case AVP_TYPE_INTEGER32: 1703 case AVP_TYPE_INTEGER32:
1692 avp->avp_storage.i32 = (int32_t)ntohl(*(uint32_t *)avp->avp_source); 1704 avp->avp_storage.i32 = (int32_t)ntohl(*(uint32_t *)avp->avp_source);
1693 break; 1705 break;
"Welcome to our mercurial repository"