Guard against nullptr+0 UB in call() and fix assert bound

- Add early return when size_==0 to avoid nullptr+0 pointer
  arithmetic (UB per C++ standard, even though all ESPHome
  targets treat it as no-op)
- Fix debug assert: size < UINT16_MAX allows capacity up to 65535
This commit is contained in:
J. Nick Koston
2026-03-27 16:47:56 -10:00
parent 967ded5477
commit fa2b14ef41
2 changed files with 4 additions and 1 deletions
+1 -1
View File
@@ -24,7 +24,7 @@ static const char *const TAG = "helpers";
__attribute__((noinline, cold)) void *callback_manager_grow(void *data, uint16_t size, uint16_t &capacity,
size_t elem_size) {
ESPHOME_DEBUG_ASSERT(size < UINT16_MAX - 1);
ESPHOME_DEBUG_ASSERT(size < UINT16_MAX);
uint16_t new_cap = size + 1;
auto *new_data = ::operator new(new_cap *elem_size);
if (data) {
+3
View File
@@ -1834,6 +1834,9 @@ template<typename... Ts> class CallbackManager<void(Ts...)> {
/// Call all callbacks in this manager.
inline void ESPHOME_ALWAYS_INLINE call(Ts... args) {
if (this->size_ == 0) {
return;
}
for (auto *it = this->data_, *end = it + this->size_; it != end; ++it) {
it->call(args...);
}