Package: twinkle
Version: 0.2.1-2
Severity: important
Tags: patch

I have found timing problems in the audio thread creations that can cause
crashes.

If twinkle receives a call via Asterisk from another SIP phone and Asterisk
reINVITEs the call to stay out of the audio path, there is a probability
that a audio thread won't begin execution before it's deleted as a
consequence of the reINVITE. But since the is_running flag haven't been set,
the dtors won't wait for the thread to finish. It's solved in my patch by
setting the is_running flags when the thread is created.

/Mikael


-- System Information:
Debian Release: testing/unstable
  APT prefers stable
  APT policy: (871, 'stable'), (50, 'testing'), (30, 'unstable'), (10, 
'unstable'), (1, 'experimental')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.11-vserver-k7
Locale: LANG=sv_SE.UTF-8, LC_CTYPE=sv_SE.UTF-8 (charmap=UTF-8)

Versions of packages twinkle depends on:
ii  libc6                     2.3.5-5        GNU C Library: Shared libraries an
ii  libccrtp1-1.3c2           1.3.4-1        Common C++ class framework for RTP
ii  libcommoncpp2-1.3c2       1.3.14-1       A GNU package for creating portabl
ii  libgcc1                   1:4.0.1-6      GCC support library
ii  libqt3-mt                 3:3.3.4-7      Qt GUI Library (Threaded runtime v
ii  libstdc++6                4.0.1-6        The GNU Standard C++ Library v3
ii  libx11-6                  6.8.2.dfsg.1-6 X Window System protocol client li
ii  libxext6                  6.8.2.dfsg.1-6 X Window System miscellaneous exte
ii  libxml2                   2.6.21-1       GNOME XML library
ii  xlibs                     6.8.2.dfsg.1-6 X Window System client libraries m
ii  zlib1g                    1:1.2.3-3      compression library - runtime

twinkle recommends no packages.

-- no debconf information
only in patch2:
unchanged:
--- twinkle-0.2.1.orig/src/audio/audio_session.cpp
+++ twinkle-0.2.1/src/audio/audio_session.cpp
@@ -672,11 +672,13 @@
 
        if (audio_rx) {
                try {
+                       audio_rx->set_running(true);
                        thr_audio_rx = new t_thread(main_audio_rx, NULL);
                        MEMMAN_NEW(thr_audio_rx);
                        // thr_audio_rx->set_sched_fifo(90);
                        thr_audio_rx->detach();
                } catch (int) {
+                       audio_rx->set_running(false);
                        string msg("Failed to create audio_rx thread.");
                        log_file->write_report(msg, "t_audio_session::run",
                                LOG_NORMAL, LOG_CRITICAL);
@@ -688,11 +690,13 @@
 
        if (audio_tx) {
                try {
+                       audio_tx->set_running(true);
                        thr_audio_tx = new t_thread(main_audio_tx, NULL);
                        MEMMAN_NEW(thr_audio_tx);
                        // thr_audio_tx->set_sched_fifo(90);
                        thr_audio_tx->detach();
                } catch (int) {
+                       audio_tx->set_running(false);
                        string msg("Failed to create audio_tx thread.");
                        log_file->write_report(msg, "t_audio_session::run",
                                LOG_NORMAL, LOG_CRITICAL);
only in patch2:
unchanged:
--- twinkle-0.2.1.orig/src/audio/audio_rx.cpp
+++ twinkle-0.2.1/src/audio/audio_rx.cpp
@@ -397,6 +397,10 @@
        }
 }
 
+void t_audio_rx::set_running(bool _is_running) {
+       is_running = _is_running;
+}
+
 void t_audio_rx::run(void) {
        int status;
        audio_buf_info dsp_info;
only in patch2:
unchanged:
--- twinkle-0.2.1.orig/src/audio/audio_rx.h
+++ twinkle-0.2.1/src/audio/audio_rx.h
@@ -156,6 +156,8 @@
 
        ~t_audio_rx();
 
+       void set_running(bool is_running);
+
        void run(void);
 
        // Set the dynamic payload type for telephone events
only in patch2:
unchanged:
--- twinkle-0.2.1.orig/src/audio/audio_tx.h
+++ twinkle-0.2.1/src/audio/audio_tx.h
@@ -148,6 +148,8 @@
 
        ~t_audio_tx();
 
+       void set_running(bool is_running);
+
        void run(void);
        
        // Set the dynamic payload type for telephone events
only in patch2:
unchanged:
--- twinkle-0.2.1.orig/src/audio/audio_tx.cpp
+++ twinkle-0.2.1/src/audio/audio_tx.cpp
@@ -330,6 +330,10 @@
        }
 }
 
+void t_audio_tx::set_running(bool _is_running) {
+       is_running = _is_running;
+}
+
 void t_audio_tx::run(void) {
        const AppDataUnit* adu;
        struct timespec sleeptimer;

Reply via email to