From ee7361ee2ef82033b2158418b659af5be1c126fb Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Thu, 29 Aug 2019 07:25:16 -0700 Subject: [PATCH] crash fix --- root/root.cpp | 78 ++++++++++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/root/root.cpp b/root/root.cpp index 2f2eea19b..3eaf78b62 100644 --- a/root/root.cpp +++ b/root/root.cpp @@ -336,48 +336,50 @@ static void handlePacket(const int sock,const InetAddress *const ip,Packet &pkt) if (introduce) { std::lock_guard l(peersByVirtAddr_l); auto sources = peersByVirtAddr.find(source); - for(auto a=sources->second.begin();a!=sources->second.end();++a) { - for(auto b=toAddrs.begin();b!=toAddrs.end();++b) { - if (((*a)->ip6 == *ip)&&(b->second->ip6)) { - printf("* introducing %s(%s) to %s(%s)" ZT_EOL_S,ip->toString(ipstr),source.toString(astr),b->second->ip6.toString(ipstr2),dest.toString(astr2)); + if (sources != peersByVirtAddr.end()) { + for(auto a=sources->second.begin();a!=sources->second.end();++a) { + for(auto b=toAddrs.begin();b!=toAddrs.end();++b) { + if (((*a)->ip6 == *ip)&&(b->second->ip6)) { + printf("* introducing %s(%s) to %s(%s)" ZT_EOL_S,ip->toString(ipstr),source.toString(astr),b->second->ip6.toString(ipstr2),dest.toString(astr2)); - Packet outp(source,self.address(),Packet::VERB_RENDEZVOUS); - outp.append((uint8_t)0); - dest.appendTo(outp); - outp.append((uint16_t)b->second->ip6.port()); - outp.append((uint8_t)16); - outp.append((const uint8_t *)b->second->ip6.rawIpData(),16); - outp.armor((*a)->key,true); - sendto(sock,pkt.data(),pkt.size(),0,(const struct sockaddr *)ip,(socklen_t)sizeof(struct sockaddr_in6)); + Packet outp(source,self.address(),Packet::VERB_RENDEZVOUS); + outp.append((uint8_t)0); + dest.appendTo(outp); + outp.append((uint16_t)b->second->ip6.port()); + outp.append((uint8_t)16); + outp.append((const uint8_t *)b->second->ip6.rawIpData(),16); + outp.armor((*a)->key,true); + sendto(sock,pkt.data(),pkt.size(),0,(const struct sockaddr *)ip,(socklen_t)sizeof(struct sockaddr_in6)); - outp.reset(dest,self.address(),Packet::VERB_RENDEZVOUS); - outp.append((uint8_t)0); - source.appendTo(outp); - outp.append((uint16_t)ip->port()); - outp.append((uint8_t)16); - outp.append((const uint8_t *)ip->rawIpData(),16); - outp.armor(b->second->key,true); - sendto(sock,pkt.data(),pkt.size(),0,(const struct sockaddr *)&(b->second->ip6),(socklen_t)sizeof(struct sockaddr_in6)); - } else if (((*a)->ip4 == *ip)&&(b->second->ip4)) { - printf("* introducing %s(%s) to %s(%s)" ZT_EOL_S,ip->toString(ipstr),source.toString(astr),b->second->ip4.toString(ipstr2),dest.toString(astr2)); + outp.reset(dest,self.address(),Packet::VERB_RENDEZVOUS); + outp.append((uint8_t)0); + source.appendTo(outp); + outp.append((uint16_t)ip->port()); + outp.append((uint8_t)16); + outp.append((const uint8_t *)ip->rawIpData(),16); + outp.armor(b->second->key,true); + sendto(sock,pkt.data(),pkt.size(),0,(const struct sockaddr *)&(b->second->ip6),(socklen_t)sizeof(struct sockaddr_in6)); + } else if (((*a)->ip4 == *ip)&&(b->second->ip4)) { + printf("* introducing %s(%s) to %s(%s)" ZT_EOL_S,ip->toString(ipstr),source.toString(astr),b->second->ip4.toString(ipstr2),dest.toString(astr2)); - Packet outp(source,self.address(),Packet::VERB_RENDEZVOUS); - outp.append((uint8_t)0); - dest.appendTo(outp); - outp.append((uint16_t)b->second->ip4.port()); - outp.append((uint8_t)4); - outp.append((const uint8_t *)b->second->ip4.rawIpData(),4); - outp.armor((*a)->key,true); - sendto(sock,pkt.data(),pkt.size(),0,(const struct sockaddr *)ip,(socklen_t)sizeof(struct sockaddr_in)); + Packet outp(source,self.address(),Packet::VERB_RENDEZVOUS); + outp.append((uint8_t)0); + dest.appendTo(outp); + outp.append((uint16_t)b->second->ip4.port()); + outp.append((uint8_t)4); + outp.append((const uint8_t *)b->second->ip4.rawIpData(),4); + outp.armor((*a)->key,true); + sendto(sock,pkt.data(),pkt.size(),0,(const struct sockaddr *)ip,(socklen_t)sizeof(struct sockaddr_in)); - outp.reset(dest,self.address(),Packet::VERB_RENDEZVOUS); - outp.append((uint8_t)0); - source.appendTo(outp); - outp.append((uint16_t)ip->port()); - outp.append((uint8_t)4); - outp.append((const uint8_t *)ip->rawIpData(),4); - outp.armor(b->second->key,true); - sendto(sock,pkt.data(),pkt.size(),0,(const struct sockaddr *)&(b->second->ip4),(socklen_t)sizeof(struct sockaddr_in)); + outp.reset(dest,self.address(),Packet::VERB_RENDEZVOUS); + outp.append((uint8_t)0); + source.appendTo(outp); + outp.append((uint16_t)ip->port()); + outp.append((uint8_t)4); + outp.append((const uint8_t *)ip->rawIpData(),4); + outp.armor(b->second->key,true); + sendto(sock,pkt.data(),pkt.size(),0,(const struct sockaddr *)&(b->second->ip4),(socklen_t)sizeof(struct sockaddr_in)); + } } } }