From 0161799c93bf17c45517eb64f2b5a7255ab32dd4 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Tue, 28 Nov 2017 17:32:16 -0600 Subject: [PATCH] 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()! --- pvtoolsSrc/pvlist.cpp | 2 ++ src/remote/blockingTCPAcceptor.cpp | 1 + src/remote/blockingUDPTransport.cpp | 5 +++++ src/remoteClient/clientContextImpl.cpp | 3 +++ src/server/responseHandlers.cpp | 1 + src/server/serverContext.cpp | 1 + src/utils/configuration.cpp | 1 + src/utils/inetAddressUtil.cpp | 4 ++++ testApp/utils/testInetAddressUtils.cpp | 1 + 9 files changed, 19 insertions(+) diff --git a/pvtoolsSrc/pvlist.cpp b/pvtoolsSrc/pvlist.cpp index 090ec1b..0eff7bb 100644 --- a/pvtoolsSrc/pvlist.cpp +++ b/pvtoolsSrc/pvlist.cpp @@ -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); diff --git a/src/remote/blockingTCPAcceptor.cpp b/src/remote/blockingTCPAcceptor.cpp index 9938419..3e79500 100644 --- a/src/remote/blockingTCPAcceptor.cpp +++ b/src/remote/blockingTCPAcceptor.cpp @@ -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); diff --git a/src/remote/blockingUDPTransport.cpp b/src/remote/blockingUDPTransport.cpp index 0b2bce1..2437d54 100644 --- a/src/remote/blockingUDPTransport.cpp +++ b/src/remote/blockingUDPTransport.cpp @@ -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; diff --git a/src/remoteClient/clientContextImpl.cpp b/src/remoteClient/clientContextImpl.cpp index 7c7d269..0b2bde0 100644 --- a/src/remoteClient/clientContextImpl.cpp +++ b/src/remoteClient/clientContextImpl.cpp @@ -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 diff --git a/src/server/responseHandlers.cpp b/src/server/responseHandlers.cpp index e47fe4f..3a40c96 100644 --- a/src/server/responseHandlers.cpp +++ b/src/server/responseHandlers.cpp @@ -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 diff --git a/src/server/serverContext.cpp b/src/server/serverContext.cpp index 9db0871..cae42a6 100644 --- a/src/server/serverContext.cpp +++ b/src/server/serverContext.cpp @@ -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; diff --git a/src/utils/configuration.cpp b/src/utils/configuration.cpp index e791db9..7b811d6 100644 --- a/src/utils/configuration.cpp +++ b/src/utils/configuration.cpp @@ -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; diff --git a/src/utils/inetAddressUtil.cpp b/src/utils/inetAddressUtil.cpp index 3e148c1..f064de6 100644 --- a/src/utils/inetAddressUtil.cpp +++ b/src/utils/inetAddressUtil.cpp @@ -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 ); diff --git a/testApp/utils/testInetAddressUtils.cpp b/testApp/utils/testInetAddressUtils.cpp index b70d35a..024ebd3 100644 --- a/testApp/utils/testInetAddressUtils.cpp +++ b/testApp/utils/testInetAddressUtils.cpp @@ -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);