Skip to content
This repository was archived by the owner on Jan 20, 2025. It is now read-only.

Commit 2cc9846

Browse files
michalfapsome-no-dev
authored andcommitted
fix: SyncClient memory leak, handling connect() errors (#31)
* fix: SyncClient memory leak, handling connect() errors SyncClient didn't delete the _client object when an error occurred in connect(), before _onConnect(). Also, _client was not properly deleted in such case. * fix: SyncClient memory leak, handling connect() errors ...also for the connect(ip)
1 parent e3ef50b commit 2cc9846

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

src/SyncClient.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ int SyncClient::connect(IPAddress ip, uint16_t port){
6262
return 0;
6363
_client = new AsyncClient();
6464
_client->onConnect([](void *obj, AsyncClient *c){ ((SyncClient*)(obj))->_onConnect(c); }, this);
65+
_attachCallbacks_Disconnect();
6566
#if ASYNC_TCP_SSL_ENABLED
6667
if(_client->connect(ip, port, secure)){
6768
#else
@@ -83,6 +84,7 @@ int SyncClient::connect(const char *host, uint16_t port){
8384
return 0;
8485
_client = new AsyncClient();
8586
_client->onConnect([](void *obj, AsyncClient *c){ ((SyncClient*)(obj))->_onConnect(c); }, this);
87+
_attachCallbacks_Disconnect();
8688
#if ASYNC_TCP_SSL_ENABLED
8789
if(_client->connect(host, port, secure)){
8890
#else
@@ -191,16 +193,24 @@ void SyncClient::_onConnect(AsyncClient *c){
191193
delete b;
192194
}
193195
_tx_buffer = new cbuf(_tx_buffer_size);
194-
_attachCallbacks();
196+
_attachCallbacks_AfterConnected();
195197
}
196198

197199
void SyncClient::_attachCallbacks(){
200+
_attachCallbacks_Disconnect();
201+
_attachCallbacks_AfterConnected();
202+
}
203+
204+
void SyncClient::_attachCallbacks_AfterConnected(){
198205
_client->onAck([](void *obj, AsyncClient* c, size_t len, uint32_t time){ ((SyncClient*)(obj))->_sendBuffer(); }, this);
199-
_client->onDisconnect([](void *obj, AsyncClient* c){ ((SyncClient*)(obj))->_onDisconnect(); delete c; }, this);
200206
_client->onData([](void *obj, AsyncClient* c, void *data, size_t len){ ((SyncClient*)(obj))->_onData(data, len); }, this);
201207
_client->onTimeout([](void *obj, AsyncClient* c, uint32_t time){ c->close(); }, this);
202208
}
203209

210+
void SyncClient::_attachCallbacks_Disconnect(){
211+
_client->onDisconnect([](void *obj, AsyncClient* c){ ((SyncClient*)(obj))->_onDisconnect(); delete c; }, this);
212+
}
213+
204214
size_t SyncClient::write(uint8_t data){
205215
return write(&data, 1);
206216
}

src/SyncClient.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ class SyncClient: public Client {
3939
void _onConnect(AsyncClient *c);
4040
void _onDisconnect();
4141
void _attachCallbacks();
42+
void _attachCallbacks_Disconnect();
43+
void _attachCallbacks_AfterConnected();
4244

4345
public:
4446
SyncClient(size_t txBufLen = 1460);

0 commit comments

Comments
 (0)