Skip to content

Commit ae149ff

Browse files
committedSep 30, 2018
Really free stack after last BearSSL obj destroyed
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 ae149ff

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed
 

‎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;

‎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)