]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon: fixed leaks and bad ffi module cleanup
authorMarek Vavruša <marek.vavrusa@nic.cz>
Mon, 15 Jun 2015 16:21:57 +0000 (18:21 +0200)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Mon, 15 Jun 2015 16:21:57 +0000 (18:21 +0200)
daemon/engine.c
daemon/ffimodule.c
modules/hints/hints.c

index c8dfb40d36f0e184072cd33d531e30f7360f0234..dd36156a7ac559f972a7c994d90f47a175203f35 100644 (file)
@@ -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) {
index 040d5ee87bd2282d5de6813517a5016f29dddb09..cd9d0aade4393b52adb729f73732bf5f61b026e3 100644 (file)
@@ -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;
index 80f81fb2e80e92fa5511244483d40e835e814a86..d4dc43b9a25717a3d12fca6b0428c09d83933add 100644 (file)
@@ -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;