mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-29 07:24:55 +00:00 
			
		
		
		
	Add a datastore fixup to fix a pbx_lua crash.
(closes issue #19055) Reported by: jamhed Patches: lua_datastore_fixup1.diff uploaded by mnicholson (license 96) Tested by: mnicholson, jamhed git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@317476 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -85,6 +85,7 @@ static void lua_create_autoservice_functions(lua_State *L); | |||||||
| static void lua_create_hangup_function(lua_State *L); | static void lua_create_hangup_function(lua_State *L); | ||||||
|  |  | ||||||
| static void lua_state_destroy(void *data); | static void lua_state_destroy(void *data); | ||||||
|  | static void lua_datastore_fixup(void *data, struct ast_channel *old_chan, struct ast_channel *new_chan); | ||||||
| static lua_State *lua_get_state(struct ast_channel *chan); | static lua_State *lua_get_state(struct ast_channel *chan); | ||||||
|  |  | ||||||
| static int exists(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data); | static int exists(struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data); | ||||||
| @@ -102,6 +103,7 @@ static struct ast_hashtab *local_table = NULL; | |||||||
| static const struct ast_datastore_info lua_datastore = { | static const struct ast_datastore_info lua_datastore = { | ||||||
| 	.type = "lua", | 	.type = "lua", | ||||||
| 	.destroy = lua_state_destroy, | 	.destroy = lua_state_destroy, | ||||||
|  | 	.chan_fixup = lua_datastore_fixup, | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -114,6 +116,21 @@ static void lua_state_destroy(void *data) | |||||||
| 		lua_close(data); | 		lua_close(data); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /*! | ||||||
|  |  * \brief The fixup function for the lua_datastore. | ||||||
|  |  * \param data the datastore data, in this case it will be a lua_State | ||||||
|  |  * \param old_chan the channel we are moving from | ||||||
|  |  * \param new_chan the channel we are moving to | ||||||
|  |  * | ||||||
|  |  * This function updates our internal channel pointer. | ||||||
|  |  */ | ||||||
|  | static void lua_datastore_fixup(void *data, struct ast_channel *old_chan, struct ast_channel *new_chan) | ||||||
|  | { | ||||||
|  | 	lua_State *L = data; | ||||||
|  | 	lua_pushlightuserdata(L, new_chan); | ||||||
|  | 	lua_setfield(L, LUA_REGISTRYINDEX, "channel"); | ||||||
|  | } | ||||||
|  |  | ||||||
| /*! | /*! | ||||||
|  * \brief [lua_CFunction] Find an app and return it in a lua table (for access from lua, don't |  * \brief [lua_CFunction] Find an app and return it in a lua table (for access from lua, don't | ||||||
|  * call directly) |  * call directly) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user