diff options
Diffstat (limited to 'cpp/src/Glacier2/RoutingTable.cpp')
-rw-r--r-- | cpp/src/Glacier2/RoutingTable.cpp | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/cpp/src/Glacier2/RoutingTable.cpp b/cpp/src/Glacier2/RoutingTable.cpp index 22d5b4d4d1b..485e03cc17f 100644 --- a/cpp/src/Glacier2/RoutingTable.cpp +++ b/cpp/src/Glacier2/RoutingTable.cpp @@ -22,28 +22,41 @@ Glacier2::RoutingTable::RoutingTable(const CommunicatorPtr& communicator) : } ObjectProxySeq -Glacier2::RoutingTable::add(const ObjectProxySeq& proxies) +Glacier2::RoutingTable::add(const ObjectProxySeq& proxies, const Ice::Current& current) { IceUtil::Mutex::Lock sync(*this); - - ObjectProxySeq evictedProxies; + + ObjectProxySeq::const_iterator prx; - for(ObjectProxySeq::const_iterator prx = proxies.begin(); prx != proxies.end(); ++prx) + // + // We 'pre-scan' the list, applying our validation rules. The + // ensures that our state is not modified if this operation results + // in a rejection. + // + for(prx = proxies.begin(); prx != proxies.end(); ++prx) { if(!*prx) // We ignore null proxies. { continue; } - ObjectPrx proxy = (*prx)->ice_twoway()->ice_secure(false); // We add proxies in default form. + if(!_verifier.verify(*prx)) + { + current.con->close(true); + throw ObjectNotExistException(__FILE__, __LINE__); + } + } - if(!_verifier.verify(proxy)) + ObjectProxySeq evictedProxies; + for(prx = proxies.begin(); prx != proxies.end(); ++prx) + { + if(!*prx) // We ignore null proxies. { - // - // XXX - handle rejection here! - // + continue; } + ObjectPrx proxy = (*prx)->ice_twoway()->ice_secure(false); // We add proxies in default form. + EvictorMap::iterator p = _map.find(proxy->ice_getIdentity()); if(p == _map.end()) |