Skip to content

Commit e5760c3

Browse files
committed
Check for maximum preset count and maximum per-scenario preset count
1 parent 179ceba commit e5760c3

File tree

1 file changed

+48
-6
lines changed

1 file changed

+48
-6
lines changed

src/app/clusters/thermostat-server/thermostat-server-presets.cpp

+48-6
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ uint8_t CountNumberOfPendingPresets(Delegate * delegate)
196196
*
197197
* @return true if the presetScenario is found, false otherwise.
198198
*/
199-
bool PresetScenarioExistsInPresetTypes(Delegate * delegate, PresetScenarioEnum presetScenario)
199+
uint8_t MaximumPresetScenarioCount(Delegate * delegate, PresetScenarioEnum presetScenario)
200200
{
201201
VerifyOrReturnValue(delegate != nullptr, false);
202202

@@ -206,15 +206,15 @@ bool PresetScenarioExistsInPresetTypes(Delegate * delegate, PresetScenarioEnum p
206206
auto err = delegate->GetPresetTypeAtIndex(i, presetType);
207207
if (err != CHIP_NO_ERROR)
208208
{
209-
return false;
209+
return 0;
210210
}
211211

212212
if (presetType.presetScenario == presetScenario)
213213
{
214-
return true;
214+
return presetType.numberOfPresets;
215215
}
216216
}
217-
return false;
217+
return 0;
218218
}
219219

220220
/**
@@ -358,12 +358,17 @@ CHIP_ERROR ThermostatAttrAccess::AppendPendingPreset(Thermostat::Delegate * dele
358358
return CHIP_IM_GLOBAL_STATUS(ConstraintError);
359359
}
360360

361+
size_t presetCount = 0;
362+
size_t presetScenarioCount = 0;
361363
if (preset.presetHandle.IsNull())
362364
{
363365
if (IsBuiltIn(preset))
364366
{
365367
return CHIP_IM_GLOBAL_STATUS(ConstraintError);
366368
}
369+
// We're going to insert this preset, so let's assume a count as though it had already been inserted
370+
presetCount++;
371+
presetScenarioCount++;
367372
}
368373
else
369374
{
@@ -391,12 +396,49 @@ CHIP_ERROR ThermostatAttrAccess::AppendPendingPreset(Thermostat::Delegate * dele
391396
return CHIP_IM_GLOBAL_STATUS(ConstraintError);
392397
}
393398
}
394-
395-
if (!PresetScenarioExistsInPresetTypes(delegate, preset.presetScenario))
399+
uint8_t maximumPresetScenarioCount = MaximumPresetScenarioCount(delegate, preset.presetScenario);
400+
if (maximumPresetScenarioCount == 0)
396401
{
402+
// This is not a supported preset scenario
397403
return CHIP_IM_GLOBAL_STATUS(ConstraintError);
398404
}
399405

406+
for (uint8_t i = 0; true; i++)
407+
{
408+
PresetStructWithOwnedMembers otherPreset;
409+
CHIP_ERROR err = delegate->GetPresetAtIndex(i, otherPreset);
410+
411+
if (err == CHIP_ERROR_PROVIDER_LIST_EXHAUSTED)
412+
{
413+
break;
414+
}
415+
if (err != CHIP_NO_ERROR)
416+
{
417+
return CHIP_IM_GLOBAL_STATUS(InvalidInState);
418+
}
419+
presetCount++;
420+
if (!preset.presetHandle.IsNull() && otherPreset.GetPresetHandle().Value().data_equal(preset.presetHandle.Value()))
421+
{
422+
// This is the preset we're updating, so we don't care what its existing scenario is
423+
presetScenarioCount++;
424+
continue;
425+
}
426+
if (preset.presetScenario == otherPreset.GetPresetScenario())
427+
{
428+
presetScenarioCount++;
429+
}
430+
}
431+
432+
if (presetCount > delegate->GetNumberOfPresets())
433+
{
434+
return CHIP_IM_GLOBAL_STATUS(ResourceExhausted);
435+
}
436+
437+
if (presetScenarioCount > maximumPresetScenarioCount)
438+
{
439+
return CHIP_IM_GLOBAL_STATUS(ResourceExhausted);
440+
}
441+
400442
if (preset.name.HasValue() && !PresetTypeSupportsNames(delegate, preset.presetScenario))
401443
{
402444
return CHIP_IM_GLOBAL_STATUS(ConstraintError);

0 commit comments

Comments
 (0)