Skip to content

Commit

Permalink
Fix handling command handler status for group messages
Browse files Browse the repository at this point in the history
The command handler status is added for the response purposes
even in case of invoking commands targeted to the group.
In case of using more than one endpoint on a single
Matter node that was added to the same group, it leads to the
application crash. The direct reason is a state check,
that succeeds only for the first endpoint and fails for the
subsequent calls.

Added a new state flag, which informs if the command that is
currently handled origins from groupcast communication or not.
In case of targeting the group, application returns prematurely
and do not try to add status.

Fixes: project-chip#30472
  • Loading branch information
kkasperczyk-no committed Nov 15, 2023
1 parent 05f985a commit cd20a53
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 2 deletions.
6 changes: 5 additions & 1 deletion src/app/CommandHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,8 @@ Status CommandHandler::ProcessCommandDataIB(CommandDataIB::Parser & aCommandElem
ConcreteCommandPath concretePath(0, 0, 0);
TLV::TLVReader commandDataReader;

SetGroupRequest(false);

// NOTE: errors may occur before the concrete command path is even fully decoded.

err = aCommandElement.GetPath(&commandPath);
Expand Down Expand Up @@ -352,6 +354,7 @@ Status CommandHandler::ProcessGroupCommandDataIB(CommandDataIB::Parser & aComman
Credentials::GroupDataProvider::GroupEndpoint mapping;
Credentials::GroupDataProvider * groupDataProvider = Credentials::GetGroupDataProvider();
Credentials::GroupDataProvider::EndpointIterator * iterator;
SetGroupRequest(true);

err = aCommandElement.GetPath(&commandPath);
VerifyOrReturnError(err == CHIP_NO_ERROR, Status::InvalidAction);
Expand Down Expand Up @@ -462,7 +465,8 @@ CHIP_ERROR CommandHandler::AddStatusInternal(const ConcreteCommandPath & aComman
void CommandHandler::AddStatus(const ConcreteCommandPath & aCommandPath, const Protocols::InteractionModel::Status aStatus,
const char * context)
{

// Return prematurely in case of requests targeted to a group that should not add the status for response purposes.
VerifyOrReturn(!IsGroupRequest());
VerifyOrDie(FallibleAddStatus(aCommandPath, aStatus, context) == CHIP_NO_ERROR);
}

Expand Down
6 changes: 5 additions & 1 deletion src/app/CommandHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,9 @@ class CommandHandler : public Messaging::ExchangeDelegate
return FinishCommand(/* aEndDataStruct = */ false);
}

bool IsGroupRequest() { return mGroupRequest; }
void SetGroupRequest(bool isGroupRequest) { mGroupRequest = isGroupRequest; }

Messaging::ExchangeHolder mExchangeCtx;
Callback * mpCallback = nullptr;
InvokeResponseMessage::Builder mInvokeResponseBuilder;
Expand All @@ -416,7 +419,8 @@ class CommandHandler : public Messaging::ExchangeDelegate

bool mSentStatusResponse = false;

State mState = State::Idle;
State mState = State::Idle;
bool mGroupRequest = false;
chip::System::PacketBufferTLVWriter mCommandMessageWriter;
TLV::TLVWriter mBackupWriter;
bool mBufferAllocated = false;
Expand Down

0 comments on commit cd20a53

Please sign in to comment.