On 31.05.19 at 19:25 Joshua C. Colp wrote:
> On Fri, May 31, 2019, at 1:57 PM, Michael Maier wrote:
>
> <snip>
>
>>
>> Thanks Joshua!
>>
>> I added the attached changes. Afterwards, I could see one SIGSEGV so
>> far which I can't understand. I would be very happy, if you could take
>> a
>> look at it - maybe you have an idea? Most probably I'm doing something
>> I shouldn't do (locking problem)?
>>
>> What I'm doing:
>> In qualify_contact_cb, I'm checking for the status code of the received
>> response. If the status code is 494, I'm again calling
>> sip_options_qualify_contact() with the flag 494. In
>> sip_options_qualify_contact, I'm checking for the flag == 494 to add
>> the additional mediasec
>> headers.
>>
>>
>> Strangely, suddenly I could see one SIGSEGV (seems not (easily) to be
>> reproducible) in
>> qualify_contact_cb(void *token, pjsip_event e) at
>>
>> if (e->body.tsx_state.src.rdata->msg_info.msg->line.status.code == 494) {
>>
>> according core dump.
>>
>> The crash directly happened after a successful sequence of mediasec
>> relevant endpoint (endpoint2):
>>
>> - request OPTIONS
>> - response 494
>> - request OPTIONS w/ MEDIASEC
>> - response 200 OK
>> - Crash
>>
>> Obviously, there has been a problem with the processing of the received
>> 200 OK. But why?
>
> You are assuming that the callback will always have a message. This isn't
> true. The callback can occur if the request was sent and it received no
> response. The switch statement handles this, specifically the
> PJSIP_EVENT_RX_MSG type, which occurs if there is a response received.
Thanks for your very fast and kind support! I really missed the fact that there
could be a callback w/o any response because of timeout. To
be honest: I just didn't know that (but it is logically consistent because
otherwise you wouldn't know what happened)! Therefore, I moved
the check behind the switch as suggested and check at first for status ==
AVAILABLE. This should work now.
Thanks
Michael
diff -urN asterisk-16.3.0.orig/res/res_pjsip/pjsip_options.c asterisk-16.3.0/res/res_pjsip/pjsip_options.c
--- asterisk-16.3.0.orig/res/res_pjsip/pjsip_options.c 2019-04-04 16:49:57.000000000 +0200
+++ asterisk-16.3.0/res/res_pjsip/pjsip_options.c 2019-05-31 19:56:42.732000000 +0200
@@ -212,6 +212,8 @@
*/
static struct ast_taskprocessor *management_serializer;
+static int sip_options_qualify_contact(void *obj, void *arg, int flags);
+
static pj_status_t send_options_response(pjsip_rx_data *rdata, int code)
{
pjsip_endpoint *endpt = ast_sip_get_pjsip_endpoint();
@@ -801,6 +803,14 @@
break;
}
+ /* check for 494 */
+ if (status == AVAILABLE && e->body.tsx_state.src.rdata->msg_info.msg->line.status.code == 494) {
+ /* need to resend the options request with mediasec headers */
+ ast_verb(3,"detected 494 - call sip_options_qualify_contact again with mediasec header\n");
+ sip_options_qualify_contact(contact_callback_data->contact, contact_callback_data->aor_options, 494);
+ return;
+ }
+
/* Update the callback data with the new status, this will get handled in the AOR serializer */
contact_callback_data->status = status;
@@ -905,6 +915,14 @@
return 0;
}
+ if (flags && flags == 494) {
+ /* add mediasec header */
+ ast_verb(3,"OPTIONS: adding MEDIASEC headers\n");
+ ast_sip_add_header(tdata,"Security-Verify","msrp-tls;mediasec");
+ ast_sip_add_header(tdata,"Security-Verify","sdes-srtp;mediasec");
+ ast_sip_add_header(tdata,"Security-Verify","dtls-srtp;mediasec");
+ }
+
if (ast_sip_send_out_of_dialog_request(tdata, endpoint,
(int)(aor_options->qualify_timeout * 1000), contact_callback_data,
qualify_contact_cb)) {
--
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --
asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
http://lists.digium.com/mailman/listinfo/asterisk-dev