mirror of
https://github.com/esphome/esphome.git
synced 2025-11-19 00:05:43 +00:00
[light] Fix dangling reference in compute_color_mode causing memory corruption (#11868)
This commit is contained in:
@@ -476,8 +476,9 @@ uint16_t APIConnection::try_send_light_info(EntityBase *entity, APIConnection *c
|
|||||||
auto *light = static_cast<light::LightState *>(entity);
|
auto *light = static_cast<light::LightState *>(entity);
|
||||||
ListEntitiesLightResponse msg;
|
ListEntitiesLightResponse msg;
|
||||||
auto traits = light->get_traits();
|
auto traits = light->get_traits();
|
||||||
|
auto supported_modes = traits.get_supported_color_modes();
|
||||||
// Pass pointer to ColorModeMask so the iterator can encode actual ColorMode enum values
|
// Pass pointer to ColorModeMask so the iterator can encode actual ColorMode enum values
|
||||||
msg.supported_color_modes = &traits.get_supported_color_modes();
|
msg.supported_color_modes = &supported_modes;
|
||||||
if (traits.supports_color_capability(light::ColorCapability::COLOR_TEMPERATURE) ||
|
if (traits.supports_color_capability(light::ColorCapability::COLOR_TEMPERATURE) ||
|
||||||
traits.supports_color_capability(light::ColorCapability::COLD_WARM_WHITE)) {
|
traits.supports_color_capability(light::ColorCapability::COLD_WARM_WHITE)) {
|
||||||
msg.min_mireds = traits.get_min_mireds();
|
msg.min_mireds = traits.get_min_mireds();
|
||||||
|
|||||||
@@ -406,7 +406,7 @@ void LightCall::transform_parameters_() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ColorMode LightCall::compute_color_mode_() {
|
ColorMode LightCall::compute_color_mode_() {
|
||||||
const auto &supported_modes = this->parent_->get_traits().get_supported_color_modes();
|
auto supported_modes = this->parent_->get_traits().get_supported_color_modes();
|
||||||
int supported_count = supported_modes.size();
|
int supported_count = supported_modes.size();
|
||||||
|
|
||||||
// Some lights don't support any color modes (e.g. monochromatic light), leave it at unknown.
|
// Some lights don't support any color modes (e.g. monochromatic light), leave it at unknown.
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ class LightTraits {
|
|||||||
public:
|
public:
|
||||||
LightTraits() = default;
|
LightTraits() = default;
|
||||||
|
|
||||||
const ColorModeMask &get_supported_color_modes() const { return this->supported_color_modes_; }
|
// Return by value to avoid dangling reference when get_traits() returns a temporary
|
||||||
|
ColorModeMask get_supported_color_modes() const { return this->supported_color_modes_; }
|
||||||
void set_supported_color_modes(ColorModeMask supported_color_modes) {
|
void set_supported_color_modes(ColorModeMask supported_color_modes) {
|
||||||
this->supported_color_modes_ = supported_color_modes;
|
this->supported_color_modes_ = supported_color_modes;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user