Fix crashes in res_pjsip_sdp_rtp and res_pjsip_t38 when a stream is rejected and...
[asterisk/asterisk.git] / res / res_pjsip_sdp_rtp.c
index c97c0cb..57c673e 100644 (file)
@@ -849,7 +849,9 @@ static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct as
        char tmp[512];
        pj_str_t stmp;
        pjmedia_sdp_attr *attr;
-       int index = 0, min_packet_size = 0, noncodec = (session->endpoint->dtmf == AST_SIP_DTMF_RFC_4733) ? AST_RTP_DTMF : 0;
+       int index = 0;
+       int noncodec = (session->endpoint->dtmf == AST_SIP_DTMF_RFC_4733) ? AST_RTP_DTMF : 0;
+       int min_packet_size = 0, max_packet_size = 0;
        int rtp_code;
        struct ast_format format;
        RAII_VAR(struct ast_format_cap *, caps, NULL, ast_format_cap_destroy);
@@ -887,7 +889,7 @@ static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct as
        /* Add connection level details */
        if (direct_media_enabled) {
                ast_copy_string(hostip, ast_sockaddr_stringify_fmt(&session_media->direct_media_addr, AST_SOCKADDR_STR_ADDR), sizeof(hostip));
-       } else if (ast_strlen_zero(session->endpoint->media.external_address)) {
+       } else if (ast_strlen_zero(session->endpoint->media.address)) {
                pj_sockaddr localaddr;
 
                if (pj_gethostip(session->endpoint->media.rtp.ipv6 ? pj_AF_INET6() : pj_AF_INET(), &localaddr)) {
@@ -895,7 +897,7 @@ static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct as
                }
                pj_sockaddr_print(&localaddr, hostip, sizeof(hostip), 2);
        } else {
-               ast_copy_string(hostip, session->endpoint->media.external_address, sizeof(hostip));
+               ast_copy_string(hostip, session->endpoint->media.address, sizeof(hostip));
        }
 
        media->conn->net_type = STR_IN;
@@ -951,6 +953,10 @@ static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct as
                        if (fmt.cur_ms && ((fmt.cur_ms < min_packet_size) || !min_packet_size)) {
                                min_packet_size = fmt.cur_ms;
                        }
+
+                       if (fmt.max_ms && ((fmt.max_ms < max_packet_size) || !max_packet_size)) {
+                               max_packet_size = fmt.max_ms;
+                       }
                }
        }
 
@@ -983,6 +989,12 @@ static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct as
                media->attr[media->attr_count++] = attr;
        }
 
+       if (max_packet_size) {
+               snprintf(tmp, sizeof(tmp), "%d", max_packet_size);
+               attr = pjmedia_sdp_attr_create(pool, "maxptime", pj_cstr(&stmp, tmp));
+               media->attr[media->attr_count++] = attr;
+       }
+
        /* Add the sendrecv attribute - we purposely don't keep track because pjmedia-sdp will automatically change our offer for us */
        attr = PJ_POOL_ZALLOC_T(pool, pjmedia_sdp_attr);
        attr->name = STR_SENDRECV;
@@ -1085,6 +1097,11 @@ static void change_outgoing_sdp_stream_media_address(pjsip_tx_data *tdata, struc
        char host[NI_MAXHOST];
        struct ast_sockaddr addr = { { 0, } };
 
+       /* If the stream has been rejected there will be no connection line */
+       if (!stream->conn) {
+               return;
+       }
+
        ast_copy_pj_str(host, &stream->conn->addr, sizeof(host));
        ast_sockaddr_parse(&addr, host, PARSE_PORT_FORBID);