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.

Incident #2483945