diff --git a/src/box/func.c b/src/box/func.c
index 119e58fa5de5dd1f804547006a00b2aa119d549e..8993dcddfb40d8599bc56c79e036067e2413d50c 100644
--- a/src/box/func.c
+++ b/src/box/func.c
@@ -209,12 +209,12 @@ module_cache_find(const char *name, const char *name_end)
  * Save module to the module cache.
  */
 static inline int
-module_cache_put(const char *name, const char *name_end, struct module *module)
+module_cache_put(struct module *module)
 {
-	size_t name_len = name_end - name;
-	uint32_t name_hash = mh_strn_hash(name, name_len);
+	size_t package_len = strlen(module->package);
+	uint32_t name_hash = mh_strn_hash(module->package, package_len);
 	const struct mh_strnptr_node_t strnode = {
-		name, name_len, name_hash, module};
+		module->package, package_len, name_hash, module};
 
 	if (mh_strnptr_put(modules, &strnode, NULL, NULL) == mh_end(modules)) {
 		diag_set(OutOfMemory, sizeof(strnode), "malloc", "modules");
@@ -248,12 +248,16 @@ module_load(const char *package, const char *package_end)
 	if (module_find(package, package_end, path, sizeof(path)) != 0)
 		return NULL;
 
-	struct module *module = (struct module *) malloc(sizeof(*module));
+	int package_len = package_end - package;
+	struct module *module = (struct module *)
+		malloc(sizeof(*module) + package_len + 1);
 	if (module == NULL) {
-		diag_set(OutOfMemory, sizeof(struct module), "malloc",
-			 "struct module");
+		diag_set(OutOfMemory, sizeof(struct module) + package_len + 1,
+			 "malloc", "struct module");
 		return NULL;
 	}
+	memcpy(module->package, package, package_len);
+	module->package[package_len] = 0;
 	rlist_create(&module->funcs);
 	module->calls = 0;
 	module->is_unloading = false;
@@ -264,7 +268,7 @@ module_load(const char *package, const char *package_end)
 	}
 	char load_name[PATH_MAX + 1];
 	snprintf(load_name, sizeof(load_name), "%s/%.*s." TARANTOOL_LIBEXT,
-		 dir_name, (int)(package_end - package), package);
+		 dir_name, package_len, package);
 	if (symlink(path, load_name) < 0) {
 		diag_set(SystemError, "failed to create dso link");
 		goto error;
@@ -275,7 +279,6 @@ module_load(const char *package, const char *package_end)
 	if (rmdir(dir_name) != 0)
 		say_warn("failed to delete temporary dir %s", dir_name);
 	if (module->handle == NULL) {
-		int package_len = (int) (package_end - package_end);
 		diag_set(ClientError, ER_LOAD_MODULE, package_len,
 			  package, dlerror());
 		goto error;
@@ -346,7 +349,7 @@ module_reload(const char *package, const char *package_end, struct module **modu
 		rlist_move(&new_module->funcs, &func->item);
 	}
 	module_cache_del(package, package_end);
-	if (module_cache_put(package, package_end, new_module) != 0)
+	if (module_cache_put(new_module) != 0)
 		goto restore;
 	old_module->is_unloading = true;
 	module_gc(old_module);
@@ -515,7 +518,7 @@ func_c_load(struct func_c *func)
 		module = module_load(name.package, name.package_end);
 		if (module == NULL)
 			return -1;
-		if (module_cache_put(name.package, name.package_end, module)) {
+		if (module_cache_put(module)) {
 			module_delete(module);
 			return -1;
 		}
diff --git a/src/box/func.h b/src/box/func.h
index 2236fd873d6db9727782b0c89fc176a7d0d76cb5..18b83faac34cb709203b01e714d17f0a19be0cf9 100644
--- a/src/box/func.h
+++ b/src/box/func.h
@@ -56,6 +56,8 @@ struct module {
 	size_t calls;
 	/** True if module is being unloaded. */
 	bool is_unloading;
+	/** Module's package name. */
+	char package[0];
 };
 
 /** Virtual method table for func object. */