iSulad/0074-fix-memory-leak-of-top_layer.patch
zhangxiaoyu 68738aa0f1 upgrade from upstream
Signed-off-by: zhangxiaoyu <zhangxiaoyu58@huawei.com>
2023-06-01 12:04:54 +08:00

144 lines
5.5 KiB
Diff

From d027738842ba071802e87a18857c79603cb12db8 Mon Sep 17 00:00:00 2001
From: "Neil.wrz" <wangrunze13@huawei.com>
Date: Wed, 24 May 2023 18:35:33 -0700
Subject: [PATCH 74/79] fix memory leak of top_layer
Signed-off-by: Neil.wrz <wangrunze13@huawei.com>
---
.../oci/storage/image_store/image_store.c | 3 +-
.../remote_layer_support/image_remote_impl.c | 50 +++++++++++++------
.../overlay_remote_impl.c | 4 +-
.../ro_symlink_maintain.c | 1 +
4 files changed, 39 insertions(+), 19 deletions(-)
diff --git a/src/daemon/modules/image/oci/storage/image_store/image_store.c b/src/daemon/modules/image/oci/storage/image_store/image_store.c
index f6ddd03b..d89c28f4 100644
--- a/src/daemon/modules/image/oci/storage/image_store/image_store.c
+++ b/src/daemon/modules/image/oci/storage/image_store/image_store.c
@@ -3684,7 +3684,8 @@ int remote_append_image_by_directory_with_lock(const char *id)
nret = snprintf(image_path, sizeof(image_path), "%s/%s", g_image_store->dir, id);
if (nret < 0 || (size_t)nret >= sizeof(image_path)) {
ERROR("Failed to get image path");
- return -1;
+ ret = -1;
+ goto out;
}
ret = append_image_by_directory(image_path);
diff --git a/src/daemon/modules/image/oci/storage/remote_layer_support/image_remote_impl.c b/src/daemon/modules/image/oci/storage/remote_layer_support/image_remote_impl.c
index 92bf901d..b4a53ec1 100644
--- a/src/daemon/modules/image/oci/storage/remote_layer_support/image_remote_impl.c
+++ b/src/daemon/modules/image/oci/storage/remote_layer_support/image_remote_impl.c
@@ -126,11 +126,43 @@ out:
return ret;
}
+static int check_top_layer_and_add_image(const char *id)
+{
+ char *top_layer = NULL;
+ int ret = 0;
+
+ top_layer = remote_image_get_top_layer_from_json(id);
+ if (top_layer == NULL) {
+ WARN("Can't get top layer id for image: %s, image not add", id);
+ return 0;
+ }
+
+ if (!remote_layer_layer_valid(top_layer)) {
+ WARN("Current not find valid under layer, remote image:%s not add", id);
+ if (!map_remove(image_byid_new, (void *)id)) {
+ WARN("image %s will not be loaded from remote.", id);
+ }
+ goto out;
+ }
+
+ if (remote_append_image_by_directory_with_lock(id) != 0) {
+ ERROR("Failed to load image into memrory: %s", id);
+ if (!map_remove(image_byid_new, (void *)id)) {
+ WARN("image %s will not be loaded from remote", id);
+ }
+ ret = -1;
+ }
+
+out:
+ free(top_layer);
+
+ return ret;
+}
+
static int remote_image_add(void *data)
{
char **array_added = NULL;
char **array_deleted = NULL;
- char *top_layer = NULL;
map_t *tmp_map = NULL;
bool exist = true;
size_t i = 0;
@@ -144,20 +176,7 @@ static int remote_image_add(void *data)
array_deleted = remote_deleted_layers(image_byid_old, image_byid_new);
for (i = 0; i < util_array_len((const char **)array_added); i++) {
- top_layer = remote_image_get_top_layer_from_json(array_added[i]);
- if (top_layer != NULL && !remote_layer_layer_valid(top_layer)) {
- WARN("Current not find valid under layer, remoet image:%s not added", array_added[i]);
- if (!map_remove(image_byid_new, (void *)array_added[i])) {
- WARN("image %s will not be loaded from remote.", array_added[i]);
- }
- continue;
- }
-
- if (remote_append_image_by_directory_with_lock(array_added[i]) != 0) {
- ERROR("Failed to load image into memrory: %s", array_added[i]);
- if (!map_remove(image_byid_new, (void *)array_added[i])) {
- WARN("image %s will not be loaded from remote", array_added[i]);
- }
+ if (check_top_layer_and_add_image(array_added[i]) != 0) {
ret = -1;
}
}
@@ -179,7 +198,6 @@ static int remote_image_add(void *data)
util_free_array(array_added);
util_free_array(array_deleted);
- free(top_layer);
return ret;
}
diff --git a/src/daemon/modules/image/oci/storage/remote_layer_support/overlay_remote_impl.c b/src/daemon/modules/image/oci/storage/remote_layer_support/overlay_remote_impl.c
index 30caf175..238506c2 100644
--- a/src/daemon/modules/image/oci/storage/remote_layer_support/overlay_remote_impl.c
+++ b/src/daemon/modules/image/oci/storage/remote_layer_support/overlay_remote_impl.c
@@ -292,7 +292,7 @@ free_out:
return ret;
}
-static int remote_image_add(struct remote_overlay_data *data)
+static int remote_overlay_add(struct remote_overlay_data *data)
{
int ret = 0;
char **array_added = NULL;
@@ -346,7 +346,7 @@ void remote_overlay_refresh(struct remote_overlay_data *data)
return;
}
- if (remote_image_add(data) != 0) {
+ if (remote_overlay_add(data) != 0) {
ERROR("refresh overlay failed");
}
}
diff --git a/src/daemon/modules/image/oci/storage/remote_layer_support/ro_symlink_maintain.c b/src/daemon/modules/image/oci/storage/remote_layer_support/ro_symlink_maintain.c
index 2bcc43e6..4d234aab 100644
--- a/src/daemon/modules/image/oci/storage/remote_layer_support/ro_symlink_maintain.c
+++ b/src/daemon/modules/image/oci/storage/remote_layer_support/ro_symlink_maintain.c
@@ -135,6 +135,7 @@ static int do_build_ro_dir(const char *home, const char *id)
nret = asprintf(&ro_layer_dir, "%s/%s/%s", home, REMOTE_RO_LAYER_DIR, id);
if (nret < 0 || nret > PATH_MAX) {
+ ret = -1;
SYSERROR("Failed to create ro layer dir path");
goto out;
}
--
2.25.1