]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 313189 via svnmerge from
authorRichard Mudgett <rmudgett@digium.com>
Mon, 11 Apr 2011 15:40:30 +0000 (15:40 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Mon, 11 Apr 2011 15:40:30 +0000 (15:40 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.6.2

................
  r313189 | rmudgett | 2011-04-11 10:32:53 -0500 (Mon, 11 Apr 2011) | 32 lines

  Merged revisions 313188 via svnmerge from
  https://origsvn.digium.com/svn/asterisk/branches/1.4

  ........
    r313188 | rmudgett | 2011-04-11 10:27:52 -0500 (Mon, 11 Apr 2011) | 25 lines

    Stuck channel using FEATD_MF if caller hangs up at the right time.

    The cause was actually a caller hanging up just at the end of the Feature
    Group D DTMF tones that setup the call.  The reason for this is a "guard
    timer" that's implemented using ast_safe_sleep(100).  If the caller
    happens to hang up AFTER the final tone of the DTMF string but BEFORE the
    end of that ast_safe_sleep(), then ast_safe_sleep() will return non-zero.
    This causes the code to bounce to the end of ss_thread(), but it does NOT
    tear down the call properly.

    This should be a rare occurrence because the caller has to hang up at
    EXACTLY the right time.  Nonetheless, it was happening quite regularly on
    the reporter's system.  It's not easily reproducible, unless you purposely
    increase the guard-time to 2000 or more.  Once you do that, you can
    reproduce it every time by watching the DTMF debug and hanging up just as
    it ends.

    Simply add an ast_hangup() before goto quit.

    (closes issue #15671)
    Reported by: jcromes
    Patches:
          issue15671.patch uploaded by pabelanger (license 224)
    Tested by: jcromes
  ........
................

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@313190 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_dahdi.c
channels/sig_analog.c

index b5a02d9859b45cb39a71e9a9e150528fb1c7f657..88aada55aa61cf84499e2539cdc405f64b1cd29e 100644 (file)
@@ -9921,7 +9921,10 @@ static void *analog_ss_thread(void *data)
                        /* some switches require a minimum guard time between
                           the last FGD wink and something that answers
                           immediately. This ensures it */
-                       if (ast_safe_sleep(chan,100)) goto quit;
+                       if (ast_safe_sleep(chan, 100)) {
+                               ast_hangup(chan);
+                               goto quit;
+                       }
                }
                dahdi_enable_ec(p);
                if (NEED_MFDETECT(p)) {
index 1b40a9f585e8e4645c6a3bec82b3d6fd7617c25d..17762ccd8453168bde6d430565ed126f45c28557 100644 (file)
@@ -2007,10 +2007,13 @@ static void *__analog_ss_thread(void *data)
                }
                if ((p->sig == ANALOG_SIG_FEATDMF) || (p->sig == ANALOG_SIG_FEATDMF_TA)) {
                        analog_wink(p, idx);
-                       /* some switches require a minimum guard time between
-                       the last FGD wink and something that answers
-                       immediately. This ensures it */
-                       if (ast_safe_sleep(chan,100)) {
+                       /*
+                        * Some switches require a minimum guard time between the last
+                        * FGD wink and something that answers immediately.  This
+                        * ensures it.
+                        */
+                       if (ast_safe_sleep(chan, 100)) {
+                               ast_hangup(chan);
                                goto quit;
                        }
                }