mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-29 07:24:55 +00:00 
			
		
		
		
	Fix deadlock during dialplan reload.
Another deadlock between the conlock/hints and channels/channel locking
orders.
* Don't hold the channel and private lock in sip_new() when calling
ast_exists_extension().
(closes issue ASTERISK-18740)
Reported by: Byron Clark
Patches:
      sip_exists_exten_dlock_3.diff (license #5041) patch uploaded by Gregory Hinton Nietsky
      ASTERISK-18740.patch (license #6157) patch uploaded by Byron Clark
Tested by: Byron Clark
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@344268 65c4cc65-6c06-0410-ace0-fbb531ad65f3
			
			
This commit is contained in:
		| @@ -6937,7 +6937,7 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit | |||||||
| 	format_t needvideo = 0; | 	format_t needvideo = 0; | ||||||
| 	int needtext = 0; | 	int needtext = 0; | ||||||
| 	char buf[SIPBUFSIZE]; | 	char buf[SIPBUFSIZE]; | ||||||
| 	char *decoded_exten; | 	char *exten; | ||||||
| 
 | 
 | ||||||
| 	{ | 	{ | ||||||
| 		const char *my_name;	/* pick a good name */ | 		const char *my_name;	/* pick a good name */ | ||||||
| @@ -7077,14 +7077,15 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit | |||||||
| 	 * we should decode the uri before storing it in the channel, but leave it encoded in the sip_pvt | 	 * we should decode the uri before storing it in the channel, but leave it encoded in the sip_pvt | ||||||
| 	 * structure so that there aren't issues when forming URI's | 	 * structure so that there aren't issues when forming URI's | ||||||
| 	 */ | 	 */ | ||||||
| 	if (ast_exists_extension(NULL, i->context, i->exten, 1, i->cid_num)) { | 	exten = ast_strdupa(i->exten); | ||||||
| 		/* encoded in dialplan, so keep extension encoded */ | 	sip_pvt_unlock(i); | ||||||
| 		ast_copy_string(tmp->exten, i->exten, sizeof(tmp->exten)); | 	ast_channel_unlock(tmp); | ||||||
| 	} else { | 	if (!ast_exists_extension(NULL, i->context, i->exten, 1, i->cid_num)) { | ||||||
| 		decoded_exten = ast_strdupa(i->exten); | 		ast_uri_decode(exten); | ||||||
| 		ast_uri_decode(decoded_exten); |  | ||||||
| 		ast_copy_string(tmp->exten, decoded_exten, sizeof(tmp->exten)); |  | ||||||
| 	} | 	} | ||||||
|  | 	ast_channel_lock(tmp); | ||||||
|  | 	sip_pvt_lock(i); | ||||||
|  | 	ast_copy_string(tmp->exten, exten, sizeof(tmp->exten)); | ||||||
| 
 | 
 | ||||||
| 	/* Don't use ast_set_callerid() here because it will
 | 	/* Don't use ast_set_callerid() here because it will
 | ||||||
| 	 * generate an unnecessary NewCallerID event  */ | 	 * generate an unnecessary NewCallerID event  */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user