Fixed possible undefined behaviour when UDP RX buffer fills
This commit is contained in:
@@ -119,16 +119,16 @@ NetconEthernetTap::NetconEthernetTap(
|
||||
const char *friendlyName,
|
||||
void (*handler)(void *,uint64_t,const MAC &,const MAC &,unsigned int,unsigned int,const void *,unsigned int),
|
||||
void *arg) :
|
||||
_nwid(nwid),
|
||||
_handler(handler),
|
||||
_arg(arg),
|
||||
_phy(this,false,true),
|
||||
_unixListenSocket((PhySocket *)0),
|
||||
_mac(mac),
|
||||
_homePath(homePath),
|
||||
_mtu(mtu),
|
||||
_enabled(true),
|
||||
_run(true)
|
||||
_homePath(homePath),
|
||||
_mac(mac),
|
||||
_mtu(mtu),
|
||||
_nwid(nwid),
|
||||
_handler(handler),
|
||||
_arg(arg),
|
||||
_phy(this,false,true),
|
||||
_unixListenSocket((PhySocket *)0),
|
||||
_enabled(true),
|
||||
_run(true)
|
||||
{
|
||||
sockstate = -1;
|
||||
char sockPath[4096],lwipPath[4096];
|
||||
@@ -763,11 +763,12 @@ void NetconEthernetTap::nc_udp_recved(void * arg, struct udp_pcb * upcb, struct
|
||||
// Cycle through pbufs and write them to the RX buffer
|
||||
// The RX "buffer" will be emptied via phyOnUnixWritable()
|
||||
if(p) {
|
||||
// Intra-API "packetization" structure: [addr_len|addr|payload_len|payload]
|
||||
// Intra-API "packetization" scheme: [addr_len|addr|payload_len|payload]
|
||||
if(l->conn->rxsz == DEFAULT_UDP_RX_BUF_SZ) { // if UDP buffer full
|
||||
dwr(MSG_DEBUG, "nc_udp_recved(): UDP RX buffer full. Discarding oldest payload segment\n");
|
||||
memmove(l->conn->rxbuf, l->conn->rxbuf + ZT_MAX_MTU, DEFAULT_UDP_RX_BUF_SZ - ZT_MAX_MTU);
|
||||
sz_pos = l->conn->rxbuf + (DEFAULT_UDP_RX_BUF_SZ - ZT_MAX_MTU) + sizeof(struct sockaddr_storage);
|
||||
addr_pos = l->conn->rxbuf + (DEFAULT_UDP_RX_BUF_SZ - ZT_MAX_MTU); // TODO:
|
||||
sz_pos = addr_pos + sizeof(struct sockaddr_storage);
|
||||
l->conn->rxsz -= ZT_MAX_MTU;
|
||||
}
|
||||
else {
|
||||
|
||||
Reference in New Issue
Block a user