Skip to content

Commit 270788b

Browse files
Really free stack after last BearSSL obj destroyed (#5185)
The BearSSL second stack, once allocated, was never deallocated. The reference count of the stack pointer never hit 0 due to the initial creation counting as one. Now, check to see if there is only one use_count and if so then delete the stack.
1 parent 4e3af97 commit 270788b

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

Diff for: libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp

+14-2
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,16 @@ WiFiClientSecure::WiFiClientSecure() : WiFiClient() {
9191
_clear();
9292
_clearAuthenticationSettings();
9393
_certStore = nullptr; // Don't want to remove cert store on a clear, should be long lived
94+
_ensureStackAvailable();
95+
_local_bearssl_stack = _bearssl_stack;
96+
}
97+
98+
void WiFiClientSecure::_ensureStackAvailable() {
9499
if (!_bearssl_stack) {
95100
const int stacksize = 4500; // Empirically determined stack for EC and RSA connections
96101
_bearssl_stack = std::shared_ptr<uint8_t>(new uint8_t[stacksize], std::default_delete<uint8_t[]>());
97102
br_esp8266_stack_proxy_init(_bearssl_stack.get(), stacksize);
98103
}
99-
_local_bearssl_stack = _bearssl_stack;
100104
}
101105

102106
WiFiClientSecure::~WiFiClientSecure() {
@@ -106,7 +110,11 @@ WiFiClientSecure::~WiFiClientSecure() {
106110
}
107111
free(_cipher_list);
108112
_freeSSL();
109-
_local_bearssl_stack = nullptr; // Potentially delete it if we're the last SSL object
113+
_local_bearssl_stack = nullptr;
114+
// If there are no other uses than the initial creation, free the stack
115+
if (_bearssl_stack.use_count() == 1) {
116+
_bearssl_stack = nullptr;
117+
}
110118
if (_deleteChainKeyTA) {
111119
delete _ta;
112120
delete _chain;
@@ -119,6 +127,8 @@ WiFiClientSecure::WiFiClientSecure(ClientContext* client,
119127
int iobuf_in_size, int iobuf_out_size, const BearSSLX509List *client_CA_ta) {
120128
_clear();
121129
_clearAuthenticationSettings();
130+
_ensureStackAvailable();
131+
_local_bearssl_stack = _bearssl_stack;
122132
_iobuf_in_size = iobuf_in_size;
123133
_iobuf_out_size = iobuf_out_size;
124134
_client = client;
@@ -136,6 +146,8 @@ WiFiClientSecure::WiFiClientSecure(ClientContext *client,
136146
int iobuf_in_size, int iobuf_out_size, const BearSSLX509List *client_CA_ta) {
137147
_clear();
138148
_clearAuthenticationSettings();
149+
_ensureStackAvailable();
150+
_local_bearssl_stack = _bearssl_stack;
139151
_iobuf_in_size = iobuf_in_size;
140152
_iobuf_out_size = iobuf_out_size;
141153
_client = client;

Diff for: libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.h

+1
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ class WiFiClientSecure : public WiFiClient {
229229
private:
230230
// Single memory buffer used for BearSSL auxilliary stack, insead of growing main Arduino stack for all apps
231231
static std::shared_ptr<uint8_t> _bearssl_stack;
232+
void _ensureStackAvailable(); // Allocate the stack if necessary
232233
// The local copy, only used to enable a reference count
233234
std::shared_ptr<uint8_t> _local_bearssl_stack;
234235
};

0 commit comments

Comments
 (0)