Index: channel.c =================================================================== --- channel.c (revision 7613) +++ channel.c (working copy) @@ -1778,6 +1778,7 @@ struct ast_frame *f = NULL; int blah; int prestate; + char *fromwhere = NULL; #ifdef ZAPTEL_OPTIMIZATIONS int (*func)(void *); void *data; @@ -1814,6 +1815,7 @@ /* Drop first digit */ memmove(chan->dtmfq, chan->dtmfq + 1, sizeof(chan->dtmfq) - 1); ast_mutex_unlock(&chan->lock); + ast_log(LOG_NOTICE, "Returning frame from deferred DTMF (chan=%s)\n", chan->name); return &chan->dtmff; } @@ -1875,22 +1877,25 @@ if ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP)) { ast_frfree(f); f = NULL; - } + } else + fromwhere = "chan->readq"; } else { chan->blocker = pthread_self(); if (ast_test_flag(chan, AST_FLAG_EXCEPTION)) { - if (chan->tech->exception) + if (chan->tech->exception) { f = chan->tech->exception(chan); - else { + fromwhere = "chan->tech->exception"; + } else { ast_log(LOG_WARNING, "Exception flag set on '%s', but no exception handler\n", chan->name); f = &null_frame; } /* Clear the exception flag */ ast_clear_flag(chan, AST_FLAG_EXCEPTION); } else { - if (chan->tech->read) + if (chan->tech->read) { f = chan->tech->read(chan); - else + fromwhere = "chan->tech->read"; + } else ast_log(LOG_WARNING, "No read routine on channel %s\n", chan->name); } } @@ -1994,6 +1999,9 @@ chan->fin &= 0x80000000; else chan->fin++; + if (fromwhere && f && (f->frametype < 0 || f->frametype > 11)) { + ast_log(LOG_WARNING, "Queueing possible bogus frame from %s (chan=%s)\n", fromwhere, chan->name); + } ast_mutex_unlock(&chan->lock); return f; }