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:
@ -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();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user