+++ /dev/null
-Index: src/session.cpp
-===================================================================
---- src/session.cpp (revision 223)
-+++ src/session.cpp (working copy)
-@@ -653,18 +653,19 @@
- case DTMF_AUTO:
- case DTMF_INBAND:
- get_line()->ci_set_dtmf_supported(true, true);
-+ ui->cb_dtmf_supported(get_line()->get_line_number());
- break;
- case DTMF_RFC2833:
- get_line()->ci_set_dtmf_supported(false);
-+ ui->cb_dtmf_not_supported(get_line()->get_line_number());
- break;
- case DTMF_INFO:
- get_line()->ci_set_dtmf_supported(true, false, true);
-+ ui->cb_dtmf_supported(get_line()->get_line_number());
- break;
- default:
- assert(false);
- }
--
-- ui->cb_line_state_changed();
- }
-
- audio_rtp_session->run();
-@@ -675,10 +676,10 @@
- MEMMAN_DELETE(audio_rtp_session);
- delete audio_rtp_session;
- audio_rtp_session = NULL;
-+
-+ get_line()->ci_set_dtmf_supported(false);
-+ ui->cb_line_state_changed();
- }
--
-- get_line()->ci_set_dtmf_supported(false);
-- ui->cb_line_state_changed();
- }
-
- t_audio_session *t_session::get_audio_session(void) const {
+++ /dev/null
-Index: src/line.cpp
-===================================================================
---- src/line.cpp (revision 225)
-+++ src/line.cpp (working copy)
-@@ -966,9 +966,8 @@
- } else {
- d->recvd_response(r, tuid, tid);
- }
-- }
--
-- if (r->hdr_cseq.method == INVITE) {
-+ } else {
-+ d->recvd_response(r, tuid, tid);
- pending_dialogs.remove(d);
- MEMMAN_DELETE(d);
- delete d;
+++ /dev/null
-Index: src/audits/memman.cpp
-===================================================================
---- src/audits/memman.cpp (revision 223)
-+++ src/audits/memman.cpp (working copy)
-@@ -114,13 +114,22 @@
- return;
- }
-
-- pointer_map.erase(p);
-+
- bool array_mismatch = (is_array != i->second.is_array);
-- mtx_memman.unlock();
-
- // Check mixing of array new/delete
-+ // NOTE: after the pointer has been erased from pointer_map, the
-+ // iterator i is invalid.
-+ // The mutex mtx_memman should be unlocked before logging to
-+ // avoid dead locks.
- if (array_mismatch) {
- num_array_mixing++;
-+ string allocation_filename = i->second.filename;
-+ int allocation_lineno = i->second.lineno;
-+ bool allocation_is_array = i->second.is_array;
-+ pointer_map.erase(p);
-+ mtx_memman.unlock();
-+
- log_file->write_header("t_memman::trc_delete",
- LOG_MEMORY, LOG_WARNING);
- log_file->write_raw(filename);
-@@ -130,21 +139,24 @@
- log_file->write_raw(ptr2str(p));
- log_file->write_raw(" is deleted ");
- if (is_array) {
-- log_file->write_raw(" as array (delete []).\n");
-+ log_file->write_raw("as array (delete []).\n");
- } else {
-- log_file->write_raw(" normally (delete).\n");
-+ log_file->write_raw("normally (delete).\n");
- }
- log_file->write_raw("But it was allocated ");
-- if (i->second.is_array) {
-- log_file->write_raw(" as array (new []) \n");
-+ if (allocation_is_array) {
-+ log_file->write_raw("as array (new []) \n");
- } else {
-- log_file->write_raw(" normally (new) \n");
-+ log_file->write_raw("normally (new) \n");
- }
-- log_file->write_raw(i->second.filename);
-+ log_file->write_raw(allocation_filename);
- log_file->write_raw(", line ");
-- log_file->write_raw(i->second.lineno);
-+ log_file->write_raw(allocation_lineno);
- log_file->write_endl();
- log_file->write_footer();
-+ } else {
-+ pointer_map.erase(p);
-+ mtx_memman.unlock();
- }
- }
-