131 lines
4.8 KiB
Diff
131 lines
4.8 KiB
Diff
|
|
From 10d3f420735925bcc747384198fdc07bb8faf0c2 Mon Sep 17 00:00:00 2001
|
||
|
|
From: "Neil.wrz" <wangrunze13@huawei.com>
|
||
|
|
Date: Wed, 24 May 2023 18:35:33 -0700
|
||
|
|
Subject: [PATCH 10/15] 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 +-
|
||
|
|
3 files changed, 38 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 473ba3c8..65b90832 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
|
||
|
|
@@ -3681,7 +3681,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");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
--
|
||
|
|
2.25.1
|
||
|
|
|