[omniORB] Re: Memory leak

Tatiana Lazareva tatiana.alexandrovna.lazareva at gmail.com
Mon Jan 23 12:32:00 GMT 2012


>
> Hi all,
> It seems that I find some memory leak bugs in omni4.1.6 code. These memory
> leak bugs were detected using the purify tool on the Solaris10 OS.
> *1) /omniORB-4.1.6/src/lib/omniORB/orbcore/tcp/tcpTransportImpl.cc: line
> 426:*
>   while ( 1 ) {
>     // There is no way to know for sure the buffer is big enough to get
>     // the info for all the interfaces. We work around this by calling
>     // the ioctl 2 times and increases the buffer size in the 2nd call.
>     // If both calls return the info with the same size, we know we have
>     // got all the interfaces.
>     char* buf = (char*) malloc(len); [*TLazareva]: this is 426 line.*
>     ifc.ifc_len = len;
>     ifc.ifc_buf = buf;
>     if ( ioctl(sock, OMNI_SIOCGIFCONF, &ifc) < 0 ) {
>       if ( errno != EINVAL || lastlen != 0 ) {
> if ( omniORB::trace(1) ) {
>   omniORB::logger log;
>   log << "Warning: ioctl SIOCGICONF failed.\n"
>       << "Unable to obtain the list of all interface addresses.\n";
> } *[TLazareva]: I think that "buf" variable should be cleaned before
> "return": "free buf;" *
>  return;
>       }
>     }
>     else {
>       if ( ifc.ifc_len == lastlen )
> break; // Success, len has not changed.
>       lastlen = ifc.ifc_len;
>     }
>     len += 10 * sizeof(struct ifreq);
>     free(buf);
>   }
> *2) /omniORB-4.1.6/src/lib/omnithread/posix.cc: line 376*
>     omni_thread* t = new omni_thread; *[TLazareva]: This is 376 line. "t"
> object was not deleted at the end of function. Is it correct? Purify detect
> the memory leak for this object.*
>
>     t->_state = STATE_RUNNING;
>
>     t->posix_thread = pthread_self ();
>
>     DB(cerr << "initial thread " << t->id() << endl);
>
>     THROW_ERRORS(pthread_setspecific(self_key, (void*)t));
>
> #ifdef PthreadSupportThreadPriority
>
> #if (PthreadDraftVersion == 4)
>
>     THROW_ERRORS(pthread_setprio(t->posix_thread,
>  posix_priority(PRIORITY_NORMAL)));
>
> #elif (PthreadDraftVersion == 6)
>
>     pthread_attr_t attr;
>     pthread_attr_init(&attr);
>
>     THROW_ERRORS(pthread_attr_setprio(&attr,
> posix_priority(PRIORITY_NORMAL)));
>
>     THROW_ERRORS(pthread_setschedattr(t->posix_thread, attr));
>
> #else
>
>     struct sched_param sparam;
>
>     sparam.sched_priority = posix_priority(PRIORITY_NORMAL);
>
>     THROW_ERRORS(pthread_setschedparam(t->posix_thread, SCHED_OTHER,
> &sparam));
> *[TLazareva]: I think that "t" object should be cleaned before the end of
> function: "delete t;"*
> #endif   /* PthreadDraftVersion */
>
> #endif   /* PthreadSupportThreadPriority */
> }
>
> *3) /omniORB-4.1.6/src/lib/omniORB/orbcore/portableserver.cc: line 320*
> void*
> PortableServer::ServantBase::_do_this(const char* repoId)
> {
>   OMNIORB_ASSERT(repoId);
>
>   if (!omni::internalLock) {
>     // Not initalised yet
>     OMNIORB_THROW(OBJ_ADAPTER,OBJ_ADAPTER_POANotInitialised,
>   CORBA::COMPLETED_NO);
>   }
>
>   omniCurrent* current = omniCurrent::get(); *[TLazareva]: This is 320
> line. This object is created in
> /omniORB-4.1.6/include/omniORB4/internal/omniCurrent.h file at the 92 line
> using "new" operator and this object is not cleaned in the code.*
>   if (current) {
>     omniCallDescriptor* call_desc = current->callDescriptor();
>     if (call_desc &&
> call_desc->localId()->servant() == (omniServant*)this) {
>
>       // In context of an invocation on this servant
>       omniObjRef* ref = omniOrbPOACurrent::real_get_reference(call_desc);
>       OMNIORB_ASSERT(ref);*[TLazareva]: I think that "current" object
> should be cleaned before the "return": "delete current;"*
>       return ref->_ptrToObjRef(repoId);
>     }
>   }
>
>   {
>     omni_tracedmutex_lock sync(*omni::internalLock);
>
>     if (_activations().size() == 1) {
>       // We only have a single activation -- return a reference to it.
>       omniObjTableEntry* entry = _activations()[0];
>       omniOrbPOA* poa = omniOrbPOA::_downcast(entry->adapter());
>       omniIORHints hints(poa ? poa->policy_list() : 0);
>       omniObjRef* ref = omni::createLocalObjRef(_mostDerivedRepoId(),
> repoId,
> entry, hints);
>       OMNIORB_ASSERT(ref);
>       return ref->_ptrToObjRef(repoId);
>     }
>   }
> *
> *
>   PortableServer::POA_var poa = this->_default_POA();
>
>   if( CORBA::is_nil(poa) )
>     OMNIORB_THROW(OBJ_ADAPTER,OBJ_ADAPTER_POANotInitialised,
>   CORBA::COMPLETED_NO);
>
>   return ((omniOrbPOA*)(PortableServer::POA_ptr) poa)->
>     servant__this(this, repoId);
> }
>
> *4) /omniORB-4.1.6/src/lib/omnithread/threaddata.cc: line 51*
> omni_thread::value_t*
> omni_thread::set_value(key_t k, value_t* v)
> {
>   if (k == 0) return 0;
>   if (k > _value_alloc) {
>     next_id_mutex->lock();
>     key_t alloc = allocated_keys;
>     next_id_mutex->unlock();
>
>     if (k > alloc) return 0;
>
>     value_t** nv = new value_t*[alloc]; *[TLazareva]: This is 51 line.
> "nv" object is not cleaned in the code.*
>     key_t i = 0;
>     if (_values) {
>       for (; i < _value_alloc; i++)
> nv[i] = _values[i];
>       delete [] _values;
>     }
>     for (; i < alloc; i++)
>       nv[i] = 0;
>
>     _values = nv;*[TLazareva]: As I understand "nv" object is not needed
> after this line, so it should be deleted: "delete [] nv;"*
>     _value_alloc = alloc;
>   }
>   if (_values[k-1]) delete _values[k-1];
>   _values[k-1] = v;
>   return v;
> }
>
> 5) /omniORB-4.1.6/build/src/lib/omniORB/omniORB4/Naming.hh: line 404
>     static inline _ptr_type _unmarshalObjRef(cdrStream& s) {
>       omniObjRef* o = omniObjRef::_unMarshal(_PD_repoId,s); *[TLazareva]:
> This is 404 line.The object "o" is created using "new" operator in
> /omniORB-4.1.6/build/src/lib/omniORB/omniORB4/NamingSK.cc file at the 2746
> line (full stack you can find below). I think that "o" object should be
> deleted before the "return" like this:*
> *if (o) {*
> *  _ptr_type ptrObj = (_ptr_type) o->_ptrToObjRef(_PD_repoId);*
> *  delete o;*
> *  return ptrObj;*
> *}*
> *else ...*
>       if (o)
>         return (_ptr_type) o->_ptrToObjRef(_PD_repoId);
>       else
>         return _nil();
>     }
> *Full stack:*
> PLK: 1152 bytes potentially leaked in 18 blocks
>   * This memory was allocated from:
> malloc         [rtlib.o]
>  operator new(unsigned) [libCrun.a]
> void*operator new(unsigned) [rtlib.o]
> * omniObjRef*CosNaming::_pof_NamingContextExt::newObjRef(omniIOR*,omniIdentity*)
> [NamingSK.cc:2746]*
> * omniObjRef*omni::createObjRef(const char*,omniIOR*,bool,omniIdentity*)
> [omniInternal.cc:1069]*
> * omniObjRef*omniObjRef::_unMarshal(const char*,cdrStream&)
> [omniObjRef.cc:990]*
> * CosNaming::_objref_NamingContext*CosNaming::NamingContext::_unmarshalObjRef(cdrStream&)
> [Naming.hh:404]*
>  void
> _0RL_cd_69CECA6A39F685B5_e0000000::unmarshalReturnedValues(cdrStream&)
> [NamingSK.cc:1334]
> void omniRemoteIdentity::dispatch(omniCallDescriptor&)
> [remoteIdentity.cc:188]
>  void omniObjRef::_invoke(omniCallDescriptor&,bool) [omniObjRef.cc:783]
> CosNaming::_objref_NamingContext*CosNaming::_objref_NamingContext::bind_new_context(const
> CosNaming::Name&) [NamingSK.cc:1426]
>  _CORBA_ObjRef_Var<CosNaming::_objref_NamingContext,CosNaming::NamingContext_Helper>corba::Orb::_bindNewContext(_CORBA_ObjRef_Var<CosNaming::_objref_NamingContext,CosNaming::NamingContext_Helper>,const
> CosNaming::Name&) [Orb.cc:154]
>   * Block of 64 bytes (18 times); last block at 0x27e8948
>
>
> Could you please check the code above on the memory leak issue?
>
> --
>
> Cheers,
>
> *T*atiana *L*azareva**
>
> e-mail (regular): *Tatiana.Alexandrovna.Lazareva at gmail.com*
>



-- 

Cheers,

*T*atiana *L*azareva**

e-mail (regular): *Tatiana.Alexandrovna.Lazareva at gmail.com*

e-mail (office): *yumanova at mera.ru*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.omniorb-support.com/pipermail/omniorb-list/attachments/20120123/5fefb4e2/attachment-0001.htm


More information about the omniORB-list mailing list