diff --git a/include/libzt.h b/include/libzt.h index 90b34cf..ec77738 100644 --- a/include/libzt.h +++ b/include/libzt.h @@ -425,7 +425,7 @@ namespace ZeroTier * Gets a pointer to a pico_socket given a file descriptor */ #if defined(STACK_PICO) - int zts_get_pico_socket(int fd, struct pico_socket *s); +int zts_get_pico_socket(int fd, struct pico_socket **s); #endif /** diff --git a/src/libzt.cpp b/src/libzt.cpp index 508548a..b5a3484 100644 --- a/src/libzt.cpp +++ b/src/libzt.cpp @@ -878,8 +878,8 @@ int zts_setsockopt(ZT_SETSOCKOPT_SIG) } // Disable Nagle's algorithm - struct pico_socket *p; - err = zts_get_pico_socket(fd, p); + struct pico_socket *p = NULL; + err = zts_get_pico_socket(fd, &p); if(p) { int value = 1; if((err = pico_socket_setoption(p, PICO_TCP_NODELAY, &value)) < 0) { @@ -1520,45 +1520,43 @@ namespace ZeroTier { /****************************************************************************/ #if defined(STACK_PICO) - int zts_get_pico_socket(int fd, struct pico_socket *s) +int zts_get_pico_socket(int fd, struct pico_socket *s) +{ + int err = 0; + if(!zt1Service) { + DEBUG_ERROR("cannot locate socket. service not started. call zts_start(path) first"); + errno = EBADF; + err = -1; + } + else { - int err = 0; - if(!zt1Service) { - DEBUG_ERROR("cannot shutdown socket. service not started. call zts_start(path) first"); - errno = EBADF; - err = -1; + ZeroTier::_multiplexer_lock.lock(); + // First, look for for unassigned connections + ZeroTier::Connection *conn = ZeroTier::unmap[fd]; + if(conn) + { + *s = conn->picosock; + err = 1; // unassigned } else { - ZeroTier::_multiplexer_lock.lock(); - // First, look for for unassigned connections - ZeroTier::Connection *conn = ZeroTier::unmap[fd]; - // Since we found an unassigned connection, we don't need to consult the stack or tap - // during closure - it isn't yet stitched into the clockwork - if(conn) + std::pair *p = ZeroTier::fdmap[fd]; + if(!p) { - s = conn->picosock; - return 1; // unassigned + DEBUG_ERROR("unable to locate connection pair."); + errno = EBADF; + err = -1; } - else // assigned + else { - std::pair *p = ZeroTier::fdmap[fd]; - if(!p) - { - DEBUG_ERROR("unable to locate connection pair."); - errno = EBADF; - err = -1; - } - else // found everything, begin closure - { - s = p->first->picosock; - return 0; - } + *s = p->first->picosock; + err = 0; // assigned } - ZeroTier::_multiplexer_lock.unlock(); } - return err; + ZeroTier::_multiplexer_lock.unlock(); } + return err; +} #endif int zts_nsockets() diff --git a/src/picoTCP.cpp b/src/picoTCP.cpp index 26aae22..c336529 100644 --- a/src/picoTCP.cpp +++ b/src/picoTCP.cpp @@ -604,11 +604,13 @@ namespace ZeroTier { int err = 0; if(conn->socket_family == AF_INET) { struct pico_ip4 zaddr; + uint32_t tempaddr; memset(&zaddr, 0, sizeof (struct pico_ip4)); struct sockaddr_in *in4 = (struct sockaddr_in*)addr; char ipv4_str[INET_ADDRSTRLEN]; inet_ntop(AF_INET, (const void *)&in4->sin_addr.s_addr, ipv4_str, INET_ADDRSTRLEN); - pico_string_to_ipv4(ipv4_str, &(zaddr.addr)); + pico_string_to_ipv4(ipv4_str, &tempaddr); + zaddr.addr = tempaddr; //DEBUG_EXTRA("addr=%s:%d", ipv4_str, Utils::ntoh(in4->sin_port)); err = pico_socket_bind(conn->picosock, &zaddr, (uint16_t *)&(in4->sin_port)); } @@ -798,6 +800,11 @@ namespace ZeroTier { } int buf_w = conn->TXbuf->write((const unsigned char*)data, len); + if (buf_w != len) { + // because we checked ZT_TCP_TX_BUF_SZ above, this should not happen + DEBUG_ERROR("TX wrote only %d but expected to write %d", buf_w, len); + exit(0); + } //DEBUG_INFO("TXbuf->count() = %d", conn->TXbuf->count()); int txsz = conn->TXbuf->count(); @@ -911,7 +918,7 @@ namespace ZeroTier { */ char *picoTCP::beautify_pico_state(int state) { - char state_str[512]; + static char state_str[512]; char *str_ptr = state_str; if(state & PICO_SOCKET_STATE_UNDEFINED) {