1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-07-26 07:02:15 +03:00

Fix a crash due to abort() called from TCP error callback (#428)

This commit is contained in:
Ivan Grokhotkov
2015-09-28 16:04:34 +03:00
parent 55d992ed9e
commit 6b7b802706

View File

@ -1,9 +1,9 @@
/* /*
ClientContext.h - TCP connection handling on top of lwIP ClientContext.h - TCP connection handling on top of lwIP
Copyright (c) 2014 Ivan Grokhotkov. All rights reserved. Copyright (c) 2014 Ivan Grokhotkov. All rights reserved.
This file is part of the esp8266 core for Arduino environment. This file is part of the esp8266 core for Arduino environment.
This library is free software; you can redistribute it and/or This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either License as published by the Free Software Foundation; either
@ -39,7 +39,7 @@ class ClientContext {
tcp_sent(pcb, &_s_sent); tcp_sent(pcb, &_s_sent);
tcp_err(pcb, &_s_error); tcp_err(pcb, &_s_error);
} }
err_t abort(){ err_t abort(){
if(_pcb) { if(_pcb) {
DEBUGV(":abort\r\n"); DEBUGV(":abort\r\n");
@ -52,7 +52,7 @@ class ClientContext {
} }
return ERR_ABRT; return ERR_ABRT;
} }
err_t close(){ err_t close(){
err_t err = ERR_OK; err_t err = ERR_OK;
if(_pcb) { if(_pcb) {
@ -71,7 +71,7 @@ class ClientContext {
} }
return err; return err;
} }
~ClientContext() { ~ClientContext() {
} }
@ -101,18 +101,18 @@ class ClientContext {
} }
} }
} }
void setNoDelay(bool nodelay){ void setNoDelay(bool nodelay){
if(!_pcb) return; if(!_pcb) return;
if(nodelay) tcp_nagle_disable(_pcb); if(nodelay) tcp_nagle_disable(_pcb);
else tcp_nagle_enable(_pcb); else tcp_nagle_enable(_pcb);
} }
bool getNoDelay(){ bool getNoDelay(){
if(!_pcb) return false; if(!_pcb) return false;
return tcp_nagle_disabled(_pcb); return tcp_nagle_disabled(_pcb);
} }
uint32_t getRemoteAddress() { uint32_t getRemoteAddress() {
if(!_pcb) return 0; if(!_pcb) return 0;
@ -277,16 +277,11 @@ class ClientContext {
void _error(err_t err) { void _error(err_t err) {
DEBUGV(":er %d %d %d\r\n", err, _size_sent, _send_waiting); DEBUGV(":er %d %d %d\r\n", err, _size_sent, _send_waiting);
if (err != ERR_ABRT) { tcp_arg(_pcb, NULL);
abort(); tcp_sent(_pcb, NULL);
} tcp_recv(_pcb, NULL);
else { tcp_err(_pcb, NULL);
tcp_arg(_pcb, NULL); _pcb = NULL;
tcp_sent(_pcb, NULL);
tcp_recv(_pcb, NULL);
tcp_err(_pcb, NULL);
_pcb = NULL;
}
if(_size_sent && _send_waiting) { if(_size_sent && _send_waiting) {
esp_schedule(); esp_schedule();
} }