[reSIProcate] DNS Crash?
Hi,
I am testing a case where a client attempts to REGISTER shortly after
network connectivity is lost.
When I launch my client, disable my network adapter, then try to REGISTER,
reSIProcates crashes. I have included the stack trace below. assert causes
an access violation because the value of "this" is something like
0xdddddddd (I also saw 0xfeeefeee).
I only see this happening shortly after network connectivity is lost. If I
try again, I get a DNS 503 "service not available" error, as expected. If I
wait a while after the network is disabled, the problem does not occur.
Has anyone seen this? I am using reSIProcate 0.9
CG
> xxxxxxxx.dll!resip::DnsResult::available() Line 103 + 0x3 C++
DnsResult::Type
DnsResult::available()
{
>> assert(mType != Destroyed);
if (mType == Available)
>
xxxxxxxx.dll!resip::TransactionState::sendToWire(resip::TransactionMessage
* msg=0x02a85458, bool resend=false) Line 1498 + 0xb C++
else if (mDnsResult == 0 && !mIsCancel) // no dns query yet
{
StackLog (<< "sendToWire with no dns result: " << *this);
assert(sip->isRequest());
assert(!mIsCancel);
mDnsResult =
mController.mTransportSelector.createDnsResult(this);
mController.mTransportSelector.dnsResolve(mDnsResult, sip);
assert(mDnsResult); // !ah! is this really an assertion or an
error?
// do it now, if there is an immediate result
>> if (mDnsResult->available() == DnsResult::Available)
{
handle(mDnsResult);
}
>
xxxxxxxx.dll!resip::TransactionState::processClientNonInvite(resip::TransactionMessage
* msg=0x02a85458) Line 444 C++
void
TransactionState::processClientNonInvite(TransactionMessage* msg)
{
StackLog (<< "TransactionState::processClientNonInvite: " <<
msg->brief());
assert(!isInvite(msg));
if (isRequest(msg) && isFromTU(msg))
{
//StackLog (<< "received new non-invite request");
SipMessage* sip = dynamic_cast<SipMessage*>(msg);
delete mMsgToRetransmit;
mMsgToRetransmit = sip;
mController.mTimers.add(Timer::TimerF, mId, Timer::TF);
>> sendToWire(sip); // don't delete
}
else if (isResponse(msg) && isFromWire(msg)) // from the wire
...
>
xxxxxxxx.dll!resip::TransactionState::process(resip::TransactionController
& controller={...}) Line 353 C++
...
switch (state->mMachine)
{
case ClientNonInvite:
>> state->processClientNonInvite(message);
break;
case ClientInvite:
...
> xxxxxxxx.dll!resip::TransactionController::process(resip::FdSet &
fdset={...}) Line 91 + 0x9 C++
...
while (mStateMacFifo.messageAvailable())
{
if (mStateless)
{
mStatelessHandler.process();
}
else
{
>> TransactionState::process(*this);
}
}
}
}
> xxxxxxxx.dll!resip::SipStack::process(resip::FdSet & fdset={...})
Line 422 C++
void
SipStack::process(FdSet& fdset)
{
if(!mShuttingDown)
{
RESIP_STATISTICS(mStatsManager.process());
}
mTransactionController.process(fdset);
>> mTuSelector.process();
Lock lock(mAppTimerMutex);
mAppTimers.process();
}
> xxxxxxxx.dll!CSIPStack::ThreadProc(void * lpParameter=0x00000000)
Line 462 C++
...
stackUac.process(fdset);
>> while(clientDum.process());
...
> xxxxxxxx.dll!CWorkerThread::StaticThreadProc(void *
lpParameter=0x015467b4) Line 86 + 0x10 C++