new/delete type mismatches are UB. Fix an instance of this
problem that occurs when sockaddr_in6 is allocated, but
sockaddr is deallocated, by always allocating/deallocating
sockaddr_storage.
AddressSanitizer: new-delete-type-mismatch:
object passed to delete has wrong type:
size of the allocated type: 28 bytes;
size of the deallocated type: 16 bytes.
#0 0xaaaad1a8db54 in operator delete(void*, unsigned long)
#1 0xaaaad287a668 in Ip::Address::FreeAddr(addrinfo*&)
src/ip/Address.cc:710:22
&& dst->ai_protocol == 0)
dst->ai_protocol = IPPROTO_UDP;
&& dst->ai_protocol == 0)
dst->ai_protocol = IPPROTO_UDP;
if (force == AF_INET6 || (force == AF_UNSPEC && isIPv6()) ) {
if (force == AF_INET6 || (force == AF_UNSPEC && isIPv6()) ) {
- dst->ai_addr = (struct sockaddr*)new sockaddr_in6;
-
- memset(dst->ai_addr,0,sizeof(struct sockaddr_in6));
-
getSockAddr(*((struct sockaddr_in6*)dst->ai_addr));
dst->ai_addrlen = sizeof(struct sockaddr_in6);
getSockAddr(*((struct sockaddr_in6*)dst->ai_addr));
dst->ai_addrlen = sizeof(struct sockaddr_in6);
#endif
} else if ( force == AF_INET || (force == AF_UNSPEC && isIPv4()) ) {
#endif
} else if ( force == AF_INET || (force == AF_UNSPEC && isIPv4()) ) {
-
- dst->ai_addr = (struct sockaddr*)new sockaddr_in;
-
- memset(dst->ai_addr,0,sizeof(struct sockaddr_in));
-
getSockAddr(*((struct sockaddr_in*)dst->ai_addr));
dst->ai_addrlen = sizeof(struct sockaddr_in);
getSockAddr(*((struct sockaddr_in*)dst->ai_addr));
dst->ai_addrlen = sizeof(struct sockaddr_in);
}
// remove any existing data.
}
// remove any existing data.
- if (ai->ai_addr) delete ai->ai_addr;
+ delete reinterpret_cast<struct sockaddr_storage *>(ai->ai_addr);
- ai->ai_addr = (struct sockaddr*)new sockaddr_in6;
- memset(ai->ai_addr, 0, sizeof(struct sockaddr_in6));
+ ai->ai_addr = reinterpret_cast<struct sockaddr *>(new sockaddr_storage);
+ memset(ai->ai_addr, 0, sizeof(struct sockaddr_storage));
- ai->ai_addrlen = sizeof(struct sockaddr_in6);
+ ai->ai_addrlen = sizeof(struct sockaddr_storage);
{
if (ai == nullptr) return;
{
if (ai == nullptr) return;
- if (ai->ai_addr) delete ai->ai_addr;
+ delete reinterpret_cast<struct sockaddr_storage *>(ai->ai_addr);