must zero osiSockAddr prior to use!

RTEMS depends on this or eg. bind()
will fail because comparison with
list of interface addresses is done
with memcmp()!
This commit is contained in:
Michael Davidsaver
2017-11-28 17:32:16 -06:00
parent bc0892a1ad
commit 0161799c93
9 changed files with 19 additions and 0 deletions

View File

@ -147,6 +147,7 @@ bool processSearchResponse(osiSockAddr const & responseFrom, ByteBuffer & receiv
/*int32 searchSequenceId = */receiveBuffer.getInt();
osiSockAddr serverAddress;
memset(&serverAddress, 0, sizeof(serverAddress));
serverAddress.ia.sin_family = AF_INET;
// 128-bit IPv6 address
@ -265,6 +266,7 @@ bool discoverServers(double timeOut)
}
osiSockAddr bindAddr;
memset(&bindAddr, 0, sizeof(bindAddr));
bindAddr.ia.sin_family = AF_INET;
bindAddr.ia.sin_port = htons(0);
bindAddr.ia.sin_addr.s_addr = htonl(INADDR_ANY);

View File

@ -39,6 +39,7 @@ BlockingTCPAcceptor::BlockingTCPAcceptor(
epicsThreadStackMedium),
epicsThreadPriorityMedium)
{
memset(&_bindAddress, 0, sizeof(_bindAddress));
_bindAddress.ia.sin_family = AF_INET;
_bindAddress.ia.sin_port = htons(port);
_bindAddress.ia.sin_addr.s_addr = htonl(INADDR_ANY);

View File

@ -343,6 +343,8 @@ bool BlockingUDPTransport::processBuffer(Transport::shared_pointer const & trans
{
// 128-bit IPv6 address
osiSockAddr originNIFAddress;
memset(&originNIFAddress, 0, sizeof(originNIFAddress));
if (decodeAsIPv6Address(receiveBuffer, &originNIFAddress))
{
originNIFAddress.ia.sin_family = AF_INET;
@ -566,6 +568,7 @@ void initializeUDPTransports(bool serverFlag,
//
osiSockAddr anyAddress;
memset(&anyAddress, 0, sizeof(anyAddress));
anyAddress.ia.sin_family = AF_INET;
anyAddress.ia.sin_port = htons(0);
anyAddress.ia.sin_addr.s_addr = htonl(INADDR_ANY);
@ -685,6 +688,7 @@ void initializeUDPTransports(bool serverFlag,
{
// where to bind (listen) address
osiSockAddr listenLocalAddress;
memset(&listenLocalAddress, 0, sizeof(listenLocalAddress));
listenLocalAddress.ia.sin_family = AF_INET;
listenLocalAddress.ia.sin_port = htons(listenPort);
listenLocalAddress.ia.sin_addr.s_addr = node.ifaceAddr.ia.sin_addr.s_addr;
@ -721,6 +725,7 @@ void initializeUDPTransports(bool serverFlag,
*/
osiSockAddr bcastAddress;
memset(&bcastAddress, 0, sizeof(bcastAddress));
bcastAddress.ia.sin_family = AF_INET;
bcastAddress.ia.sin_port = htons(listenPort);
bcastAddress.ia.sin_addr.s_addr = node.ifaceBCast.ia.sin_addr.s_addr;

View File

@ -2564,6 +2564,7 @@ public:
int32 searchSequenceId = payloadBuffer->getInt();
osiSockAddr serverAddress;
memset(&serverAddress, 0, sizeof(serverAddress));
serverAddress.ia.sin_family = AF_INET;
// 128-bit IPv6 address
@ -2627,6 +2628,7 @@ public:
payloadBuffer->getShort();
osiSockAddr responseAddress;
memset(&responseAddress, 0, sizeof(responseAddress));
responseAddress.ia.sin_family = AF_INET;
// 128-bit IPv6 address
@ -2715,6 +2717,7 @@ public:
int16 changeCount = payloadBuffer->getShort();
osiSockAddr serverAddress;
memset(&serverAddress, 0, sizeof(serverAddress));
serverAddress.ia.sin_family = AF_INET;
// 128-bit IPv6 address

View File

@ -254,6 +254,7 @@ void ServerSearchHandler::handleResponse(osiSockAddr* responseFrom,
payloadBuffer->getShort();
osiSockAddr responseAddress;
memset(&responseAddress, 0, sizeof(responseAddress));
responseAddress.ia.sin_family = AF_INET;
// 128-bit IPv6 address

View File

@ -126,6 +126,7 @@ void ServerContextImpl::loadConfiguration()
SET_LOG_LEVEL(logLevelDebug);
// TODO multiple addresses
memset(&_ifaceAddr, 0, sizeof(_ifaceAddr));
_ifaceAddr.ia.sin_family = AF_INET;
_ifaceAddr.ia.sin_addr.s_addr = htonl(INADDR_ANY);
_ifaceAddr.ia.sin_port = 0;

View File

@ -89,6 +89,7 @@ bool Configuration::getPropertyAsAddress(const std::string& name, osiSockAddr* a
if(val.empty()) return false;
memset(addr, 0, sizeof(*addr));
addr->ia.sin_family = AF_INET;
if(aToIPAddr(val.c_str(), dftport, &addr->ia))
return false;

View File

@ -27,6 +27,7 @@ namespace pvAccess {
void addDefaultBroadcastAddress(InetAddrVector* v, unsigned short p) {
osiSockAddr pNewNode;
memset(&pNewNode, 0, sizeof(pNewNode));
pNewNode.ia.sin_family = AF_INET;
// TODO this does not work in case of no active interfaces, should return 127.0.0.1 then
pNewNode.ia.sin_addr.s_addr = htonl(INADDR_BROADCAST);
@ -102,6 +103,7 @@ bool isMulticastAddress(const osiSockAddr* address) {
}
void intToIPv4Address(osiSockAddr& ret, int32 addr) {
memset(&ret, 0, sizeof(ret));
ret.ia.sin_family = AF_INET;
ret.ia.sin_addr.s_addr = htonl(addr);
ret.ia.sin_port = 0;
@ -205,6 +207,7 @@ int getLoopbackNIF(osiSockAddr &loAddr, string const & localNIF, unsigned short
}
// fallback
memset(&loAddr, 0, sizeof(loAddr));
loAddr.ia.sin_family = AF_INET;
loAddr.ia.sin_port = ntohs(port);
loAddr.ia.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
@ -514,6 +517,7 @@ int discoverInterfaces(IfaceNodeVector &list, SOCKET socket, const osiSockAddr *
const unsigned bcast = pIfinfo->iiBroadcastAddress.AddressIn.sin_addr.s_addr;
const unsigned addr = pIfinfo->iiAddress.AddressIn.sin_addr.s_addr;
unsigned result = (addr & mask) | (bcast &~mask);
memset(&node.ifaceBCast, 0, sizeof(node.ifaceBCast));
node.ifaceBCast.ia.sin_family = AF_INET;
node.ifaceBCast.ia.sin_addr.s_addr = result;
node.ifaceBCast.ia.sin_port = htons ( 0 );

View File

@ -243,6 +243,7 @@ void test_multicastLoopback()
epicsSocketEnableAddressUseForDatagramFanout(socket);
osiSockAddr bindAddr;
memset(&bindAddr, 0, sizeof(bindAddr));
bindAddr.ia.sin_family = AF_INET;
bindAddr.ia.sin_port = ntohs(port);
bindAddr.ia.sin_addr.s_addr = htonl(INADDR_ANY);