Mercurial > hg > freeDiameter
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; |