[reSIProcate] race condition in resip::Log::timestamp

dwest1975 at hush.ai dwest1975 at hush.ai
Mon Feb 10 06:21:08 CST 2014


Hi,
I'm using resiprocate library version 1.8.8 under Oracle Linux Server
6.5 and see the following race condition under Helgrind:
==8418== 88 errors in context 96 of 102:==8418==
----------------------------------------------------------------==8418==
==8418== Lock at 0x7FEFDB008 was first observed==8418==    at
0x4A0BDA3: pthread_mutex_init (hg_intercepts.c:429)==8418==    by
0x3BB0566DDA: resip::SipStack::SipStack(resip::Security*, std::vector
const&, resip::AsyncProcessHandler*, bool, void (*)(int, int, char
const*, int), resip::Compression*, resip::FdPollGrp*)
(SipStack.cxx:97)==8418==    by 0x6B5D52: main
(ProxyDaemon.cxx:831)==8418== ==8418== Possible data race during write
of size 4 at 0x7068E88 by thread #18==8418== Locks held: none==8418== 
  at 0x4A063C0: free (vg_replace_malloc.c:446)==8418==    by
0x3BA3A9DBE8: tzset_internal (tzset.c:435)==8418==    by 0x3BA3A9DD68:
__tz_convert (tzset.c:624)==8418==    by 0x3BAFC3B63A:
resip::Log::timestamp(resip::Data&) (Log.cxx:437)==8418==    by
0x3BAFC3CF43: resip::Log::tags(resip::Log::Level, resip::Subsystem
const&, char const*, int, std::ostream&) (Log.cxx:388)==8418==    by
0x3BAFC3D22C: resip::Log::Guard::Guard(resip::Log::Level,
resip::Subsystem const&, char const*, int) (Log.cxx:731)==8418==    by
0x3BB058E5CB:
resip::TransportSelector::determineSourceInterface(resip::SipMessage*,
resip::Tuple const&) const (TransportSelector.cxx:747)==8418==    by
0x3BB05914C7: resip::TransportSelector::transmit(resip::SipMessage*,
resip::Tuple&, resip::SendData*) (TransportSelector.cxx:851)==8418==  
 by 0x3BB058662F:
resip::TransactionState::process(resip::TransactionController&,
resip::TransactionMessage*) (TransactionState.cxx:406)==8418==    by
0x3BB0577B0B: resip::TransactionController::process(int)
(TransactionController.cxx:141)==8418==    by 0x3BB056A260:
resip::TransactionControllerThread::thread()
(TransactionControllerThread.hxx:30)==8418==    by 0x3BAFC47359:
threadIfThreadWrapper (ThreadIf.cxx:51)==8418== ==8418== This
conflicts with a previous write of size 4 by thread #21==8418== Locks
held: 1, at address 0x7FEFDB008==8418==    at 0x4A063C0: free
(vg_replace_malloc.c:446)==8418==    by 0x3BA3A9DBE8: tzset_internal
(tzset.c:435)==8418==    by 0x3BA3A9DD68: __tz_convert
(tzset.c:624)==8418==    by 0x3BAFC3B63A:
resip::Log::timestamp(resip::Data&) (Log.cxx:437)==8418==    by
0x3BAFC3CF43: resip::Log::tags(resip::Log::Level, resip::Subsystem
const&, char const*, int, std::ostream&) (Log.cxx:388)==8418==    by
0x3BAFC3D22C: resip::Log::Guard::Guard(resip::Log::Level,
resip::Subsystem const&, char const*, int) (Log.cxx:731)==8418==    by
0x3BB057255E: resip::TuSelectorTimerQueue::add(unsigned int,
resip::Message*) (TimerQueue.cxx:124)==8418==    by 0x3BB0566088:
resip::SipStack::postMS(std::auto_ptr, unsigned int,
resip::TransactionUser*) (SipStack.cxx:697)
Apparently localtime() is used in resip::Log::timestamp:
    420    if (result == -1)    421    {    422       /* If we can't
get the time of day, don't print a timestamp.    423          Under
Unix, this will never happen:  gettimeofday can fail only    424      
   if the timezone is invalid which it can't be, since it is    425   
      uninitialized]or if tv or tz are invalid pointers. */    426    
  datebuf [0] = 0;    427    }    428    else    429    {    430      
/* The tv_sec field represents the number of seconds passed since   
431          the Epoch, which is exactly the argument gettimeofday
needs. */    432       const time_t timeInSeconds = (time_t)
tv.tv_sec;    433       strftime (datebuf,    434                
datebufSize,    435                 "%Y%m%d-%H%M%S", /* guaranteed to
fit in 256 chars,    436                                     hence
don't check return code */    437                 localtime
(&timeInSeconds));    438    }
Which is not thread-safe according to 'man 3 localtime':
       The four functions asctime(), ctime(), gmtime() and localtime()
return a pointer to  static  data  and       hence  are not
thread-safe.  Thread-safe versions asctime_r(), ctime_r(), gmtime_r()
and localtime_r()       are specified by SUSv2, and available since
libc 5.2.5.
Could you please comment this Helgrind report? Is it "fixable" from
your side?
Thank you!Dean 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.resiprocate.org/pipermail/resiprocate-devel/attachments/20140210/c7732f4b/attachment.htm>


More information about the resiprocate-devel mailing list