summaryrefslogtreecommitdiff
path: root/0188-sandbox-fix-memory-leak-in-fill-sandbox-metadate.patch
blob: c1ca215f06c25e824d4082fbbfa0012f1e6ecd86 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
From 012553d4c53bd8d1c73d22c18fd24bf441041d54 Mon Sep 17 00:00:00 2001
From: zhongtao <zhongtao17@huawei.com>
Date: Sat, 8 Feb 2025 11:34:59 +0800
Subject: [PATCH 188/198] [sandbox] fix memory leak in fill sandbox metadate

Signed-off-by: zhongtao <zhongtao17@huawei.com>
---
 src/daemon/sandbox/sandbox.cc | 26 +++++++++++++++++++++-----
 1 file changed, 21 insertions(+), 5 deletions(-)

diff --git a/src/daemon/sandbox/sandbox.cc b/src/daemon/sandbox/sandbox.cc
index 12693445..e2f42237 100644
--- a/src/daemon/sandbox/sandbox.cc
+++ b/src/daemon/sandbox/sandbox.cc
@@ -890,20 +890,24 @@ auto Sandbox::GenerateSandboxMetadataJson(sandbox_metadata *metadata) -> std::st
 
 auto Sandbox::SaveMetadata(Errors &error) -> bool
 {
-    sandbox_metadata_runtime_info info = { 0 };
-    sandbox_metadata metadata = { 0 };
     int nret = -1;
     const std::string path = GetMetadataJsonPath();
     std::string metadataJson;
 
-    metadata.runtime_info = &info;
+    sandbox_metadata *metadata = static_cast<sandbox_metadata *>(util_common_calloc_s(sizeof(sandbox_metadata)));
+    if (metadata == nullptr) {
+        error.SetError("Out of memory");
+        return false;
+    }
+
+    auto metadataWarpper = std::unique_ptr<CStructWrapper<sandbox_metadata>>(new CStructWrapper<sandbox_metadata>(metadata, free_sandbox_metadata));
 
-    FillSandboxMetadata(&metadata, error);
+    FillSandboxMetadata(metadata, error);
     if (!error.Empty()) {
         return false;
     }
 
-    metadataJson = GenerateSandboxMetadataJson(&metadata);
+    metadataJson = GenerateSandboxMetadataJson(metadata);
     if (metadataJson.length() == 0) {
         error.Errorf("Failed to get sandbox metadata json for sandbox: '%s'", m_id.c_str());
         return false;
@@ -1102,11 +1106,23 @@ auto Sandbox::GetNetworkSettingsPath() -> std::string
 void Sandbox::FillSandboxMetadata(sandbox_metadata* metadata, Errors &error)
 {
     std::string jsonStr;
+    sandbox_metadata_runtime_info *info = nullptr;
+
     metadata->id = util_strdup_s(m_id.c_str());
     metadata->name = util_strdup_s(m_name.c_str());
+
+    info = static_cast<sandbox_metadata_runtime_info *>(util_common_calloc_s(sizeof(sandbox_metadata_runtime_info)));
+    if (info == NULL) {
+        error.SetError("Out of memory");
+        ERROR("Out of memory");
+        return;
+    }
+
+    metadata->runtime_info = info;
     metadata->runtime_info->runtime = util_strdup_s(m_runtimeInfo.runtime.c_str());
     metadata->runtime_info->sandboxer = util_strdup_s(m_runtimeInfo.sandboxer.c_str());
     metadata->runtime_info->runtime_handler = util_strdup_s(m_runtimeInfo.runtimeHandler.c_str());
+
     metadata->net_mode = util_strdup_s(m_netMode.c_str());
     metadata->network_ready = m_networkReady;
     metadata->task_address = util_strdup_s(m_taskAddress.c_str());
-- 
2.34.1