diff options
author | Johnny Willemsen <jwillemsen@remedy.nl> | 2019-04-15 09:56:28 +0200 |
---|---|---|
committer | Johnny Willemsen <jwillemsen@remedy.nl> | 2019-04-15 09:56:28 +0200 |
commit | b6da164721260a0f81628c222ba5f63e8bb86a2d (patch) | |
tree | b42d413626e858624290d2de51f4d07797eb7463 | |
parent | 51eb7d1d8393a1a450ec52e957f4d62711cc4165 (diff) | |
download | ATCD-b6da164721260a0f81628c222ba5f63e8bb86a2d.tar.gz |
Check that we forward to a valid corbaloc, if not, throw an exception here instead of passing an invalid corbaloc further down
* TAO/orbsvcs/ImplRepo_Service/INS_Locator.cpp:
* TAO/orbsvcs/ImplRepo_Service/INS_Locator.h:
-rw-r--r-- | TAO/orbsvcs/ImplRepo_Service/INS_Locator.cpp | 35 | ||||
-rw-r--r-- | TAO/orbsvcs/ImplRepo_Service/INS_Locator.h | 2 |
2 files changed, 33 insertions, 4 deletions
diff --git a/TAO/orbsvcs/ImplRepo_Service/INS_Locator.cpp b/TAO/orbsvcs/ImplRepo_Service/INS_Locator.cpp index 1a4242e0cb0..d2da4e94eb2 100644 --- a/TAO/orbsvcs/ImplRepo_Service/INS_Locator.cpp +++ b/TAO/orbsvcs/ImplRepo_Service/INS_Locator.cpp @@ -12,6 +12,7 @@ #include "ImR_Locator_i.h" #include "tao/ORB_Constants.h" #include "tao/ORB_Core.h" +#include "orbsvcs/Log_Macros.h" INS_Locator::INS_Locator (ImR_Locator_i& loc) : imr_locator_ (loc) @@ -63,7 +64,7 @@ INS_Locator::async_locate (::IORTable::Locate_ResponseHandler handler, //---------------------------------------------------------------------------------------- INS_Loc_ResponseHandler::INS_Loc_ResponseHandler (const char *key, ::IORTable::Locate_ResponseHandler handler) - : key_(key), + : key_str_(key), rh_ (handler) { } @@ -72,8 +73,36 @@ void INS_Loc_ResponseHandler::send_ior (const char *pior) { ACE_CString ior = pior; - ior += key_; - rh_->forward_ior (ior.c_str(), false); + + // Check that the returned ior is the expected partial ior with + // missing ObjectKey. + if (ior.find ("corbaloc:") == 0 && ior[ior.length () -1] == '/') + { + ior += key_str_; + + if (ImR_Locator_i::debug () > 5) + { + ORBSVCS_DEBUG ((LM_DEBUG, + ACE_TEXT ("(%P|%t) INS_Loc_ResponseHandler::send_ior (): Forwarding ") + ACE_TEXT ("key <%C> to IOR <%C>\n"), + key_str_.in (), ior.c_str ())); + } + rh_->forward_ior (ior.c_str(), false); + } + else + { + if (ImR_Locator_i::debug () > 1) + { + ORBSVCS_ERROR ((LM_ERROR, + ACE_TEXT ("(%P|%t) INS_Loc_ResponseHandler::send_ior (): Invalid corbaloc ior for key <%C> IOR <%C>\n"), + key_str_.in (), pior)); + } + + rh_->raise_excep (CORBA::OBJECT_NOT_EXIST (CORBA::SystemException::_tao_minor_code + ( TAO_IMPLREPO_MINOR_CODE, 0), + CORBA::COMPLETED_NO)); + } + delete this; } diff --git a/TAO/orbsvcs/ImplRepo_Service/INS_Locator.h b/TAO/orbsvcs/ImplRepo_Service/INS_Locator.h index 433dafd0a41..a948ea478d5 100644 --- a/TAO/orbsvcs/ImplRepo_Service/INS_Locator.h +++ b/TAO/orbsvcs/ImplRepo_Service/INS_Locator.h @@ -35,7 +35,7 @@ public: virtual void send_exception (CORBA::Exception *ex); private: - ACE_CString key_; + CORBA::String_var key_str_; TAO_AMH_Locate_ResponseHandler_var rh_; }; |