checks for invalid Connections

This commit is contained in:
Joseph Henry
2017-05-02 09:35:27 -07:00
parent ef1a708249
commit 8351854e90
2 changed files with 54 additions and 30 deletions

View File

@@ -92,9 +92,13 @@ namespace ZeroTier {
bool SocketTap::addIp(const InetAddress &ip) bool SocketTap::addIp(const InetAddress &ip)
{ {
picostack->pico_init_interface(this, ip); if(picostack) {
_ips.push_back(ip); picostack->pico_init_interface(this, ip);
return true; _ips.push_back(ip);
std::sort(_ips.begin(),_ips.end());
return true;
}
return false;
} }
bool SocketTap::removeIp(const InetAddress &ip) bool SocketTap::removeIp(const InetAddress &ip)
@@ -124,7 +128,8 @@ namespace ZeroTier {
const void *data,unsigned int len) const void *data,unsigned int len)
{ {
// RX packet // RX packet
picostack->pico_rx(this, from,to,etherType,data,len); if(picostack)
picostack->pico_rx(this, from,to,etherType,data,len);
} }
std::string SocketTap::deviceName() const std::string SocketTap::deviceName() const
@@ -163,12 +168,17 @@ namespace ZeroTier {
void SocketTap::threadMain() void SocketTap::threadMain()
throw() throw()
{ {
picostack->pico_loop(this); if(picostack)
picostack->pico_loop(this);
} }
void SocketTap::phyOnUnixClose(PhySocket *sock,void **uptr) void SocketTap::phyOnUnixClose(PhySocket *sock,void **uptr)
{ {
Close((Connection*)uptr); if(sock) {
Connection *conn = (Connection*)uptr;
if(conn)
Close(conn);
}
} }
void SocketTap::phyOnUnixData(PhySocket *sock, void **uptr, void *data, ssize_t len) void SocketTap::phyOnUnixData(PhySocket *sock, void **uptr, void *data, ssize_t len)
@@ -177,19 +187,16 @@ namespace ZeroTier {
Connection *conn = (Connection*)*uptr; Connection *conn = (Connection*)*uptr;
if(!conn) if(!conn)
return; return;
if(len) { if(len)
unsigned char *buf = (unsigned char*)data; Write(conn, data, len);
memcpy(conn->txbuf + conn->txsz, buf, len);
conn->txsz += len;
Write(conn);
}
return; return;
} }
void SocketTap::phyOnUnixWritable(PhySocket *sock,void **uptr,bool stack_invoked) void SocketTap::phyOnUnixWritable(PhySocket *sock,void **uptr,bool stack_invoked)
{ {
DEBUG_INFO(); DEBUG_INFO();
Read(sock,uptr,stack_invoked); if(sock)
Read(sock,uptr,stack_invoked);
} }
/****************************************************************************/ /****************************************************************************/
@@ -198,41 +205,59 @@ namespace ZeroTier {
int SocketTap::Connect(Connection *conn, int fd, const struct sockaddr *addr, socklen_t addrlen) { int SocketTap::Connect(Connection *conn, int fd, const struct sockaddr *addr, socklen_t addrlen) {
Mutex::Lock _l(_tcpconns_m); Mutex::Lock _l(_tcpconns_m);
return picostack->pico_Connect(conn, fd, addr, addrlen); if(picostack)
return picostack->pico_Connect(conn, fd, addr, addrlen);
return ZT_ERR_GENERAL_FAILURE;
} }
int SocketTap::Bind(Connection *conn, int fd, const struct sockaddr *addr, socklen_t addrlen) { int SocketTap::Bind(Connection *conn, int fd, const struct sockaddr *addr, socklen_t addrlen) {
Mutex::Lock _l(_tcpconns_m); Mutex::Lock _l(_tcpconns_m);
return picostack->pico_Bind(conn, fd, addr, addrlen); if(picostack)
return picostack->pico_Bind(conn, fd, addr, addrlen);
return ZT_ERR_GENERAL_FAILURE;
} }
int SocketTap::Listen(Connection *conn, int fd, int backlog) { int SocketTap::Listen(Connection *conn, int fd, int backlog) {
Mutex::Lock _l(_tcpconns_m); Mutex::Lock _l(_tcpconns_m);
return picostack->pico_Listen(conn, fd, backlog); if(picostack)
return picostack->pico_Listen(conn, fd, backlog);
return ZT_ERR_GENERAL_FAILURE;
} }
int SocketTap::Accept(Connection *conn) { Connection* SocketTap::Accept(Connection *conn) {
Mutex::Lock _l(_tcpconns_m); Mutex::Lock _l(_tcpconns_m);
return picostack->pico_Accept(conn); if(picostack)
return picostack->pico_Accept(conn);
return NULL;
} }
void SocketTap::Read(PhySocket *sock,void **uptr,bool stack_invoked) { void SocketTap::Read(PhySocket *sock,void **uptr,bool stack_invoked) {
picostack->pico_Read(this, sock, (Connection*)uptr, stack_invoked); if(picostack)
picostack->pico_Read(this, sock, (Connection*)uptr, stack_invoked);
} }
void SocketTap::Write(Connection *conn) { void SocketTap::Write(Connection *conn, void *data, ssize_t len) {
picostack->pico_Write(conn); if(picostack)
picostack->pico_Write(conn, data, len);
} }
void SocketTap::Close(Connection *conn) { void SocketTap::Close(Connection *conn) {
Mutex::Lock _l(_close_m); Mutex::Lock _l(_close_m);
// Here we assume _tcpconns_m is already locked by caller if(!conn) {
DEBUG_ERROR("invalid connection");
return;
}
if(!conn->sock) { if(!conn->sock) {
DEBUG_EXTRA("invalid PhySocket"); DEBUG_EXTRA("invalid PhySocket");
return; return;
} }
if(!conn) picostack->pico_Close(conn);
return; // Here we assume _tcpconns_m is already locked by caller
// FIXME: is this assumption still valid
if(conn->sock)
_phy.close(conn->sock, false);
close(_phy.getDescriptor(conn->sock));
for(size_t i=0;i<_Connections.size();++i) { for(size_t i=0;i<_Connections.size();++i) {
if(_Connections[i] == conn){ if(_Connections[i] == conn){
_Connections.erase(_Connections.begin() + i); _Connections.erase(_Connections.begin() + i);
@@ -240,10 +265,6 @@ namespace ZeroTier {
break; break;
} }
} }
if(!conn->sock)
return;
close(_phy.getDescriptor(conn->sock));
_phy.close(conn->sock, false);
} }
/****************************************************************************/ /****************************************************************************/

View File

@@ -135,6 +135,9 @@ namespace ZeroTier {
/* Vars */ /* Vars */
/****************************************************************************/ /****************************************************************************/
struct pico_device picodev;
struct pico_device picodev6;
std::vector<InetAddress> ips() const; std::vector<InetAddress> ips() const;
std::vector<InetAddress> _ips; std::vector<InetAddress> _ips;
@@ -189,7 +192,7 @@ namespace ZeroTier {
/* /*
* Accepts an incoming Connection * Accepts an incoming Connection
*/ */
int Accept(Connection *conn); Connection* Accept(Connection *conn);
/* /*
* Move data from RX buffer to application's "socket" * Move data from RX buffer to application's "socket"
@@ -199,7 +202,7 @@ namespace ZeroTier {
/* /*
* Move data from application's "socket" into network stack * Move data from application's "socket" into network stack
*/ */
void Write(Connection *conn); void Write(Connection *conn, void *data, ssize_t len);
/* /*
* Closes a Connection * Closes a Connection