Hi,

I have found a bug with twice H323Connection::Unlock() call if we have an connection issue.

Take a look:

1.We are running connection.SendSignalSetup function from H225CallThread::Main() and if it returns any reason!=H323Connection::EndedByCallerAbort we will Unlock the connection.


void H225CallThread::Main()
{
  PTRACE(3, "H225\tStarted call thread");

  if (connection.Lock()) {
    H323Connection::CallEndReason reason = connection.SendSignalSetup(alias, address);

    // Special case, if we aborted the call then already will be unlocked
    if (reason != H323Connection::EndedByCallerAbort)
      connection.Unlock();

    // bla-bla-bla
}

2.But we have case when connection.SendSignalSetup returns non H323Connection::EndedByCallerAbort reason but has own unlocked state - for this case PTLIB will unlock the mutex twice with assert (as minimum) message.

H323Connection::SendSignalSetup(const PString & alias,
                                                              const H323TransportAddress & address)
{
//bla-bla-bla

      // Release the mutex as can deadlock trying to clear call during connect.
      Unlock();

      PBoolean connectFailed = false;
      if (!signallingChannel->IsOpen()) {
        signallingChannel->SetWriteTimeout(100);
        connectFailed = !signallingChannel->Connect();
      }

      // See if transport connect failed, abort if so.
      if (connectFailed) {
        connectionState = NoConnectionActive;
        switch (signallingChannel->GetErrorNumber()) {
          case ENETUNREACH :
            return EndedByUnreachable;
          case ECONNREFUSED :
            return EndedByNoEndPoint;
          case ETIMEDOUT :
            return EndedByHostOffline;
        }
        return EndedByConnectFail;
      }

}

Thanks
--
Iurii Gordiienko