Skip to content

Commit c644692

Browse files
Darwin: Fix error handling in GetMACAddressFromInterfaces (project-chip#32658)
Correctly return CHIP_ERROR_NOT_FOUND when there is no active, primary interface to get the MAC address from. Also tidy up management of IOKit objects. (Use of IOObjectGetRetainCount is completely wrong here.)
1 parent cc576dc commit c644692

File tree

1 file changed

+11
-17
lines changed

1 file changed

+11
-17
lines changed

src/platform/Darwin/ConfigurationManagerImpl.cpp

+11-17
Original file line numberDiff line numberDiff line change
@@ -93,20 +93,20 @@ CHIP_ERROR FindInterfaces(io_iterator_t * primaryInterfaceIterator)
9393

9494
CHIP_ERROR GetMACAddressFromInterfaces(io_iterator_t primaryInterfaceIterator, uint8_t * buf)
9595
{
96-
CHIP_ERROR err = CHIP_NO_ERROR;
96+
CHIP_ERROR err = CHIP_ERROR_NOT_FOUND;
9797

9898
kern_return_t kernResult;
9999
io_object_t interfaceService;
100100
io_object_t controllerService = 0;
101101

102102
while ((interfaceService = IOIteratorNext(primaryInterfaceIterator)))
103103
{
104-
CFTypeRef MACAddressAsCFData = nullptr;
105-
CFTypeRef linkStatusAsCFNumber = nullptr;
106-
kernResult = IORegistryEntryGetParentEntry(interfaceService, kIOServicePlane, &controllerService);
104+
kernResult = IORegistryEntryGetParentEntry(interfaceService, kIOServicePlane, &controllerService);
105+
IOObjectRelease(interfaceService);
107106
VerifyOrExit(KERN_SUCCESS == kernResult, err = CHIP_ERROR_INTERNAL);
108107

109-
linkStatusAsCFNumber = IORegistryEntryCreateCFProperty(controllerService, CFSTR(kIOLinkStatus), kCFAllocatorDefault, 0);
108+
CFTypeRef linkStatusAsCFNumber =
109+
IORegistryEntryCreateCFProperty(controllerService, CFSTR(kIOLinkStatus), kCFAllocatorDefault, 0);
110110
VerifyOrExit(linkStatusAsCFNumber != nullptr, err = CHIP_ERROR_INTERNAL);
111111

112112
uint64_t linkStatus;
@@ -115,27 +115,21 @@ CHIP_ERROR GetMACAddressFromInterfaces(io_iterator_t primaryInterfaceIterator, u
115115

116116
if ((linkStatus & kIONetworkLinkValid) && (linkStatus & kIONetworkLinkActive))
117117
{
118-
MACAddressAsCFData = IORegistryEntryCreateCFProperty(controllerService, CFSTR(kIOMACAddress), kCFAllocatorDefault, 0);
118+
CFTypeRef MACAddressAsCFData =
119+
IORegistryEntryCreateCFProperty(controllerService, CFSTR(kIOMACAddress), kCFAllocatorDefault, 0);
119120
VerifyOrExit(MACAddressAsCFData != nullptr, err = CHIP_ERROR_INTERNAL);
120121

121122
CFDataGetBytes((CFDataRef) MACAddressAsCFData, CFRangeMake(0, kIOEthernetAddressSize), buf);
122123
CFRelease(MACAddressAsCFData);
124+
ExitNow(err = CHIP_NO_ERROR);
123125
}
124126

125-
kernResult = IOObjectRelease(controllerService);
126-
VerifyOrExit(KERN_SUCCESS == kernResult, err = CHIP_ERROR_INTERNAL);
127-
128-
kernResult = IOObjectRelease(interfaceService);
129-
VerifyOrExit(KERN_SUCCESS == kernResult, err = CHIP_ERROR_INTERNAL);
127+
IOObjectRelease(controllerService);
128+
controllerService = 0;
130129
}
131130

132131
exit:
133-
if (IOObjectGetRetainCount(interfaceService))
134-
{
135-
IOObjectRelease(interfaceService);
136-
}
137-
138-
if (IOObjectGetRetainCount(controllerService))
132+
if (controllerService)
139133
{
140134
IOObjectRelease(controllerService);
141135
}

0 commit comments

Comments
 (0)