From 66a4bafd43e4c8c418a7d699a0de0c608931b9c7 Mon Sep 17 00:00:00 2001 From: Mark Pulford Date: Thu, 5 May 2011 00:45:43 +0930 Subject: Fix strbuf_t leak on lua_close() - Add __gc metatable method to clean up json_config_t userdata. --- lua_cjson.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/lua_cjson.c b/lua_cjson.c index c7d65af..c4c5a96 100644 --- a/lua_cjson.c +++ b/lua_cjson.c @@ -235,6 +235,18 @@ static int json_strict_numbers(lua_State *l) return 1; } +static int json_destroy_config(lua_State *l) +{ + json_config_t *cfg; + + cfg = lua_touserdata(l, 1); + if (cfg) + strbuf_free(&cfg->encode_buf); + cfg = NULL; + + return 0; +} + static void json_create_config(lua_State *l) { json_config_t *cfg; @@ -242,6 +254,14 @@ static void json_create_config(lua_State *l) cfg = lua_newuserdata(l, sizeof(*cfg)); + /* Create GC method to clean up strbuf */ + lua_newtable(l); + lua_pushcfunction(l, json_destroy_config); + lua_setfield(l, -2, "__gc"); + lua_setmetatable(l, -2); + + strbuf_init(&cfg->encode_buf, 0); + cfg->sparse_ratio = DEFAULT_SPARSE_RATIO; cfg->max_depth = DEFAULT_MAX_DEPTH; cfg->strict_numbers = 1; @@ -291,9 +311,6 @@ static void json_create_config(lua_State *l) cfg->escape2char['r'] = '\r'; cfg->escape2char['u'] = 'u'; /* Unicode parsing required */ - /* Encoding init */ - - strbuf_init(&cfg->encode_buf, 0); #if 0 /* Initialise separate storage for pre-generated escape codes. -- cgit v1.2.3-55-g6feb