From 4435edb15eba8b3a79f09317cc3f22db7748face Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Vavru=C5=A1a?= <marek.vavrusa@nic.cz>
Date: Mon, 15 Jun 2015 18:21:57 +0200
Subject: [PATCH] daemon: fixed leaks and bad ffi module cleanup

---
 daemon/engine.c       |  2 ++
 daemon/ffimodule.c    | 15 ++++++++-------
 modules/hints/hints.c |  1 +
 3 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/daemon/engine.c b/daemon/engine.c
index c8dfb40d3..dd36156a7 100644
--- a/daemon/engine.c
+++ b/daemon/engine.c
@@ -298,7 +298,9 @@ void engine_deinit(struct engine *engine)
 	kr_zonecut_deinit(&engine->resolver.root_hints);
 	kr_cache_close(&engine->resolver.cache);
 	lru_deinit(engine->resolver.cache_rtt);
+	free(engine->resolver.cache_rtt);
 	lru_deinit(engine->resolver.cache_rep);
+	free(engine->resolver.cache_rep);
 
 	/* Unload modules. */
 	for (size_t i = 0; i < engine->modules.len; ++i) {
diff --git a/daemon/ffimodule.c b/daemon/ffimodule.c
index 040d5ee87..cd9d0aade 100644
--- a/daemon/ffimodule.c
+++ b/daemon/ffimodule.c
@@ -99,14 +99,15 @@ static int l_ffi_init(struct kr_module *module)
 
 static int l_ffi_deinit(struct kr_module *module)
 {
-	lua_State *L = l_ffi_preface(module, "deinit");
-	if (!L) {
-		return 0;
+	/* Deinit the module in Lua (if possible) */
+	int ret = 0;
+	lua_State *L = module->lib;
+	if (l_ffi_preface(module, "deinit")) {
+		ret = l_ffi_call(L, 1);
 	}
-	int ret = l_ffi_call(L, 1);
 	/* Free the layer API wrapper */
 	lua_rawgeti(L, LUA_REGISTRYINDEX, (intptr_t)module->data);
-	lua_getfield(L, -1, "_layercdata");
+	lua_getfield(L, -1, "_layer_capi");
 	free(lua_touserdata(L, -1));
 	lua_pop(L, 2);
 	/* Unref module and unset 'lib', so the module
@@ -242,8 +243,8 @@ int ffimodule_register_lua(struct engine *engine, struct kr_module *module, cons
 	/* Create FFI module with trampolined functions. */
 	memset(module, 0, sizeof(*module));
 	module->name = strdup(name);
-	REGISTER_FFI_CALL(L, module->init,   "init",   &l_ffi_init);
-	REGISTER_FFI_CALL(L, module->deinit, "deinit", &l_ffi_deinit);
+	module->init = &l_ffi_init;
+	module->deinit = &l_ffi_deinit;
 	REGISTER_FFI_CALL(L, module->layer,  "layer",  &l_ffi_layer);
 	module->data = (void *)(intptr_t)luaL_ref(L, LUA_REGISTRYINDEX);
 	module->lib = L;
diff --git a/modules/hints/hints.c b/modules/hints/hints.c
index 80f81fb2e..d4dc43b9a 100644
--- a/modules/hints/hints.c
+++ b/modules/hints/hints.c
@@ -303,6 +303,7 @@ static char* hint_root(void *env, struct kr_module *module, const char *args)
 			default: continue;
 			}
 		}
+		json_delete(root_node);
 	}
 	/* Return current root hints */
 	char *result = NULL;
-- 
GitLab