Skip to content

Commit 4bff9cc

Browse files
authored
Fix web server response corruption (#1614)
Fix web server response corruption by managing dynamic memory for return data
1 parent 1423771 commit 4bff9cc

1 file changed

Lines changed: 17 additions & 15 deletions

File tree

src/webconfig.cpp

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ struct DataAndStatusCode
234234
// **** WEB SERVER Overrides and Special Functionality ****
235235
int set_file_data(fs_file* file, const DataAndStatusCode& dataAndStatusCode)
236236
{
237-
static string returnData;
237+
std::string* returnData = new std::string();
238238

239239
const char* statusCodeStr = "";
240240
switch (dataAndStatusCode.statusCode)
@@ -244,25 +244,27 @@ int set_file_data(fs_file* file, const DataAndStatusCode& dataAndStatusCode)
244244
case HttpStatusCode::_500: statusCodeStr = "500 Internal Server Error"; break;
245245
}
246246

247-
returnData.clear();
248-
returnData.append("HTTP/1.0 ");
249-
returnData.append(statusCodeStr);
250-
returnData.append("\r\n");
251-
returnData.append(
247+
returnData->clear();
248+
returnData->append("HTTP/1.0 ");
249+
returnData->append(statusCodeStr);
250+
returnData->append("\r\n");
251+
returnData->append(
252252
"Server: GP2040-CE " GP2040VERSION "\r\n"
253253
"Content-Type: application/json\r\n"
254254
"Access-Control-Allow-Origin: *\r\n"
255255
"Content-Length: "
256256
);
257-
returnData.append(std::to_string(dataAndStatusCode.data.length()));
258-
returnData.append("\r\n\r\n");
259-
returnData.append(dataAndStatusCode.data);
260257

261-
file->data = returnData.c_str();
262-
file->len = returnData.size();
258+
returnData->append(std::to_string(dataAndStatusCode.data.length()));
259+
returnData->append("\r\n\r\n");
260+
returnData->append(dataAndStatusCode.data);
261+
262+
file->data = returnData->c_str();
263+
file->len = returnData->size();
263264
file->index = file->len;
264-
file->http_header_included = file->http_header_included;
265-
file->pextension = NULL;
265+
file->http_header_included = true;
266+
file->pextension = returnData; // store for cleanup
267+
file->is_custom_file = 1;
266268

267269
return 1;
268270
}
@@ -2779,7 +2781,7 @@ void fs_close_custom(struct fs_file *file)
27792781
{
27802782
if (file && file->is_custom_file && file->pextension)
27812783
{
2782-
mem_free(file->pextension);
2784+
delete static_cast<std::string*>(file->pextension);
27832785
file->pextension = NULL;
27842786
}
2785-
}
2787+
}

0 commit comments

Comments
 (0)