mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	datastores: Audit ast_channel_datastore_remove usage.
Audit of v1.8 usage of ast_channel_datastore_remove() for datastore memory leaks. * Fixed leaks in app_speech_utils and func_frame_trace. * Fixed app_speech_utils not locking the channel when accessing the channel datastore list. Review: https://reviewboard.asterisk.org/r/3859/ Audit of v11 usage of ast_channel_datastore_remove() for datastore memory leaks. * Fixed leak in func_jitterbuffer. (Was not in v12) Review: https://reviewboard.asterisk.org/r/3860/ Audit of v12 usage of ast_channel_datastore_remove() for datastore memory leaks. * Fixed leaks in abstract_jb. * Fixed leak in ast_channel_unsuppress(). Used by ARI mute control and res_mutestream. * Fixed ref leak in ast_channel_suppress(). Used by ARI mute control and res_mutestream. Review: https://reviewboard.asterisk.org/r/3861/ ........ Merged revisions 419684 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 419685 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 419686 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@419688 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -290,7 +290,9 @@ static struct ast_speech *find_speech(struct ast_channel *chan) | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	ast_channel_lock(chan); | ||||
| 	datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL); | ||||
| 	ast_channel_unlock(chan); | ||||
| 	if (datastore == NULL) { | ||||
| 		return NULL; | ||||
| 	} | ||||
| @@ -299,6 +301,35 @@ static struct ast_speech *find_speech(struct ast_channel *chan) | ||||
| 	return speech; | ||||
| } | ||||
|  | ||||
| /*! | ||||
|  * \internal | ||||
|  * \brief Destroy the speech datastore on the given channel. | ||||
|  * | ||||
|  * \param chan Channel to destroy speech datastore. | ||||
|  * | ||||
|  * \retval 0 on success. | ||||
|  * \retval -1 not found. | ||||
|  */ | ||||
| static int speech_datastore_destroy(struct ast_channel *chan) | ||||
| { | ||||
| 	struct ast_datastore *datastore; | ||||
| 	int res; | ||||
|  | ||||
| 	ast_channel_lock(chan); | ||||
| 	datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL); | ||||
| 	if (datastore) { | ||||
| 		ast_channel_datastore_remove(chan, datastore); | ||||
| 	} | ||||
| 	ast_channel_unlock(chan); | ||||
| 	if (datastore) { | ||||
| 		ast_datastore_free(datastore); | ||||
| 		res = 0; | ||||
| 	} else { | ||||
| 		res = -1; | ||||
| 	} | ||||
| 	return res; | ||||
| } | ||||
|  | ||||
| /* Helper function to find a specific speech recognition result by number and nbest alternative */ | ||||
| static struct ast_speech_result *find_result(struct ast_speech_result *results, char *result_num) | ||||
| { | ||||
| @@ -532,7 +563,9 @@ static int speech_create(struct ast_channel *chan, const char *data) | ||||
| 	} | ||||
| 	pbx_builtin_setvar_helper(chan, "ERROR", NULL); | ||||
| 	datastore->data = speech; | ||||
| 	ast_channel_lock(chan); | ||||
| 	ast_channel_datastore_add(chan, datastore); | ||||
| 	ast_channel_unlock(chan); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
| @@ -675,7 +708,6 @@ static int speech_background(struct ast_channel *chan, const char *data) | ||||
| 	RAII_VAR(struct ast_format *, oldreadformat, NULL, ao2_cleanup); | ||||
| 	char dtmf[AST_MAX_EXTENSION] = ""; | ||||
| 	struct timeval start = { 0, 0 }, current; | ||||
| 	struct ast_datastore *datastore = NULL; | ||||
| 	char *parse, *filename_tmp = NULL, *filename = NULL, tmp[2] = "", dtmf_terminator = '#'; | ||||
| 	const char *tmp2 = NULL; | ||||
| 	struct ast_flags options = { 0 }; | ||||
| @@ -904,11 +936,7 @@ static int speech_background(struct ast_channel *chan, const char *data) | ||||
|  | ||||
| 	/* See if it was because they hung up */ | ||||
| 	if (done == 3) { | ||||
| 		/* Destroy speech structure */ | ||||
| 		ast_speech_destroy(speech); | ||||
| 		datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL); | ||||
| 		if (datastore != NULL) | ||||
| 			ast_channel_datastore_remove(chan, datastore); | ||||
| 		speech_datastore_destroy(chan); | ||||
| 	} else { | ||||
| 		/* Channel is okay so restore read format */ | ||||
| 		ast_set_read_format(chan, oldreadformat); | ||||
| @@ -921,22 +949,10 @@ static int speech_background(struct ast_channel *chan, const char *data) | ||||
| /*! \brief SpeechDestroy() Dialplan Application */ | ||||
| static int speech_destroy(struct ast_channel *chan, const char *data) | ||||
| { | ||||
| 	int res = 0; | ||||
| 	struct ast_speech *speech = find_speech(chan); | ||||
| 	struct ast_datastore *datastore = NULL; | ||||
|  | ||||
| 	if (speech == NULL) | ||||
| 	if (!chan) { | ||||
| 		return -1; | ||||
|  | ||||
| 	/* Destroy speech structure */ | ||||
| 	ast_speech_destroy(speech); | ||||
|  | ||||
| 	datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL); | ||||
| 	if (datastore != NULL) { | ||||
| 		ast_channel_datastore_remove(chan, datastore); | ||||
| 	} | ||||
|  | ||||
| 	return res; | ||||
| 	return speech_datastore_destroy(chan); | ||||
| } | ||||
|  | ||||
| static int unload_module(void) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user