Skip to content

Commit ff08cab

Browse files
committed
Address some of the Safer CPP warnings in DNSResolveQueueCFNet.cpp
https://bugs.webkit.org/show_bug.cgi?id=287469 Reviewed by Darin Adler. * Source/WTF/WTF.xcodeproj/project.pbxproj: * Source/WTF/wtf/posix/SocketPOSIX.h: Added. (WTF::isIPV4SocketAddress): (WTF::dynamicCastToIPV4SocketAddress): (WTF::asIPV4SocketAddress): (WTF::isIPV6Socket): (WTF::dynamicCastToIPV6SocketAddress): (WTF::asIPV6SocketAddress): * Source/WebCore/platform/network/cf/DNSResolveQueueCFNet.cpp: (WebCore::extractIPAddress): * Source/WebKit/NetworkProcess/webrtc/NetworkRTCMonitor.cpp: (WebKit::gatherNetworkMap): (WebKit::connectToRemoteAddress): * Source/WebKit/NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.mm: (WebKit::isNat64IPAddress): * Source/WebKit/Platform/cocoa/WebPrivacyHelpers.mm: (WebKit::ipAddress): * Source/WebKit/Shared/RTCNetwork.cpp: (WebKit::RTC::Network::IPAddress::IPAddress): Canonical link: https://commits.webkit.org/290259@main
1 parent 424816d commit ff08cab

File tree

9 files changed

+151
-42
lines changed

9 files changed

+151
-42
lines changed

Source/WTF/WTF.xcodeproj/project.pbxproj

+4
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
465F34932CD824AF000963B1 /* ObjCRuntimeExtras.mm in Sources */ = {isa = PBXBuildFile; fileRef = 465F34922CD824AF000963B1 /* ObjCRuntimeExtras.mm */; };
9595
466D69112BA4E433005D43F4 /* SpanCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 466D69102BA4E433005D43F4 /* SpanCocoa.h */; settings = {ATTRIBUTES = (Private, ); }; };
9696
467DCD532CD4689A0040C644 /* UnicodeExtras.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 467DCD522CD4689A0040C644 /* UnicodeExtras.cpp */; };
97+
468EAFD42D5B1E37005069CF /* SocketPOSIX.h in Headers */ = {isa = PBXBuildFile; fileRef = 468EAFD32D5B1E37005069CF /* SocketPOSIX.h */; settings = {ATTRIBUTES = (Private, ); }; };
9798
46B0FB5D2D24BFBA0012184C /* ParsingUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B0FB5C2D24BFBA0012184C /* ParsingUtilities.h */; settings = {ATTRIBUTES = (Private, ); }; };
9899
46B4C53C2D4F2D0A00BAA3FE /* NSStringExtras.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B4C53B2D4F2D0A00BAA3FE /* NSStringExtras.h */; settings = {ATTRIBUTES = (Private, ); }; };
99100
46BEB6EB22FFE24900269867 /* RefCounted.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46BEB6E922FFDDD500269867 /* RefCounted.cpp */; };
@@ -1246,6 +1247,7 @@
12461247
465F34922CD824AF000963B1 /* ObjCRuntimeExtras.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ObjCRuntimeExtras.mm; sourceTree = "<group>"; };
12471248
466D69102BA4E433005D43F4 /* SpanCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpanCocoa.h; sourceTree = "<group>"; };
12481249
467DCD522CD4689A0040C644 /* UnicodeExtras.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = UnicodeExtras.cpp; sourceTree = "<group>"; };
1250+
468EAFD32D5B1E37005069CF /* SocketPOSIX.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SocketPOSIX.h; sourceTree = "<group>"; };
12491251
46B0FB5C2D24BFBA0012184C /* ParsingUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParsingUtilities.h; sourceTree = "<group>"; };
12501252
46B4C53B2D4F2D0A00BAA3FE /* NSStringExtras.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NSStringExtras.h; sourceTree = "<group>"; };
12511253
46BA9EAB1F4CD61E009A2BBC /* CompletionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CompletionHandler.h; sourceTree = "<group>"; };
@@ -2096,6 +2098,7 @@
20962098
EB2C86D8267B275C0052CB9A /* CPUTimePOSIX.cpp */,
20972099
A331D96621F24ABD009F02AA /* FileSystemPOSIX.cpp */,
20982100
A3EE5C3921FFAC5E00FABD61 /* OSAllocatorPOSIX.cpp */,
2101+
468EAFD32D5B1E37005069CF /* SocketPOSIX.h */,
20992102
A32D8FA421FFFAB400780662 /* ThreadingPOSIX.cpp */,
21002103
);
21012104
path = posix;
@@ -3622,6 +3625,7 @@
36223625
DD3DC92F27A4BF8E007E5B61 /* SixCharacterHash.h in Headers */,
36233626
FA0C387B2BEAD56B00583842 /* SmallMap.h in Headers */,
36243627
DD3DC8DE27A4BF8E007E5B61 /* SmallSet.h in Headers */,
3628+
468EAFD42D5B1E37005069CF /* SocketPOSIX.h in Headers */,
36253629
DDF3076727C086CD006A526F /* SoftLinking.h in Headers */,
36263630
DD3DC8D727A4BF8E007E5B61 /* SoftLinking.h in Headers */,
36273631
DD3DC91F27A4BF8E007E5B61 /* SortedArrayMap.h in Headers */,

Source/WTF/wtf/posix/SocketPOSIX.h

+106
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
/*
2+
* Copyright (C) 2025 Apple Inc. All rights reserved.
3+
*
4+
* Redistribution and use in source and binary forms, with or without
5+
* modification, are permitted provided that the following conditions
6+
* are met:
7+
* 1. Redistributions of source code must retain the above copyright
8+
* notice, this list of conditions and the following disclaimer.
9+
* 2. Redistributions in binary form must reproduce the above copyright
10+
* notice, this list of conditions and the following disclaimer in the
11+
* documentation and/or other materials provided with the distribution.
12+
*
13+
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15+
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16+
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17+
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23+
* THE POSSIBILITY OF SUCH DAMAGE.
24+
*/
25+
26+
#pragma once
27+
28+
#include <sys/socket.h>
29+
#include <wtf/Compiler.h>
30+
#include <wtf/Function.h>
31+
#include <wtf/TypeCasts.h>
32+
33+
namespace WTF {
34+
35+
inline bool isIPV4SocketAddress(const struct sockaddr& socket)
36+
{
37+
return socket.sa_family == AF_INET;
38+
}
39+
40+
inline const struct sockaddr_in* dynamicCastToIPV4SocketAddress(const struct sockaddr& socket)
41+
{
42+
if (isIPV4SocketAddress(socket))
43+
SUPPRESS_MEMORY_UNSAFE_CAST return reinterpret_cast<const struct sockaddr_in*>(&socket);
44+
return nullptr;
45+
}
46+
47+
inline const struct sockaddr_in& asIPV4SocketAddress(const struct sockaddr& socket)
48+
{
49+
RELEASE_ASSERT(isIPV4SocketAddress(socket));
50+
SUPPRESS_MEMORY_UNSAFE_CAST return *reinterpret_cast<const struct sockaddr_in*>(&socket);
51+
}
52+
53+
inline bool initializeIPV4SocketAddress(sockaddr_storage& storage, NOESCAPE const Function<bool(sockaddr_in&)>& initialize)
54+
{
55+
zeroBytes(storage);
56+
SUPPRESS_MEMORY_UNSAFE_CAST auto& address = *reinterpret_cast<struct sockaddr_in*>(&storage);
57+
if (!initialize(address))
58+
return false;
59+
storage.ss_family = AF_INET;
60+
return true;
61+
}
62+
63+
inline bool isIPV6SocketAddress(const struct sockaddr& socket)
64+
{
65+
return socket.sa_family == AF_INET6;
66+
}
67+
68+
inline const struct sockaddr_in6* dynamicCastToIPV6SocketAddress(const struct sockaddr& socket)
69+
{
70+
if (isIPV6SocketAddress(socket))
71+
SUPPRESS_MEMORY_UNSAFE_CAST return reinterpret_cast<const struct sockaddr_in6*>(&socket);
72+
return nullptr;
73+
}
74+
75+
inline const struct sockaddr_in6& asIPV6SocketAddress(const struct sockaddr& socket)
76+
{
77+
RELEASE_ASSERT(isIPV6SocketAddress(socket));
78+
SUPPRESS_MEMORY_UNSAFE_CAST return *reinterpret_cast<const struct sockaddr_in6*>(&socket);
79+
}
80+
81+
inline bool initializeIPV6SocketAddress(sockaddr_storage& storage, NOESCAPE const Function<bool(sockaddr_in6&)>& initialize)
82+
{
83+
zeroBytes(storage);
84+
SUPPRESS_MEMORY_UNSAFE_CAST auto& address = *reinterpret_cast<struct sockaddr_in6*>(&storage);
85+
if (!initialize(address))
86+
return false;
87+
storage.ss_family = AF_INET6;
88+
return true;
89+
}
90+
91+
inline struct sockaddr& asSocketAddress(sockaddr_storage& storage)
92+
{
93+
SUPPRESS_MEMORY_UNSAFE_CAST return *reinterpret_cast<struct sockaddr*>(&storage);
94+
}
95+
96+
} // namespace WTF
97+
98+
using WTF::asIPV4SocketAddress;
99+
using WTF::asIPV6SocketAddress;
100+
using WTF::asSocketAddress;
101+
using WTF::dynamicCastToIPV4SocketAddress;
102+
using WTF::dynamicCastToIPV6SocketAddress;
103+
using WTF::initializeIPV4SocketAddress;
104+
using WTF::initializeIPV6SocketAddress;
105+
using WTF::isIPV4SocketAddress;
106+
using WTF::isIPV6SocketAddress;

Source/WebCore/SaferCPPExpectations/MemoryUnsafeCastCheckerExpectations

-1
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@ platform/mac/SerializedPlatformDataCueMac.mm
126126
platform/mac/WebCoreFullScreenWindow.mm
127127
platform/mediarecorder/cocoa/MediaRecorderPrivateWriterWebM.cpp
128128
platform/network/BlobResourceHandle.cpp
129-
platform/network/cf/DNSResolveQueueCFNet.cpp
130129
rendering/BidiRun.cpp
131130
rendering/BidiRun.h
132131
rendering/RenderAncestorIterator.h

Source/WebCore/platform/network/cf/DNSResolveQueueCFNet.cpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include <wtf/StdLibExtras.h>
4040
#include <wtf/URL.h>
4141
#include <wtf/cf/VectorCF.h>
42+
#include <wtf/posix/SocketPOSIX.h>
4243
#include <wtf/text/StringHash.h>
4344

4445
namespace WebCore {
@@ -100,10 +101,10 @@ static std::optional<IPAddress> extractIPAddress(const struct sockaddr* address)
100101
{
101102
if (!address)
102103
return std::nullopt;
103-
if (address->sa_family == AF_INET)
104-
return IPAddress { reinterpret_cast<const struct sockaddr_in*>(address)->sin_addr };
105-
if (address->sa_family == AF_INET6)
106-
return IPAddress { reinterpret_cast<const struct sockaddr_in6*>(address)->sin6_addr };
104+
if (auto* addressV4 = dynamicCastToIPV4SocketAddress(*address))
105+
return IPAddress { addressV4->sin_addr };
106+
if (auto* addressV6 = dynamicCastToIPV6SocketAddress(*address))
107+
return IPAddress { addressV6->sin6_addr };
107108
ASSERT_NOT_REACHED();
108109
return std::nullopt;
109110
}

Source/WebKit/NetworkProcess/webrtc/NetworkRTCMonitor.cpp

+22-24
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include <wtf/StdLibExtras.h>
4343
#include <wtf/WeakHashSet.h>
4444
#include <wtf/WorkQueue.h>
45+
#include <wtf/posix/SocketPOSIX.h>
4546

4647
#if PLATFORM(COCOA)
4748
#include <pal/spi/cocoa/NetworkSPI.h>
@@ -205,8 +206,8 @@ static HashMap<String, RTCNetwork> gatherNetworkMap()
205206
continue;
206207

207208
int scopeID = 0;
208-
if (iterator->ifa_addr->sa_family == AF_INET6)
209-
scopeID = reinterpret_cast<sockaddr_in6*>(iterator->ifa_addr)->sin6_scope_id;
209+
if (auto* address = dynamicCastToIPV6SocketAddress(*iterator->ifa_addr))
210+
scopeID = address->sin6_scope_id;
210211

211212
auto prefixLength = rtc::CountIPMaskBits(address->second.rtcAddress());
212213

@@ -229,33 +230,30 @@ static bool connectToRemoteAddress(int socket, bool useIPv4)
229230
const int publicPort = 53;
230231

231232
sockaddr_storage remoteAddressStorage;
232-
zeroBytes(remoteAddressStorage);
233233
size_t remoteAddressStorageLength = 0;
234+
bool success = false;
234235
if (useIPv4) {
235-
auto& remoteAddress = *reinterpret_cast<sockaddr_in*>(&remoteAddressStorage);
236-
remoteAddressStorageLength = sizeof(sockaddr_in);
237-
238-
remoteAddress.sin_family = AF_INET;
239-
remoteAddress.sin_port = publicPort;
240-
241-
if (!::inet_pton(AF_INET, publicHost, &remoteAddress.sin_addr)) {
242-
RELEASE_LOG_ERROR(WebRTC, "getDefaultIPAddress inet_pton failed, useIPv4=%d", useIPv4);
243-
return false;
244-
}
236+
success = initializeIPV4SocketAddress(remoteAddressStorage, [&](auto& remoteAddress) {
237+
remoteAddressStorageLength = sizeof(remoteAddress);
238+
remoteAddress.sin_family = AF_INET;
239+
remoteAddress.sin_port = publicPort;
240+
return ::inet_pton(AF_INET, publicHost, &remoteAddress.sin_addr);
241+
});
245242
} else {
246-
auto& remoteAddress = *reinterpret_cast<sockaddr_in6*>(&remoteAddressStorage);
247-
remoteAddressStorageLength = sizeof(sockaddr_in6);
248-
249-
remoteAddress.sin6_family = AF_INET6;
250-
remoteAddress.sin6_port = publicPort;
251-
252-
if (!::inet_pton(AF_INET6, publicHost, &remoteAddress.sin6_addr)) {
253-
RELEASE_LOG_ERROR(WebRTC, "getDefaultIPAddress inet_pton failed, useIPv4=%d", useIPv4);
254-
return false;
255-
}
243+
success = initializeIPV6SocketAddress(remoteAddressStorage, [&](auto& remoteAddress) {
244+
remoteAddressStorageLength = sizeof(remoteAddress);
245+
remoteAddress.sin6_family = AF_INET6;
246+
remoteAddress.sin6_port = publicPort;
247+
return ::inet_pton(AF_INET6, publicHost, &remoteAddress.sin6_addr);
248+
});
249+
}
250+
if (!success) {
251+
RELEASE_LOG_ERROR(WebRTC, "getDefaultIPAddress inet_pton failed, useIPv4=%d", useIPv4);
252+
return false;
256253
}
257254

258-
auto connectResult = ::connect(socket, reinterpret_cast<sockaddr*>(&remoteAddressStorage), remoteAddressStorageLength);
255+
auto& remoteAddress = asSocketAddress(remoteAddressStorage);
256+
auto connectResult = ::connect(socket, &remoteAddress, remoteAddressStorageLength);
259257
if (connectResult < 0) {
260258
RELEASE_LOG_ERROR(WebRTC, "getDefaultIPAddress connect failed, useIPv4=%d", useIPv4);
261259
return false;

Source/WebKit/NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.mm

+4-2
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include <wtf/TZoneMallocInlines.h>
4141
#include <wtf/ThreadSafeRefCounted.h>
4242
#include <wtf/cocoa/SpanCocoa.h>
43+
#include <wtf/posix/SocketPOSIX.h>
4344

4445
namespace WebKit {
4546

@@ -186,10 +187,11 @@ static inline bool isNat64IPAddress(const rtc::IPAddress& ip)
186187
std::unique_ptr<struct ifaddrs> toBeFreed(interfaces);
187188

188189
for (auto* interface = interfaces; interface; interface = interface->ifa_next) {
189-
if (interface->ifa_addr->sa_family != AF_INET)
190+
auto* address = dynamicCastToIPV4SocketAddress(*interface->ifa_addr);
191+
if (!address)
190192
continue;
191193

192-
rtc::IPAddress interfaceAddress { reinterpret_cast<sockaddr_in*>(interface->ifa_addr)->sin_addr };
194+
rtc::IPAddress interfaceAddress { address->sin_addr };
193195
if (ip != interfaceAddress)
194196
continue;
195197

Source/WebKit/Platform/cocoa/WebPrivacyHelpers.mm

+5-4
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
#import <wtf/Scope.h>
4545
#import <wtf/WeakRandom.h>
4646
#import <wtf/cocoa/VectorCocoa.h>
47+
#import <wtf/posix/SocketPOSIX.h>
4748
#import <wtf/text/MakeString.h>
4849
#import <pal/cocoa/WebPrivacySoftLink.h>
4950

@@ -432,11 +433,11 @@ static RestrictedOpenerType restrictedOpenerType(WPRestrictedOpenerType type)
432433

433434
inline static std::optional<WebCore::IPAddress> ipAddress(const struct sockaddr* address)
434435
{
435-
if (address->sa_family == AF_INET)
436-
return WebCore::IPAddress { reinterpret_cast<const sockaddr_in*>(address)->sin_addr };
436+
if (auto* addressV4 = dynamicCastToIPV4SocketAddress(*address))
437+
return WebCore::IPAddress { addressV4->sin_addr };
437438

438-
if (address->sa_family == AF_INET6)
439-
return WebCore::IPAddress { reinterpret_cast<const sockaddr_in6*>(address)->sin6_addr };
439+
if (auto* addressV6 = dynamicCastToIPV6SocketAddress(*address))
440+
return WebCore::IPAddress { addressV6->sin6_addr };
440441

441442
return std::nullopt;
442443
}

Source/WebKit/SaferCPPExpectations/MemoryUnsafeCastCheckerExpectations

-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ AutomationProtocolObjects.h
22
NetworkProcess/Downloads/cocoa/DownloadCocoa.mm
33
NetworkProcess/cocoa/WebSocketTaskCocoa.mm
44
NetworkProcess/webrtc/NetworkRTCMonitor.cpp
5-
NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.mm
65
Platform/cocoa/CocoaHelpers.mm
7-
Platform/cocoa/WebPrivacyHelpers.mm
86
Shared/API/APIArray.h
97
Shared/API/APIDictionary.h
108
Shared/API/c/WKSharedAPICast.h
@@ -13,7 +11,6 @@ Shared/API/c/cf/WKURLCF.mm
1311
Shared/APIWebArchive.mm
1412
Shared/Cocoa/WKNSURL.mm
1513
Shared/Cocoa/WKObject.h
16-
Shared/RTCNetwork.cpp
1714
Shared/UserData.cpp
1815
UIProcess/API/C/WKPage.cpp
1916
UIProcess/API/Cocoa/WKDownload.mm

Source/WebKit/Shared/RTCNetwork.cpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,13 @@
2424
*/
2525

2626
#include "config.h"
27+
28+
#if USE(LIBWEBRTC)
2729
#include "RTCNetwork.h"
2830

2931
#include <wtf/CrossThreadCopier.h>
3032
#include <wtf/StdLibExtras.h>
31-
32-
#if USE(LIBWEBRTC)
33+
#include <wtf/posix/SocketPOSIX.h>
3334

3435
namespace WebKit {
3536

@@ -131,10 +132,10 @@ IPAddress::IPAddress(const struct sockaddr& address)
131132
{
132133
switch (address.sa_family) {
133134
case AF_INET6:
134-
value = fromIPv6Address(reinterpret_cast<const sockaddr_in6*>(&address)->sin6_addr);
135+
value = fromIPv6Address(asIPV6SocketAddress(address).sin6_addr);
135136
break;
136137
case AF_INET:
137-
value = reinterpret_cast<const sockaddr_in*>(&address)->sin_addr.s_addr;
138+
value = asIPV4SocketAddress(address).sin_addr.s_addr;
138139
break;
139140
case AF_UNSPEC:
140141
value = UnspecifiedFamily { };

0 commit comments

Comments
 (0)