From d37390412cf18c4d86828ab7785a3b3e0b108022 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 13 Aug 2025 22:52:51 -0500 Subject: [PATCH 1/5] preen --- esphome/components/api/api_connection.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index 64abcf2e26..81cac8fa79 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -282,19 +282,20 @@ uint16_t APIConnection::encode_message_to_buffer(ProtoMessage &msg, uint8_t mess const uint8_t footer_size = conn->helper_->frame_footer_size(); // Calculate total size with padding - size_t total_size = calculated_size + header_padding + footer_size; + size_t total_calculated_size = calculated_size + header_padding + footer_size; // Check if it fits - if (total_size > remaining_size) { + if (total_calculated_size > remaining_size) { return 0; // Doesn't fit } // Get buffer and prepare it inline std::vector &shared_buf = conn->parent_->get_shared_buffer_ref(); + size_t size_before_encode = shared_buf.size(); if (is_single || conn->flags_.batch_first_message) { // Single message or first batch message - conn->prepare_first_message_buffer(shared_buf, header_padding, total_size); + conn->prepare_first_message_buffer(shared_buf, header_padding, total_calculated_size); if (conn->flags_.batch_first_message) { conn->flags_.batch_first_message = false; } @@ -302,13 +303,12 @@ uint16_t APIConnection::encode_message_to_buffer(ProtoMessage &msg, uint8_t mess // Batch message second or later // Add padding for previous message footer + this message header size_t current_size = shared_buf.size(); - shared_buf.reserve(current_size + total_size); + shared_buf.reserve(current_size + total_calculated_size); shared_buf.resize(current_size + footer_size + header_padding); } // Encode directly into buffer ProtoWriteBuffer buffer{&shared_buf}; - size_t size_before_encode = shared_buf.size(); msg.encode(buffer); // Calculate actual encoded size (not including header that was already added) From deff1c4bc7fe9f5a7ca7f6b7fbbda40e88f7c50b Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 13 Aug 2025 22:53:12 -0500 Subject: [PATCH 2/5] preen --- esphome/components/api/api_connection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index 81cac8fa79..c8600048f7 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -281,7 +281,7 @@ uint16_t APIConnection::encode_message_to_buffer(ProtoMessage &msg, uint8_t mess const uint8_t header_padding = conn->helper_->frame_header_padding(); const uint8_t footer_size = conn->helper_->frame_footer_size(); - // Calculate total size with padding + // Calculate total size with padding for buffer allocation size_t total_calculated_size = calculated_size + header_padding + footer_size; // Check if it fits From 97c405b57e4a83258a8524634a4221d6e788b73c Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 13 Aug 2025 22:53:33 -0500 Subject: [PATCH 3/5] preen --- esphome/components/api/api_connection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index c8600048f7..c8e6480e1e 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -289,7 +289,7 @@ uint16_t APIConnection::encode_message_to_buffer(ProtoMessage &msg, uint8_t mess return 0; // Doesn't fit } - // Get buffer and prepare it inline + // Get buffer size after allocation (which includes header padding) std::vector &shared_buf = conn->parent_->get_shared_buffer_ref(); size_t size_before_encode = shared_buf.size(); From 51bf2c35116b6a6494a076a12f9149401253278a Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 13 Aug 2025 22:55:06 -0500 Subject: [PATCH 4/5] preen --- esphome/components/api/api_connection.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index c8e6480e1e..fc4bf6b4f2 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -302,9 +302,8 @@ uint16_t APIConnection::encode_message_to_buffer(ProtoMessage &msg, uint8_t mess } else { // Batch message second or later // Add padding for previous message footer + this message header - size_t current_size = shared_buf.size(); - shared_buf.reserve(current_size + total_calculated_size); - shared_buf.resize(current_size + footer_size + header_padding); + shared_buf.reserve(size_before_encode + total_calculated_size); + shared_buf.resize(size_before_encode + footer_size + header_padding); } // Encode directly into buffer From 0207444765f6bebc3daf654cf87bec09d54661b1 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 13 Aug 2025 22:58:04 -0500 Subject: [PATCH 5/5] preen --- esphome/components/api/api_connection.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index fc4bf6b4f2..75c033cc76 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -307,8 +307,7 @@ uint16_t APIConnection::encode_message_to_buffer(ProtoMessage &msg, uint8_t mess } // Encode directly into buffer - ProtoWriteBuffer buffer{&shared_buf}; - msg.encode(buffer); + msg.encode({&shared_buf}); // Calculate actual encoded size (not including header that was already added) size_t actual_payload_size = shared_buf.size() - size_before_encode;