diff --git a/src/box/func.c b/src/box/func.c
index 363e4ffb94b5cb3e89242dc85b447d5af9bc1d9c..119e58fa5de5dd1f804547006a00b2aa119d549e 100644
--- a/src/box/func.c
+++ b/src/box/func.c
@@ -492,6 +492,7 @@ func_c_destroy(struct func *base)
 	assert(base != NULL && base->def->language == FUNC_LANGUAGE_C);
 	struct func_c *func = (struct func_c *) base;
 	func_c_unload(func);
+	TRASH(base);
 	free(func);
 }
 
@@ -577,8 +578,8 @@ void
 func_delete(struct func *func)
 {
 	struct func_def *def = func->def;
-	func->vtab->destroy(func);
 	credentials_destroy(&func->owner_credentials);
+	func->vtab->destroy(func);
 	free(def);
 }
 
diff --git a/src/box/lua/call.c b/src/box/lua/call.c
index 92fdcb02dee17b28547f012c4618c76980ab12e8..b21be7fdaa45095ecb0cc4f40526e075b48ee61b 100644
--- a/src/box/lua/call.c
+++ b/src/box/lua/call.c
@@ -731,6 +731,7 @@ func_lua_destroy(struct func *func)
 {
 	assert(func != NULL && func->def->language == FUNC_LANGUAGE_LUA);
 	assert(func->vtab == &func_lua_vtab);
+	TRASH(func);
 	free(func);
 }