Merged revisions 339463 via svnmerge from
authorGregory Nietsky <gregory@distrotech.co.za>
Wed, 5 Oct 2011 06:40:40 +0000 (06:40 +0000)
committerGregory Nietsky <gregory@distrotech.co.za>
Wed, 5 Oct 2011 06:40:40 +0000 (06:40 +0000)
https://origsvn.digium.com/svn/asterisk/branches/10

........
  r339463 | irroot | 2011-10-05 08:28:46 +0200 (Wed, 05 Oct 2011) | 9 lines

  Only change the capabilities on the gateway when
  the session is been destroyed there is still
  a race condition that ends in a segfault.

  if the caps are changed the logic in res_fax_spandsp
  will run T30 code not gateway code to end the session.
  this has been experienced on a "slower" under spec system.
........

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

res/res_fax.c

index ae59937..8966e01 100644 (file)
@@ -826,6 +826,9 @@ static void destroy_session(void *session)
        }
 
        if (s->details) {
+               if (s->details->caps & AST_FAX_TECH_GATEWAY) {
+                       s->details->caps &= ~AST_FAX_TECH_GATEWAY;
+               }
                ao2_ref(s->details, -1);
        }
        
@@ -1704,7 +1707,7 @@ static int receivefax_exec(struct ast_channel *chan, const char *data)
        ast_string_field_set(details, error, "INIT_ERROR");
        set_channel_variables(chan, details);
 
-       if ((details->caps & AST_FAX_TECH_GATEWAY) && (details->gateway_id > 0)) {
+       if (details->gateway_id > 0) {
                ast_string_field_set(details, resultstr, "can't receive a fax on a channel with a T.38 gateway");
                set_channel_variables(chan, details);
                ast_log(LOG_ERROR, "executing ReceiveFAX on a channel with a T.38 Gateway is not supported\n");
@@ -2174,7 +2177,7 @@ static int sendfax_exec(struct ast_channel *chan, const char *data)
        ast_string_field_set(details, error, "INIT_ERROR");
        set_channel_variables(chan, details);
 
-       if ((details->caps & AST_FAX_TECH_GATEWAY) && (details->gateway_id > 0)) {
+       if (details->gateway_id > 0) {
                ast_string_field_set(details, resultstr, "can't send a fax on a channel with a T.38 gateway");
                set_channel_variables(chan, details);
                ast_log(LOG_ERROR, "executing SendFAX on a channel with a T.38 Gateway is not supported\n");
@@ -2431,7 +2434,6 @@ static void destroy_gateway(void *data)
        if (gateway->s) {
                fax_session_release(gateway->s, gateway->token);
                gateway->token = NULL;
-               gateway->s->details->caps &= ~AST_FAX_TECH_GATEWAY;
 
                ao2_lock(faxregistry.container);
                ao2_unlink(faxregistry.container, gateway->s);