Skip to content

Commit

Permalink
Fixing crashes when comparing objects to nil (project-chip#34321)
Browse files Browse the repository at this point in the history
* Fixing nil check crashes

* Restyled by clang-format

---------

Co-authored-by: Restyled.io <[email protected]>
  • Loading branch information
2 people authored and j-ororke committed Jul 15, 2024
1 parent 8037cb3 commit 214a1c2
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 9 deletions.
37 changes: 29 additions & 8 deletions src/darwin/Framework/CHIP/MTRBaseDevice.mm
Original file line number Diff line number Diff line change
Expand Up @@ -2290,8 +2290,12 @@ + (MTRAttributeRequestPath *)requestPathWithEndpointID:(NSNumber * _Nullable)end

- (BOOL)isEqualToAttributeRequestPath:(MTRAttributeRequestPath *)path
{
return [_endpoint isEqualToNumber:path.endpoint] && [_cluster isEqualToNumber:path.cluster] &&
[_attribute isEqualToNumber:path.attribute];
if (!path)
return NO;

return (path.endpoint && [_endpoint isEqualToNumber:path.endpoint])
&& (path.cluster && [_cluster isEqualToNumber:path.cluster])
&& (path.attribute && [_attribute isEqualToNumber:path.attribute]);
}

- (BOOL)isEqual:(id)object
Expand Down Expand Up @@ -2362,8 +2366,12 @@ + (MTREventRequestPath *)requestPathWithEndpointID:(NSNumber * _Nullable)endpoin

- (BOOL)isEqualToEventRequestPath:(MTREventRequestPath *)path
{
return
[_endpoint isEqualToNumber:path.endpoint] && [_cluster isEqualToNumber:path.cluster] && [_event isEqualToNumber:path.event];
if (!path)
return NO;

return (path.endpoint && [_endpoint isEqualToNumber:path.endpoint])
&& (path.cluster && [_cluster isEqualToNumber:path.cluster])
&& (path.event && [_event isEqualToNumber:path.event]);
}

- (BOOL)isEqual:(id)object
Expand Down Expand Up @@ -2432,7 +2440,11 @@ ConcreteClusterPath path(static_cast<chip::EndpointId>([endpointID unsignedShort

- (BOOL)isEqualToClusterPath:(MTRClusterPath *)clusterPath
{
return [_endpoint isEqualToNumber:clusterPath.endpoint] && [_cluster isEqualToNumber:clusterPath.cluster];
if (!clusterPath)
return NO;

return (clusterPath.endpoint && [_endpoint isEqualToNumber:clusterPath.endpoint])
&& (clusterPath.cluster && [_cluster isEqualToNumber:clusterPath.cluster]);
}

- (BOOL)isEqual:(id)object
Expand Down Expand Up @@ -2520,7 +2532,10 @@ ConcreteDataAttributePath path(static_cast<chip::EndpointId>([endpointID unsigne

- (BOOL)isEqualToAttributePath:(MTRAttributePath *)attributePath
{
return [self isEqualToClusterPath:attributePath] && [_attribute isEqualToNumber:attributePath.attribute];
if (!attributePath)
return NO;

return [self isEqualToClusterPath:attributePath] && attributePath.attribute && [_attribute isEqualToNumber:attributePath.attribute];
}

- (BOOL)isEqual:(id)object
Expand Down Expand Up @@ -2613,7 +2628,10 @@ ConcreteEventPath path(static_cast<chip::EndpointId>([endpointID unsignedShortVa

- (BOOL)isEqualToEventPath:(MTREventPath *)eventPath
{
return [self isEqualToClusterPath:eventPath] && [_event isEqualToNumber:eventPath.event];
if (!eventPath)
return NO;

return [self isEqualToClusterPath:eventPath] && eventPath.event && [_event isEqualToNumber:eventPath.event];
}

- (BOOL)isEqual:(id)object
Expand Down Expand Up @@ -2703,7 +2721,10 @@ ConcreteCommandPath path(static_cast<chip::EndpointId>([endpointID unsignedShort

- (BOOL)isEqualToCommandPath:(MTRCommandPath *)commandPath
{
return [self isEqualToClusterPath:commandPath] && [_command isEqualToNumber:commandPath.command];
if (!commandPath)
return NO;

return [self isEqualToClusterPath:commandPath] && commandPath.command && [_command isEqualToNumber:commandPath.command];
}

- (BOOL)isEqual:(id)object
Expand Down
6 changes: 5 additions & 1 deletion src/darwin/Framework/CHIP/MTRDevice.mm
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,11 @@ - (id)copyWithZone:(NSZone *)zone

- (BOOL)isEqualToClusterData:(MTRDeviceClusterData *)otherClusterData
{
return [_dataVersion isEqual:otherClusterData.dataVersion] && [_attributes isEqual:otherClusterData.attributes];
if (!otherClusterData)
return NO;

return (otherClusterData.dataVersion && [_dataVersion isEqual:otherClusterData.dataVersion])
&& (otherClusterData.attributes && [_attributes isEqual:otherClusterData.attributes]);
}

- (BOOL)isEqual:(id)object
Expand Down

0 comments on commit 214a1c2

Please sign in to comment.