Skip to content

Commit 280ed2e

Browse files
authored
Fix workload api memory leak (crustio#222)
1 parent f981100 commit 280ed2e

File tree

2 files changed

+29
-34
lines changed

2 files changed

+29
-34
lines changed

src/app/http/ApiHandler.h

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -192,20 +192,14 @@ void ApiHandler::http_handler(beast::string_view /*doc_root*/,
192192
json::JSON n_files_json;
193193
if (files_json.JSONType() == json::JSON::Class::Object)
194194
{
195-
char buf1[128];
196-
char buf2[128];
195+
char buf[128];
197196
for (auto it = files_json.ObjectRange().begin(); it != files_json.ObjectRange().end(); it++)
198197
{
199-
std::string item_str = it->second.ToString();
200-
remove_char(item_str, '\\');
201-
json::JSON item_json = json::JSON::Load(item_str);
202-
memset(buf1, 0, sizeof(buf1));
203-
memset(buf2, 0, sizeof(buf2));
204-
sprintf(buf1, " \"hash\" : \"%s\", \"size\" : %ld, ",
205-
item_json["old_hash"].ToString().c_str(), item_json["old_size"].ToInt());
206-
sprintf(buf2, " \"sealed_hash\" : \"%s\", \"sealed_size\" : %ld",
198+
json::JSON item_json = it->second;
199+
memset(buf, 0, sizeof(buf));
200+
sprintf(buf, " \"sealed_hash\" : \"%s\", \"sealed_size\" : %ld ",
207201
(it->first).c_str(), item_json["sealed_size"].ToInt());
208-
std::string tmp_str = std::string("{") + JSON_NL + std::string(buf1) + JSON_NL + std::string(buf2) + JSON_NL + "}";
202+
std::string tmp_str = std::string("{") + std::string(buf) + "}";
209203
std::string fstatus = item_json["status"].ToString();
210204
n_files_json[fstatus]["detail"].append(tmp_str);
211205
n_files_json[fstatus]["number"] = n_files_json[fstatus]["number"].ToInt() + 1;

src/enclave/workload/Workload.cpp

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -57,47 +57,46 @@ Workload::~Workload()
5757
*/
5858
std::string Workload::get_workload(void)
5959
{
60-
crust_status_t crust_status = CRUST_SUCCESS;
6160
sgx_sha256_hash_t srd_root;
6261
uint64_t srd_workload = 0;
63-
json::JSON wl_json;
6462
json::JSON md_json;
6563
memset(srd_root, 0, sizeof(sgx_sha256_hash_t));
64+
std::string wl_str;
6665

6766
// ----- workload info ----- //
6867
id_get_metadata(md_json);
69-
// Srd info
70-
this->get_srd_info(&srd_root, &srd_workload, md_json);
71-
wl_json[WL_SRD][WL_SRD_ROOT_HASH] = hexstring_safe(srd_root, HASH_LENGTH);
72-
wl_json[WL_SRD][WL_SRD_SPACE] = srd_workload / 1024 / 1024 / 1024;
73-
wl_json[WL_SRD][WL_SRD_REMAINING_TASK] = get_srd_change();
7468
// file info
69+
wl_str.append("{");
70+
wl_str.append("\"").append(WL_FILES).append("\":{");
7571
if (md_json.hasKey(ID_FILE) && md_json[ID_FILE].size() > 0)
7672
{
7773
for (int i = 0; i < md_json[ID_FILE].size(); i++)
7874
{
79-
json::JSON tmp_json;
80-
tmp_json[WL_FILE_SEALED_SIZE] = md_json[ID_FILE][i][FILE_SIZE];
81-
tmp_json[WL_FILE_STATUS] = md_json[ID_FILE][i][FILE_STATUS];
82-
// Get old hash
83-
uint8_t *p_meta = NULL;
84-
size_t meta_len = 0;
85-
crust_status = persist_get_unsafe((md_json[ID_FILE][i][FILE_HASH].ToString()+"_meta").c_str(), &p_meta, &meta_len);
86-
if (CRUST_SUCCESS == crust_status && p_meta != NULL)
75+
std::string tmp_str = "{";
76+
tmp_str.append("\"").append(WL_FILE_SEALED_SIZE).append("\":")
77+
.append(std::to_string(md_json[ID_FILE][i][FILE_SIZE].ToInt())).append(",");
78+
tmp_str.append("\"").append(WL_FILE_STATUS).append("\":")
79+
.append("\"").append(md_json[ID_FILE][i][FILE_STATUS].ToString()).append("\"}");
80+
wl_str.append("\"").append(md_json[ID_FILE][i][FILE_HASH].ToString()).append("\":").append(tmp_str);
81+
if (i != md_json[ID_FILE].size() - 1)
8782
{
88-
json::JSON org_file_json = json::JSON::Load(std::string(reinterpret_cast<char*>(p_meta), meta_len));
89-
free(p_meta);
90-
tmp_json[WL_FILE_OLD_HASH] = org_file_json[FILE_OLD_HASH].ToString();
91-
tmp_json[WL_FILE_OLD_SIZE] = org_file_json[FILE_OLD_SIZE].ToInt();
83+
wl_str.append(",");
9284
}
93-
std::string tmp_str = tmp_json.dump();
94-
remove_char(tmp_str, '\n');
95-
wl_json[WL_FILES][md_json[ID_FILE][i][FILE_HASH].ToString()] = tmp_str;
9685
}
9786
}
87+
wl_str.append("},");
88+
// Srd info
89+
this->get_srd_info(&srd_root, &srd_workload, md_json);
90+
wl_str.append("\"").append(WL_SRD).append("\":{");
91+
wl_str.append("\"").append(WL_SRD_ROOT_HASH).append("\":")
92+
.append("\"").append(hexstring_safe(srd_root, HASH_LENGTH)).append("\",");
93+
wl_str.append("\"").append(WL_SRD_SPACE).append("\":")
94+
.append("\"").append(std::to_string(srd_workload / 1024 / 1024 / 1024)).append("\",");
95+
wl_str.append("\"").append(WL_SRD_REMAINING_TASK).append("\":")
96+
.append("\"").append(std::to_string(get_srd_change())).append("\"}");
97+
wl_str.append("}");
9898

9999
// Store workload
100-
std::string wl_str = wl_json.dump();
101100
store_large_data(wl_str.c_str(), wl_str.size(), ocall_store_workload);
102101

103102
return wl_str;
@@ -161,6 +160,7 @@ crust_status_t Workload::get_srd_info(sgx_sha256_hash_t *srd_root_out, uint64_t
161160
return CRUST_MALLOC_FAILED;
162161
}
163162
memcpy(hashs + hashs_len, hash_u, HASH_LENGTH);
163+
free(hash_u);
164164
hashs_len += HASH_LENGTH;
165165
}
166166
}
@@ -290,6 +290,7 @@ crust_status_t Workload::restore_srd(json::JSON g_hashs)
290290
clean_data();
291291
return CRUST_UNEXPECTED_ERROR;
292292
}
293+
free(g_hash);
293294
this->srd_path2hashs_m[it->first].push_back(g_hash);
294295
}
295296
}

0 commit comments

Comments
 (0)