res_pjsip_t38: Fix T.38 failure when peer reinvites immediately.
authorJoshua Colp <jcolp@digium.com>
Tue, 16 Dec 2014 15:44:43 +0000 (15:44 +0000)
committerJoshua Colp <jcolp@digium.com>
Tue, 16 Dec 2014 15:44:43 +0000 (15:44 +0000)
If a remote endpoint reinvites to T.38 immediately the state machine
will go into a peer reinvite state. If a T.38 capable application
(such as ReceiveFax) queries it will receive this state. Normally
the application will then indicate so that the channel driver will
queue up the T.38 offer previously received. Once it receives this
offer the application will act normally and negotiate.

The res_pjsip_t38 module incorrectly partially squashed this indication.
This would cause the application to think the request had failed when
in reality it had actually worked.

This change makes it so that no T.38 control frames (or indications)
are squashed.
........

Merged revisions 429612 from http://svn.asterisk.org/svn/asterisk/branches/13

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

res/res_pjsip_t38.c

index d1ec076..1dba15a 100644 (file)
@@ -113,7 +113,11 @@ static struct t38_parameters_task_data *t38_parameters_task_data_alloc(struct as
 
        data->session = session;
        ao2_ref(session, +1);
-       data->frame = frame;
+       data->frame = ast_frdup(frame);
+       if (!data->frame) {
+               ao2_ref(data, -1);
+               data = NULL;
+       }
 
        return data;
 }
@@ -396,8 +400,6 @@ static struct ast_frame *t38_framehook_write(struct ast_sip_session *session, st
                if (ast_sip_push_task(session->serializer, t38_interpret_parameters, data)) {
                        ao2_ref(data, -1);
                }
-
-               f = &ast_null_frame;
        } else if (f->frametype == AST_FRAME_MODEM) {
                RAII_VAR(struct ast_sip_session_media *, session_media, NULL, ao2_cleanup);