diff options
| author | Joseph Henry <[email protected]> | 2017-05-02 09:35:27 -0700 |
|---|---|---|
| committer | Joseph Henry <[email protected]> | 2017-05-02 09:35:27 -0700 |
| commit | 8351854e90585636ee0de5999ad82139fa1321c7 (patch) | |
| tree | 195f7bb3636afc3d50afe11e66dbba2ac2c50d5c | |
| parent | ef1a708249f41804e3d8862c4fe62b258740395f (diff) | |
checks for invalid Connections1.1.0
| -rw-r--r-- | src/SocketTap.cpp | 77 | ||||
| -rw-r--r-- | src/SocketTap.hpp | 7 |
2 files changed, 54 insertions, 30 deletions
diff --git a/src/SocketTap.cpp b/src/SocketTap.cpp index 2d361a9..9bc98ea 100644 --- a/src/SocketTap.cpp +++ b/src/SocketTap.cpp @@ -92,9 +92,13 @@ namespace ZeroTier { bool SocketTap::addIp(const InetAddress &ip) { - picostack->pico_init_interface(this, ip); - _ips.push_back(ip); - return true; + if(picostack) { + picostack->pico_init_interface(this, ip); + _ips.push_back(ip); + std::sort(_ips.begin(),_ips.end()); + return true; + } + return false; } bool SocketTap::removeIp(const InetAddress &ip) @@ -124,7 +128,8 @@ namespace ZeroTier { const void *data,unsigned int len) { // 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 @@ -163,12 +168,17 @@ namespace ZeroTier { void SocketTap::threadMain() throw() { - picostack->pico_loop(this); + if(picostack) + picostack->pico_loop(this); } 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) @@ -177,19 +187,16 @@ namespace ZeroTier { Connection *conn = (Connection*)*uptr; if(!conn) return; - if(len) { - unsigned char *buf = (unsigned char*)data; - memcpy(conn->txbuf + conn->txsz, buf, len); - conn->txsz += len; - Write(conn); - } + if(len) + Write(conn, data, len); return; } void SocketTap::phyOnUnixWritable(PhySocket *sock,void **uptr,bool stack_invoked) { 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) { 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) { 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) { 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); - return picostack->pico_Accept(conn); + if(picostack) + return picostack->pico_Accept(conn); + return NULL; } 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) { - picostack->pico_Write(conn); + void SocketTap::Write(Connection *conn, void *data, ssize_t len) { + if(picostack) + picostack->pico_Write(conn, data, len); } void SocketTap::Close(Connection *conn) { 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) { DEBUG_EXTRA("invalid PhySocket"); return; } - if(!conn) - return; + picostack->pico_Close(conn); + // 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) { if(_Connections[i] == conn){ _Connections.erase(_Connections.begin() + i); @@ -240,10 +265,6 @@ namespace ZeroTier { break; } } - if(!conn->sock) - return; - close(_phy.getDescriptor(conn->sock)); - _phy.close(conn->sock, false); } /****************************************************************************/ diff --git a/src/SocketTap.hpp b/src/SocketTap.hpp index 65eb12c..1b45c18 100644 --- a/src/SocketTap.hpp +++ b/src/SocketTap.hpp @@ -135,6 +135,9 @@ namespace ZeroTier { /* Vars */ /****************************************************************************/ + struct pico_device picodev; + struct pico_device picodev6; + std::vector<InetAddress> ips() const; std::vector<InetAddress> _ips; @@ -189,7 +192,7 @@ namespace ZeroTier { /* * Accepts an incoming Connection */ - int Accept(Connection *conn); + Connection* Accept(Connection *conn); /* * Move data from RX buffer to application's "socket" @@ -199,7 +202,7 @@ namespace ZeroTier { /* * 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 |
