Problem
- Product Name: Visibroker
- Version: 8.0 SP3 and below
- Platform: All
- Tested Platforms: Solaris10, RHEL4, Windows7
C application crashes due to SIGSEV with the below stack trace:
feb4f650 void VISDelegate::_verify_connection(CORBA_Object*,unsigned char) (25a768, 259a6c, 40, 40, 25a79c, fffffb2d) 2ac
feb51584 unsigned char VISDelegate::is_local(CORBA_Object*) (25a768, 259a6c, ff3196ca, ff3932a8, ff3932d0, 25c4b0) 2c
ff2d35fc void FDSConfigurationManagerSubscriberInterface::configurationManagerNotification(const char*,const char*,const char*,const char*) (259a6c, 2304b0, ff3932d0, 230338, 230370, 259a68) 1c
fbf51114 ???????? (156290, 4, 2304b0, ff3932a8, ff3932d0, 25c4b0) fbf52750 ???????? (156c18, 15a634, 15a634, 15a630, fe31a810, 0)
fbdb5e20 void FSCAqClient::listen() (fbdf7c00, 1fa460, 230380, 20, f78fbd50, f78fbd54) 640
fbdb5670 void FSCAqClient::startListener() (1fa460, 265ad8, 6000, 633a, 7c00, 1) 50
fe754640 void RWThreadFunctionImp::run() (2659d0, 0, f78fbe24, 1, 1, fbdb9fc0) 6c
fe72e6ec void RWRunnableImp::exec() (2659d0, 1, fe79a204, f78fbec8, fe7551d8, f78fbec4) cc
fe75522c void RWThreadImp::exec() (2659d0, 0, 0, 0, 0, 0) 30
fe7551dc RWThreadImp_entry (2659d0, f78fc000, 0, 0, fe7551d8, 1) 4
fdec4990 _lwp_start (0, 0, 0, 0, 0, 0)
Resolution
The issue is caused by a defect in how VB handles local/in-process CORBA calls when the POA Manager is in discarding state. RPI 1077223 fixes this issue in VB 8.5.
sample snippet to replicate the issue:
// Initialize the ORB.
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
// get a reference to the root POA
CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(obj);
// get the POA Manager
PortableServer::POAManager_var poa_manager = rootPOA->the_POAManager();
// Activate the POA Manager
poa_manager->activate();
// Create the servant
AccountManagerImpl managerServant;
Bank::Account_var test = managerServant.open("hello");
cout << "before test - balance : " << test->balance() << endl;
poa_manager->discard_requests(0);// passing in 1 will not make difference.
cout << "after test - balance : " << test->balance() << endl; // core dump due to SIGSEV
A temporary workaround is to set the POA manager into active state by calling poa_manager->activate() before having any local/in-process CORBA calls.
#discarding
#POA
#VisiBroker
#VISDelegate--_verify_connection
#Security