@@ -2114,8 +2114,12 @@ void janus_sip_destroy_session(janus_plugin_session *handle, int *error) {
2114
2114
session -> refer_id = 0 ;
2115
2115
}
2116
2116
/* Shutdown the NUA */
2117
- if (session -> stack && session -> stack -> s_nua )
2118
- nua_shutdown (session -> stack -> s_nua );
2117
+ if (session -> stack ) {
2118
+ janus_mutex_lock (& session -> stack -> smutex );
2119
+ if (session -> stack -> s_nua )
2120
+ nua_shutdown (session -> stack -> s_nua );
2121
+ janus_mutex_unlock (& session -> stack -> smutex );
2122
+ }
2119
2123
g_hash_table_remove (sessions , handle );
2120
2124
janus_mutex_unlock (& sessions_mutex );
2121
2125
return ;
@@ -2978,7 +2982,16 @@ static void *janus_sip_handler(void *data) {
2978
2982
char custom_params [2048 ];
2979
2983
janus_sip_parse_custom_contact_params (root , (char * )& custom_params , sizeof (custom_params ));
2980
2984
/* Create a new NUA handle */
2985
+ janus_mutex_lock (& session -> stack -> smutex );
2986
+ if (session -> stack -> s_nua == NULL ) {
2987
+ janus_mutex_unlock (& session -> stack -> smutex );
2988
+ JANUS_LOG (LOG_ERR , "NUA destroyed while registering?\n" );
2989
+ error_code = JANUS_SIP_ERROR_LIBSOFIA_ERROR ;
2990
+ g_snprintf (error_cause , 512 , "Invalid NUA" );
2991
+ goto error ;
2992
+ }
2981
2993
session -> stack -> s_nh_r = nua_handle (session -> stack -> s_nua , session , TAG_END ());
2994
+ janus_mutex_unlock (& session -> stack -> smutex );
2982
2995
if (session -> stack -> s_nh_r == NULL ) {
2983
2996
JANUS_LOG (LOG_ERR , "NUA Handle for REGISTER still null??\n" );
2984
2997
error_code = JANUS_SIP_ERROR_LIBSOFIA_ERROR ;
@@ -3090,16 +3103,34 @@ static void *janus_sip_handler(void *data) {
3090
3103
nh = g_hash_table_lookup (session -> stack -> subscriptions , (char * )event_type );
3091
3104
if (nh == NULL ) {
3092
3105
/* We don't, create one now */
3093
- if (!session -> helper )
3106
+ if (!session -> helper ) {
3107
+ janus_mutex_lock (& session -> stack -> smutex );
3108
+ if (session -> stack -> s_nua == NULL ) {
3109
+ janus_mutex_unlock (& session -> stack -> smutex );
3110
+ JANUS_LOG (LOG_ERR , "NUA destroyed while subscribing?\n" );
3111
+ error_code = JANUS_SIP_ERROR_LIBSOFIA_ERROR ;
3112
+ g_snprintf (error_cause , 512 , "Invalid NUA" );
3113
+ goto error ;
3114
+ }
3094
3115
nh = nua_handle (session -> stack -> s_nua , session , TAG_END ());
3095
- else {
3116
+ janus_mutex_unlock (& session -> stack -> smutex );
3117
+ } else {
3096
3118
/* This is a helper, we need to use the master's SIP stack */
3097
3119
if (session -> master == NULL || session -> master -> stack == NULL ) {
3098
3120
error_code = JANUS_SIP_ERROR_HELPER_ERROR ;
3099
3121
g_snprintf (error_cause , 512 , "Invalid master SIP stack" );
3100
3122
goto error ;
3101
3123
}
3124
+ janus_mutex_lock (& session -> master -> stack -> smutex );
3125
+ if (session -> master -> stack -> s_nua == NULL ) {
3126
+ janus_mutex_unlock (& session -> master -> stack -> smutex );
3127
+ JANUS_LOG (LOG_ERR , "NUA destroyed while subscribing?\n" );
3128
+ error_code = JANUS_SIP_ERROR_LIBSOFIA_ERROR ;
3129
+ g_snprintf (error_cause , 512 , "Invalid NUA" );
3130
+ goto error ;
3131
+ }
3102
3132
nh = nua_handle (session -> master -> stack -> s_nua , session , TAG_END ());
3133
+ janus_mutex_unlock (& session -> master -> stack -> smutex );
3103
3134
}
3104
3135
if (session -> stack -> subscriptions == NULL ) {
3105
3136
/* We still need a table for mapping these subscriptions as well */
@@ -3328,7 +3359,16 @@ static void *janus_sip_handler(void *data) {
3328
3359
if (session -> stack -> s_nh_i != NULL )
3329
3360
nua_handle_destroy (session -> stack -> s_nh_i );
3330
3361
if (!session -> helper ) {
3362
+ janus_mutex_lock (& session -> stack -> smutex );
3363
+ if (session -> stack -> s_nua == NULL ) {
3364
+ janus_mutex_unlock (& session -> stack -> smutex );
3365
+ JANUS_LOG (LOG_ERR , "NUA destroyed while calling?\n" );
3366
+ error_code = JANUS_SIP_ERROR_LIBSOFIA_ERROR ;
3367
+ g_snprintf (error_cause , 512 , "Invalid NUA" );
3368
+ goto error ;
3369
+ }
3331
3370
session -> stack -> s_nh_i = nua_handle (session -> stack -> s_nua , session , TAG_END ());
3371
+ janus_mutex_unlock (& session -> stack -> smutex );
3332
3372
if (session -> account .display_name ) {
3333
3373
g_snprintf (from_hdr , sizeof (from_hdr ), "\"%s\" <%s>" , session -> account .display_name , session -> account .identity );
3334
3374
} else {
@@ -3344,7 +3384,18 @@ static void *janus_sip_handler(void *data) {
3344
3384
g_snprintf (error_cause , 512 , "Invalid master SIP stack" );
3345
3385
goto error ;
3346
3386
}
3387
+ janus_mutex_lock (& session -> master -> stack -> smutex );
3388
+ if (session -> master -> stack -> s_nua == NULL ) {
3389
+ janus_mutex_unlock (& session -> master -> stack -> smutex );
3390
+ g_free (sdp );
3391
+ session -> sdp = NULL ;
3392
+ janus_sdp_destroy (parsed_sdp );
3393
+ error_code = JANUS_SIP_ERROR_LIBSOFIA_ERROR ;
3394
+ g_snprintf (error_cause , 512 , "Invalid NUA" );
3395
+ goto error ;
3396
+ }
3347
3397
session -> stack -> s_nh_i = nua_handle (session -> master -> stack -> s_nua , session , TAG_END ());
3398
+ janus_mutex_unlock (& session -> master -> stack -> smutex );
3348
3399
if (session -> master -> account .display_name ) {
3349
3400
g_snprintf (from_hdr , sizeof (from_hdr ), "\"%s\" <%s>" , session -> master -> account .display_name , session -> master -> account .identity );
3350
3401
} else {
@@ -6516,7 +6567,19 @@ gpointer janus_sip_sofia_thread(gpointer user_data) {
6516
6567
TAG_NULL ());
6517
6568
su_root_run (session -> stack -> s_root );
6518
6569
/* When we get here, we're done */
6519
- nua_destroy (session -> stack -> s_nua );
6570
+ janus_mutex_lock (& session -> stack -> smutex );
6571
+ nua_t * s_nua = session -> stack -> s_nua ;
6572
+ session -> stack -> s_nua = NULL ;
6573
+ janus_mutex_unlock (& session -> stack -> smutex );
6574
+ if (session -> stack -> s_nh_r != NULL ) {
6575
+ nua_handle_destroy (session -> stack -> s_nh_r );
6576
+ session -> stack -> s_nh_r = NULL ;
6577
+ }
6578
+ if (session -> stack -> s_nh_i != NULL ) {
6579
+ nua_handle_destroy (session -> stack -> s_nh_i );
6580
+ session -> stack -> s_nh_i = NULL ;
6581
+ }
6582
+ nua_destroy (s_nua );
6520
6583
su_root_destroy (session -> stack -> s_root );
6521
6584
session -> stack -> s_root = NULL ;
6522
6585
janus_refcount_decrease (& session -> ref );
0 commit comments