Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Crocker <dcrocker@eschertech.com>2020-12-07 17:45:24 +0300
committerDavid Crocker <dcrocker@eschertech.com>2020-12-07 17:45:24 +0300
commitfd792ed4e723508d829497ba3c89218407f83d17 (patch)
tree142c2db9ab7e6df3650bace88e9c0b6d60e38315 /src/Networking/LwipEthernet/LwipEthernetInterface.cpp
parent27ef732453f21abacd3a8dd8a0f6407a58586e12 (diff)
Fixes for call to conn_accept with null PCB
Diffstat (limited to 'src/Networking/LwipEthernet/LwipEthernetInterface.cpp')
-rw-r--r--src/Networking/LwipEthernet/LwipEthernetInterface.cpp59
1 files changed, 46 insertions, 13 deletions
diff --git a/src/Networking/LwipEthernet/LwipEthernetInterface.cpp b/src/Networking/LwipEthernet/LwipEthernetInterface.cpp
index 07c47311..935ed9ef 100644
--- a/src/Networking/LwipEthernet/LwipEthernetInterface.cpp
+++ b/src/Networking/LwipEthernet/LwipEthernetInterface.cpp
@@ -63,18 +63,22 @@ extern "C"
}
// Callback functions for LWIP (may be called from ISR)
+ // This occasionally seems to get called with a null pcb argument, so check for that here
static err_t conn_accept(void *arg, tcp_pcb *pcb, err_t err)
{
LWIP_UNUSED_ARG(arg);
LWIP_UNUSED_ARG(err);
- if (ethernetInterface->ConnectionEstablished(pcb))
+ if (pcb != nullptr)
{
- // A socket has accepted this connection and will deal with it
- return ERR_OK;
- }
+ if (ethernetInterface->ConnectionEstablished(pcb))
+ {
+ // A socket has accepted this connection and will deal with it
+ return ERR_OK;
+ }
- tcp_abort(pcb);
+ tcp_abort(pcb);
+ }
return ERR_ABRT;
}
@@ -201,9 +205,24 @@ void LwipEthernetInterface::StartProtocol(NetworkProtocol protocol) noexcept
if (listeningPcbs[protocol] == nullptr)
{
tcp_pcb *pcb = tcp_new();
- tcp_bind(pcb, IP_ADDR_ANY, portNumbers[protocol]);
- listeningPcbs[protocol] = tcp_listen(pcb);
- tcp_accept(listeningPcbs[protocol], conn_accept);
+ if (pcb == nullptr)
+ {
+ platform.Message(ErrorMessage, "unable to allocate a pcb\n");
+ }
+ else
+ {
+ tcp_bind(pcb, IP_ADDR_ANY, portNumbers[protocol]);
+ pcb = tcp_listen(pcb);
+ if (pcb == nullptr)
+ {
+ platform.Message(ErrorMessage, "tcp_listen call failed\n");
+ }
+ else
+ {
+ listeningPcbs[protocol] = pcb;
+ tcp_accept(listeningPcbs[protocol], conn_accept);
+ }
+ }
}
switch(protocol)
@@ -591,11 +610,25 @@ void LwipEthernetInterface::OpenDataPort(TcpPort port) noexcept
}
tcp_pcb *pcb = tcp_new();
- tcp_bind(pcb, IP_ADDR_ANY, port);
- listeningPcbs[NumProtocols] = tcp_listen(pcb);
- tcp_accept(listeningPcbs[NumProtocols], conn_accept);
-
- sockets[FtpDataSocketNumber]->Init(FtpDataSocketNumber, port, FtpDataProtocol);
+ if (pcb == nullptr)
+ {
+ platform.Message(ErrorMessage, "unable to allocate a pcb\n");
+ }
+ else
+ {
+ tcp_bind(pcb, IP_ADDR_ANY, port);
+ pcb = tcp_listen(pcb);
+ if (pcb == nullptr)
+ {
+ platform.Message(ErrorMessage, "tcp_listen call failed\n");
+ }
+ else
+ {
+ listeningPcbs[NumProtocols] = pcb;
+ tcp_accept(listeningPcbs[NumProtocols], conn_accept);
+ sockets[FtpDataSocketNumber]->Init(FtpDataSocketNumber, port, FtpDataProtocol);
+ }
+ }
}
// Close FTP data port and purge associated resources