Skip to content

Commit ae1130f

Browse files
Merge pull request #19 from ESP32Async/fix/mem
fix(mem): Code cleanup and potential memory leak
2 parents 5c66a05 + ba077b3 commit ae1130f

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

src/AsyncTCP.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ static inline bool _get_async_event(lwip_tcp_event_packet_t **e) {
167167
*/
168168
lwip_tcp_event_packet_t *next_pkt = NULL;
169169
while (xQueuePeek(_async_queue, &next_pkt, 0) == pdPASS) {
170+
// if the next event that will come is a poll event for the same connection, we can discard it and continue
170171
if (next_pkt->arg == (*e)->arg && next_pkt->event == LWIP_TCP_POLL) {
171172
if (xQueueReceive(_async_queue, &next_pkt, 0) == pdPASS) {
172173
free(next_pkt);
@@ -176,7 +177,7 @@ static inline bool _get_async_event(lwip_tcp_event_packet_t **e) {
176177
}
177178
}
178179

179-
// quit while loop if next event can't be discarded
180+
// quit while loop if next incoming event can't be discarded (not a poll event)
180181
break;
181182
}
182183

@@ -193,9 +194,9 @@ static inline bool _get_async_event(lwip_tcp_event_packet_t **e) {
193194
free(*e);
194195
*e = NULL;
195196
log_d("discarding poll due to queue congestion");
196-
continue; // Retry
197+
continue; // continue main loop to dequeue next event which we know is not a poll event
197198
}
198-
return true;
199+
return true; // queue not nearly full, caller can process the poll event
199200
}
200201
return false;
201202
}
@@ -355,6 +356,7 @@ static int8_t _tcp_clear_events(void *arg) {
355356
e->arg = arg;
356357
if (!_prepend_async_event(&e)) {
357358
free((void *)(e));
359+
return ERR_TIMEOUT;
358360
}
359361
return ERR_OK;
360362
}
@@ -372,6 +374,7 @@ static int8_t _tcp_connected(void *arg, tcp_pcb *pcb, int8_t err) {
372374
e->connected.err = err;
373375
if (!_prepend_async_event(&e)) {
374376
free((void *)(e));
377+
return ERR_TIMEOUT;
375378
}
376379
return ERR_OK;
377380
}
@@ -396,6 +399,7 @@ static int8_t _tcp_poll(void *arg, struct tcp_pcb *pcb) {
396399
// poll events are not critical 'cause those are repetitive, so we may not wait the queue in any case
397400
if (!_send_async_event(&e, 0)) {
398401
free((void *)(e));
402+
return ERR_TIMEOUT;
399403
}
400404
return ERR_OK;
401405
}
@@ -423,6 +427,7 @@ static int8_t _tcp_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *pb, int8_t
423427
}
424428
if (!_send_async_event(&e)) {
425429
free((void *)(e));
430+
return ERR_TIMEOUT;
426431
}
427432
return ERR_OK;
428433
}
@@ -440,6 +445,7 @@ static int8_t _tcp_sent(void *arg, struct tcp_pcb *pcb, uint16_t len) {
440445
e->sent.len = len;
441446
if (!_send_async_event(&e)) {
442447
free((void *)(e));
448+
return ERR_TIMEOUT;
443449
}
444450
return ERR_OK;
445451
}
@@ -491,6 +497,7 @@ static int8_t _tcp_accept(void *arg, AsyncClient *client) {
491497
e->accept.client = client;
492498
if (!_prepend_async_event(&e)) {
493499
free((void *)(e));
500+
return ERR_TIMEOUT;
494501
}
495502
return ERR_OK;
496503
}
@@ -1614,7 +1621,11 @@ int8_t AsyncServer::_accept(tcp_pcb *pcb, int8_t err) {
16141621
AsyncClient *c = new AsyncClient(pcb);
16151622
if (c) {
16161623
c->setNoDelay(_noDelay);
1617-
return _tcp_accept(this, c);
1624+
const int8_t err = _tcp_accept(this, c);
1625+
if (err != ERR_OK) {
1626+
delete c;
1627+
}
1628+
return err;
16181629
}
16191630
}
16201631
if (tcp_close(pcb) != ERR_OK) {

0 commit comments

Comments
 (0)