fix crash

pull/13/head
Jeff Becker 6 years ago
parent 1a1f93c171
commit 377cc78144
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -40,6 +40,18 @@ namespace llarp
bool bool
SetupNetworking(); SetupNetworking();
/// overrides Endpoint
void
HandleDataMessage(service::ProtocolMessage* msg);
/// overrides Endpount
bool
IsolationFailed()
{
m_TunSetupResult.set_value(false);
return false;
}
llarp_tun_io tunif; llarp_tun_io tunif;
static void static void

@ -70,6 +70,15 @@ namespace llarp
LogAppend(ss, std::forward< TArgs >(args)...); LogAppend(ss, std::forward< TArgs >(args)...);
} }
static inline std::string
thread_id_string()
{
auto tid = std::this_thread::get_id();
std::hash< std::thread::id > h;
uint16_t id = h(tid) % 1000;
return std::to_string(id);
}
/** internal */ /** internal */
template < typename... TArgs > template < typename... TArgs >
void void
@ -122,8 +131,8 @@ namespace llarp
} }
#endif #endif
std::string tag = fname; std::string tag = fname;
ss << _glog.nodeName << " " << llarp_time_now_ms() << " " << tag << ":" ss << _glog.nodeName << " (" << thread_id_string() << ") "
<< lineno; << llarp_time_now_ms() << " " << tag << ":" << lineno;
ss << "\t"; ss << "\t";
LogAppend(ss, std::forward< TArgs >(args)...); LogAppend(ss, std::forward< TArgs >(args)...);
#ifndef ANDROID #ifndef ANDROID

@ -383,6 +383,12 @@ namespace llarp
void void
AddOwnPath(PathSet* set, Path* p); AddOwnPath(PathSet* set, Path* p);
void
RemovePathBuilder(llarp_pathbuilder_context* ctx);
void
RemovePathSet(PathSet* set);
typedef std::multimap< PathID_t, TransitHop* > TransitHopsMap_t; typedef std::multimap< PathID_t, TransitHop* > TransitHopsMap_t;
typedef std::pair< util::Mutex, TransitHopsMap_t > SyncTransitMap_t; typedef std::pair< util::Mutex, TransitHopsMap_t > SyncTransitMap_t;

@ -16,7 +16,7 @@ struct llarp_pathbuilder_context : public llarp::path::PathSet
struct llarp_dht_context* p_dht, size_t numPaths, struct llarp_dht_context* p_dht, size_t numPaths,
size_t numHops); size_t numHops);
virtual ~llarp_pathbuilder_context(){}; virtual ~llarp_pathbuilder_context();
virtual bool virtual bool
SelectHop(llarp_nodedb* db, llarp_rc* prev, llarp_rc* cur, size_t hop); SelectHop(llarp_nodedb* db, llarp_rc* prev, llarp_rc* cur, size_t hop);

@ -135,4 +135,4 @@ namespace llarp
} // namespace path } // namespace path
} // namespace llarp } // namespace llarp
#endif #endif

@ -252,10 +252,10 @@ namespace llarp
OnOutboundLookup(const IntroSet* i); /* */ OnOutboundLookup(const IntroSet* i); /* */
static bool static bool
SetupIsolatedNetwork(void* user); SetupIsolatedNetwork(void* user, bool failed);
bool bool
DoNetworkIsolation(); DoNetworkIsolation(bool failed);
virtual bool virtual bool
SetupNetworking() SetupNetworking()
@ -264,6 +264,13 @@ namespace llarp
return true; return true;
} }
virtual bool
IsolationFailed()
{
// XXX: override me
return false;
}
uint64_t uint64_t
GenTXID(); GenTXID();

@ -10,7 +10,7 @@ llarp_init_threadpool(int workers, const char *name);
struct llarp_threadpool * struct llarp_threadpool *
llarp_init_same_process_threadpool(); llarp_init_same_process_threadpool();
typedef bool (*setup_net_func)(void *); typedef bool (*setup_net_func)(void *, bool);
typedef void (*run_main_func)(void *); typedef void (*run_main_func)(void *);
/// for network isolation /// for network isolation

@ -193,7 +193,8 @@ struct llarp_epoll_loop : public llarp_ev_loop
++idx; ++idx;
} }
} }
tick_listeners(); if(result != -1)
tick_listeners();
return result; return result;
} }
@ -228,7 +229,8 @@ struct llarp_epoll_loop : public llarp_ev_loop
++idx; ++idx;
} }
} }
tick_listeners(); if(result != -1)
tick_listeners();
} while(epollfd != -1); } while(epollfd != -1);
return result; return result;
} }

@ -97,6 +97,12 @@ namespace llarp
Endpoint::Tick(now); Endpoint::Tick(now);
} }
void
TunEndpoint::HandleDataMessage(service::ProtocolMessage *msg)
{
// TODO: implement me
}
void void
TunEndpoint::handleTickTun(void *u) TunEndpoint::handleTickTun(void *u)
{ {

@ -295,6 +295,28 @@ namespace llarp
m_PathBuilders.push_back(ctx); m_PathBuilders.push_back(ctx);
} }
void
PathContext::RemovePathSet(PathSet* set)
{
util::Lock lock(m_OurPaths.first);
auto& map = m_OurPaths.second;
auto itr = map.begin();
while(itr != map.end())
{
if(itr->second == set)
itr = map.erase(itr);
else
++itr;
}
}
void
PathContext::RemovePathBuilder(llarp_pathbuilder_context* ctx)
{
m_PathBuilders.remove(ctx);
RemovePathSet(ctx);
}
PathHopConfig::PathHopConfig() PathHopConfig::PathHopConfig()
{ {
llarp_rc_clear(&router); llarp_rc_clear(&router);

@ -194,6 +194,11 @@ llarp_pathbuilder_context::llarp_pathbuilder_context(
p_router->crypto.encryption_keygen(enckey); p_router->crypto.encryption_keygen(enckey);
} }
llarp_pathbuilder_context::~llarp_pathbuilder_context()
{
router->paths.RemovePathBuilder(this);
}
bool bool
llarp_pathbuilder_context::SelectHop(llarp_nodedb* db, llarp_rc* prev, llarp_pathbuilder_context::SelectHop(llarp_nodedb* db, llarp_rc* prev,
llarp_rc* cur, size_t hop) llarp_rc* cur, size_t hop)

@ -267,9 +267,12 @@ llarp_router::Close()
inboundLinks.clear(); inboundLinks.clear();
llarp::LogInfo("Closing LokiNetwork client"); llarp::LogInfo("Closing LokiNetwork client");
outboundLink->stop_link(); if(outboundLink)
delete outboundLink; {
outboundLink = nullptr; outboundLink->stop_link();
delete outboundLink;
outboundLink = nullptr;
}
} }
void void

@ -93,9 +93,9 @@ namespace llarp
}; };
bool bool
Endpoint::SetupIsolatedNetwork(void* user) Endpoint::SetupIsolatedNetwork(void* user, bool failed)
{ {
return static_cast< Endpoint* >(user)->DoNetworkIsolation(); return static_cast< Endpoint* >(user)->DoNetworkIsolation(failed);
} }
bool bool
@ -567,8 +567,10 @@ namespace llarp
}; };
bool bool
Endpoint::DoNetworkIsolation() Endpoint::DoNetworkIsolation(bool failed)
{ {
if(failed)
return IsolationFailed();
llarp_ev_loop_alloc(&m_IsolatedNetLoop); llarp_ev_loop_alloc(&m_IsolatedNetLoop);
return SetupNetworking(); return SetupNetworking();
} }

@ -119,7 +119,10 @@ namespace llarp
self->m_IsolatedWorkers = workers; self->m_IsolatedWorkers = workers;
m_isolated = new std::thread([self] { m_isolated = new std::thread([self] {
if(unshare(self->m_flags) == -1) if(unshare(self->m_flags) == -1)
{
llarp::LogError("unshared failed: ", strerror(errno)); llarp::LogError("unshared failed: ", strerror(errno));
self->Fail();
}
else else
{ {
llarp::LogInfo("spawning isolated environment"); llarp::LogInfo("spawning isolated environment");
@ -149,9 +152,9 @@ namespace llarp
} }
#ifdef __linux__ #ifdef __linux__
NetIsolatedPool::NetIsolatedPool(std::function< bool(void *) > setupNet, NetIsolatedPool::NetIsolatedPool(
std::function< void(void *) > runMain, std::function< bool(void *, bool) > setupNet,
void *user) std::function< void(void *) > runMain, void *user)
: IsolatedPool(CLONE_NEWNET) : IsolatedPool(CLONE_NEWNET)
{ {
m_NetSetup = setupNet; m_NetSetup = setupNet;
@ -159,9 +162,9 @@ namespace llarp
m_user = user; m_user = user;
} }
#else #else
NetIsolatedPool::NetIsolatedPool(std::function< bool(void *) > setupNet, NetIsolatedPool::NetIsolatedPool(
std::function< void(void *) > runMain, std::function< bool(void *, bool) > setupNet,
void *user) std::function< void(void *) > runMain, void *user)
: IsolatedPool(0) : IsolatedPool(0)
{ {
m_NetSetup = setupNet; m_NetSetup = setupNet;

@ -74,6 +74,12 @@ namespace llarp
return true; return true;
} }
/// called when isolation failed
virtual void
Fail()
{
}
std::thread* m_isolated = nullptr; std::thread* m_isolated = nullptr;
int m_flags; int m_flags;
int m_IsolatedWorkers = 0; int m_IsolatedWorkers = 0;
@ -87,13 +93,19 @@ namespace llarp
struct NetIsolatedPool : public IsolatedPool struct NetIsolatedPool : public IsolatedPool
{ {
NetIsolatedPool(std::function< bool(void*) > setupNet, NetIsolatedPool(std::function< bool(void*, bool) > setupNet,
std::function< void(void*) > runMain, void* user); std::function< void(void*) > runMain, void* user);
bool bool
Isolated() Isolated()
{ {
return m_NetSetup(m_user); return m_NetSetup(m_user, true);
}
void
Fail()
{
m_NetSetup(m_user, false);
} }
void void
@ -102,7 +114,7 @@ namespace llarp
m_RunMain(m_user); m_RunMain(m_user);
} }
std::function< bool(void*) > m_NetSetup; std::function< bool(void*, bool) > m_NetSetup;
std::function< void(void*) > m_RunMain; std::function< void(void*) > m_RunMain;
void* m_user; void* m_user;
}; };

Loading…
Cancel
Save