Fix crash in WiFiClient when read() called after stop() (#5197)
Thi may happen if read() gets called repeatedly (such as in HttpClient to parse response headers) and the connection is closed unexpectedly or the remote peer may have unexpected behavior that causes the underlying socket to report an error. In that case read() itself calls stop(), which invalidates the receive buffer object. Then when read() is called again without checking, such as inside readStringUntil(), the _rxBuffer is null and ESP32 crashes.
This commit is contained in:
parent
fb513c79fa
commit
cb7aef1e88
@ -442,20 +442,25 @@ size_t WiFiClient::write(Stream &stream)
|
|||||||
int WiFiClient::read(uint8_t *buf, size_t size)
|
int WiFiClient::read(uint8_t *buf, size_t size)
|
||||||
{
|
{
|
||||||
int res = -1;
|
int res = -1;
|
||||||
res = _rxBuffer->read(buf, size);
|
if (_rxBuffer) {
|
||||||
if(_rxBuffer->failed()) {
|
res = _rxBuffer->read(buf, size);
|
||||||
log_e("fail on fd %d, errno: %d, \"%s\"", fd(), errno, strerror(errno));
|
if(_rxBuffer->failed()) {
|
||||||
stop();
|
log_e("fail on fd %d, errno: %d, \"%s\"", fd(), errno, strerror(errno));
|
||||||
|
stop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int WiFiClient::peek()
|
int WiFiClient::peek()
|
||||||
{
|
{
|
||||||
int res = _rxBuffer->peek();
|
int res = -1;
|
||||||
if(_rxBuffer->failed()) {
|
if (_rxBuffer) {
|
||||||
log_e("fail on fd %d, errno: %d, \"%s\"", fd(), errno, strerror(errno));
|
res = _rxBuffer->peek();
|
||||||
stop();
|
if(_rxBuffer->failed()) {
|
||||||
|
log_e("fail on fd %d, errno: %d, \"%s\"", fd(), errno, strerror(errno));
|
||||||
|
stop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user