Fixed:memory leaks bug about open source code.
This commit is contained in:
parent
64ad852f91
commit
359eec1914
5
external/httpserver.h-master/src/io_events.c
vendored
5
external/httpserver.h-master/src/io_events.c
vendored
|
@ -82,6 +82,11 @@ void _hs_accept_and_begin_request_cycle(http_server_t *server,
|
||||||
} else {
|
} else {
|
||||||
hs_request_begin_read(request);
|
hs_request_begin_read(request);
|
||||||
}
|
}
|
||||||
|
// ================ added by xiao ================ //
|
||||||
|
if (request) {
|
||||||
|
hs_request_terminate_connection(request);
|
||||||
|
}
|
||||||
|
// ================ added by xiao end ================ //
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
4
external/httpserver.h-master/src/server.c
vendored
4
external/httpserver.h-master/src/server.c
vendored
|
@ -102,11 +102,11 @@ void _hs_add_server_sock_events(http_server_t *serv) {
|
||||||
ev.data.ptr = serv;
|
ev.data.ptr = serv;
|
||||||
epoll_ctl(serv->loop, EPOLL_CTL_ADD, serv->socket, &ev);
|
epoll_ctl(serv->loop, EPOLL_CTL_ADD, serv->socket, &ev);
|
||||||
}
|
}
|
||||||
|
int gHttpServerRuning = 1;
|
||||||
int hs_server_run_event_loop(http_server_t *serv, const char *ipaddr) {
|
int hs_server_run_event_loop(http_server_t *serv, const char *ipaddr) {
|
||||||
hs_server_listen_on_addr(serv, ipaddr);
|
hs_server_listen_on_addr(serv, ipaddr);
|
||||||
struct epoll_event ev_list[1];
|
struct epoll_event ev_list[1];
|
||||||
while (1) {
|
while (gHttpServerRuning) {
|
||||||
int nev = epoll_wait(serv->loop, ev_list, 1, -1);
|
int nev = epoll_wait(serv->loop, ev_list, 1, -1);
|
||||||
for (int i = 0; i < nev; i++) {
|
for (int i = 0; i < nev; i++) {
|
||||||
ev_cb_t *ev_cb = (ev_cb_t *)ev_list[i].data.ptr;
|
ev_cb_t *ev_cb = (ev_cb_t *)ev_list[i].data.ptr;
|
||||||
|
|
|
@ -8,7 +8,7 @@ include_directories(
|
||||||
./include
|
./include
|
||||||
${UTILS_SOURCE_PATH}/StatusCode/include
|
${UTILS_SOURCE_PATH}/StatusCode/include
|
||||||
${UTILS_SOURCE_PATH}/Log/include
|
${UTILS_SOURCE_PATH}/Log/include
|
||||||
${UTILS_SOURCE_PATH}/LedControl/include
|
${UTILS_SOURCE_PATH}/FxHttpServer/include
|
||||||
${HAL_SOURCE_PATH}/include
|
${HAL_SOURCE_PATH}/include
|
||||||
)
|
)
|
||||||
#do not rely on any other library
|
#do not rely on any other library
|
||||||
|
|
|
@ -13,7 +13,47 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
#include "AppManager.h"
|
#include "AppManager.h"
|
||||||
|
#include "FxHttpServer.h"
|
||||||
#include "ILog.h"
|
#include "ILog.h"
|
||||||
#include <vector>
|
AppManager::AppManager()
|
||||||
const StatusCode AppManager::Init(void) { return CreateStatusCode(STATUS_CODE_OK); }
|
{
|
||||||
const StatusCode AppManager::UnInit(void) { return CreateStatusCode(STATUS_CODE_OK); }
|
//
|
||||||
|
// mHttpServerRuning = false;
|
||||||
|
}
|
||||||
|
const StatusCode AppManager::Init(void)
|
||||||
|
{
|
||||||
|
HttpServerStart();
|
||||||
|
return CreateStatusCode(STATUS_CODE_OK);
|
||||||
|
}
|
||||||
|
const StatusCode AppManager::UnInit(void)
|
||||||
|
{
|
||||||
|
HttpServerStop();
|
||||||
|
return CreateStatusCode(STATUS_CODE_OK);
|
||||||
|
}
|
||||||
|
void AppManager::HttpServerStart(void)
|
||||||
|
{
|
||||||
|
auto httpServerThread = [](std::shared_ptr<AppManager> app) {
|
||||||
|
LogInfo("AppManager httpServer started.\n");
|
||||||
|
app->HttpServerThread();
|
||||||
|
};
|
||||||
|
mHttpSever = std::thread(httpServerThread, shared_from_this());
|
||||||
|
}
|
||||||
|
void AppManager::HttpServerStop(void)
|
||||||
|
{
|
||||||
|
FxHttpServerExit();
|
||||||
|
if (mHttpSever.joinable()) {
|
||||||
|
mHttpSever.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void AppManager::HttpServerThread(void)
|
||||||
|
{
|
||||||
|
// typedef void (*HttpHandleCallback)(const char *, const unsigned int, ResponseHandle, void *);
|
||||||
|
std::shared_ptr<AppManager> app = shared_from_this();
|
||||||
|
auto httpHandle =
|
||||||
|
[](const char *url, const unsigned int urlLength, ResponseHandle responseHandle, void *context) -> void {
|
||||||
|
//
|
||||||
|
LogInfo("=============================== url = %s\n", url);
|
||||||
|
};
|
||||||
|
FxHttpServerInit(httpHandle);
|
||||||
|
FxHttpServerUnInit();
|
||||||
|
}
|
||||||
|
|
|
@ -15,17 +15,23 @@
|
||||||
#ifndef APP_MANAGER_H
|
#ifndef APP_MANAGER_H
|
||||||
#define APP_MANAGER_H
|
#define APP_MANAGER_H
|
||||||
#include "IAppManager.h"
|
#include "IAppManager.h"
|
||||||
class AppManager : public IAppManager
|
#include <thread>
|
||||||
|
class AppManager : public IAppManager, public std::enable_shared_from_this<AppManager>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
AppManager() = default;
|
AppManager();
|
||||||
virtual ~AppManager() = default;
|
virtual ~AppManager() = default;
|
||||||
|
|
||||||
const StatusCode Init(void) override;
|
const StatusCode Init(void) override;
|
||||||
const StatusCode UnInit(void) override;
|
const StatusCode UnInit(void) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// std::vector<std::shared_ptr<LedManager>> mLedManagers;
|
void HttpServerStart(void);
|
||||||
|
void HttpServerStop(void);
|
||||||
|
void HttpServerThread(void);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// bool mHttpServerRuning;
|
||||||
|
std::thread mHttpSever;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
87
test/middleware/AppManager/CMakeLists.txt
Normal file
87
test/middleware/AppManager/CMakeLists.txt
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
# include(${CMAKE_SOURCE_DIR}/build/independent_source.cmake)
|
||||||
|
include(${CMAKE_SOURCE_DIR_IPCSDK}/build/global_config.cmake)
|
||||||
|
set(EXECUTABLE_OUTPUT_PATH ${TEST_OUTPUT_PATH}/bin)
|
||||||
|
|
||||||
|
include_directories(
|
||||||
|
./src
|
||||||
|
./include
|
||||||
|
./tool/include
|
||||||
|
${UTILS_SOURCE_PATH}/Log/include
|
||||||
|
${UTILS_SOURCE_PATH}/StatusCode/include
|
||||||
|
# ${UTILS_SOURCE_PATH}/UartDevice/include
|
||||||
|
# ${UTILS_SOURCE_PATH}/McuProtocol/include
|
||||||
|
${UTILS_SOURCE_PATH}/KeyControl/include
|
||||||
|
${UTILS_SOURCE_PATH}/LedControl/include
|
||||||
|
${HAL_SOURCE_PATH}/include
|
||||||
|
# ${HAL_SOURCE_PATH}/src
|
||||||
|
${MIDDLEWARE_SOURCE_PATH}/AppManager/include
|
||||||
|
${MIDDLEWARE_SOURCE_PATH}/AppManager/src
|
||||||
|
# ${MIDDLEWARE_SOURCE_PATH}/McuAskBase/include
|
||||||
|
# ${TEST_SOURCE_PATH}/utils/LinuxApiMock/include
|
||||||
|
${TEST_SOURCE_PATH}/hal/tool/include
|
||||||
|
# ${TEST_SOURCE_PATH}/utils/UartDevice/tool/include
|
||||||
|
# ${TEST_SOURCE_PATH}/utils/McuProtocol/tool/include
|
||||||
|
# ${TEST_SOURCE_PATH}/middleware/McuAskBase/tool/include
|
||||||
|
${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googletest/include
|
||||||
|
${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googlemock/include
|
||||||
|
)
|
||||||
|
|
||||||
|
link_directories(
|
||||||
|
${LIBS_OUTPUT_PATH}
|
||||||
|
${EXTERNAL_LIBS_OUTPUT_PATH}
|
||||||
|
)
|
||||||
|
|
||||||
|
aux_source_directory(. SRC_FILES_MAIN)
|
||||||
|
aux_source_directory(./src SRC_FILES)
|
||||||
|
if(${TARGET_PLATFORM} MATCHES ${DEFINE_LINUX})
|
||||||
|
aux_source_directory(./src_mock SRC_FILES)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(TARGET_NAME AppManagerTest)
|
||||||
|
add_executable(${TARGET_NAME} ${SRC_FILES_MAIN} ${SRC_FILES})
|
||||||
|
target_link_libraries(${TARGET_NAME} AppManager gtest gmock pthread)
|
||||||
|
if(${TEST_COVERAGE} MATCHES "true")
|
||||||
|
target_link_libraries(${TARGET_NAME} gcov)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if ("${CLANG_TIDY_SUPPORT}" MATCHES "true")
|
||||||
|
add_custom_target(
|
||||||
|
AppManagerTest_code_check
|
||||||
|
COMMAND ${CLANG_TIDY_EXE}
|
||||||
|
-checks='${CLANG_TIDY_CHECKS}'
|
||||||
|
--header-filter=.*
|
||||||
|
--system-headers=false
|
||||||
|
${SRC_FILES}
|
||||||
|
${CLANG_TIDY_CONFIG}
|
||||||
|
# --line-filter='[{\"name\":\"${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googletest/include/getest/gtest.h\"}]'
|
||||||
|
--line-filter='[{\"name\":\"${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googletest/include/getest/*.h\"}]'
|
||||||
|
-p ${PLATFORM_PATH}/cmake-shell
|
||||||
|
WORKING_DIRECTORY ${TEST_SOURCE_PATH}/middleware/AppManager
|
||||||
|
)
|
||||||
|
add_custom_command(
|
||||||
|
TARGET ${TARGET_NAME}
|
||||||
|
PRE_BUILD
|
||||||
|
COMMAND make AppManagerTest_code_check
|
||||||
|
WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/
|
||||||
|
)
|
||||||
|
|
||||||
|
file(GLOB_RECURSE HEADER_FILES *.h)
|
||||||
|
add_custom_target(
|
||||||
|
AppManagerTest_code_format
|
||||||
|
COMMAND ${CLANG_FORMAT_EXE}
|
||||||
|
-style=file
|
||||||
|
-i ${SRC_FILES} ${SRC_FILES_MAIN} ${HEADER_FILES}
|
||||||
|
WORKING_DIRECTORY ${TEST_SOURCE_PATH}/middleware/AppManager
|
||||||
|
)
|
||||||
|
add_custom_command(
|
||||||
|
TARGET ${TARGET_NAME}
|
||||||
|
PRE_BUILD
|
||||||
|
COMMAND make AppManagerTest_code_check
|
||||||
|
COMMAND make AppManagerTest_code_format
|
||||||
|
WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
define_file_name(${TARGET_NAME})
|
||||||
|
|
||||||
|
# add_subdirectory(tool)
|
23
test/middleware/AppManager/mainTest.cpp
Normal file
23
test/middleware/AppManager/mainTest.cpp
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 Fancy Code.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
#include <gmock/gmock.h>
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <thread>
|
||||||
|
#include <unistd.h>
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
testing::InitGoogleTest(&argc, argv);
|
||||||
|
return RUN_ALL_TESTS();
|
||||||
|
}
|
56
test/middleware/AppManager/src/AppManager_Test.cpp
Normal file
56
test/middleware/AppManager/src/AppManager_Test.cpp
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 Fancy Code.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
#include "IAppManager.h"
|
||||||
|
#include "ILog.h"
|
||||||
|
#include <gmock/gmock.h>
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <thread>
|
||||||
|
namespace AppManagerTest
|
||||||
|
{
|
||||||
|
class AppManagerTest : public testing::Test
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AppManagerTest() {}
|
||||||
|
virtual ~AppManagerTest() {}
|
||||||
|
static void SetUpTestCase()
|
||||||
|
{
|
||||||
|
CreateLogModule();
|
||||||
|
ILogInit(LOG_INSTANCE_TYPE_END);
|
||||||
|
}
|
||||||
|
static void TearDownTestCase() { ILogUnInit(); }
|
||||||
|
virtual void SetUp()
|
||||||
|
{
|
||||||
|
// CreateAllKeysMcok();
|
||||||
|
// HalTestTool::Init();
|
||||||
|
// AppManagerTestTool::Init();
|
||||||
|
// CreateHalCppModule();
|
||||||
|
CreateAppManagerModule();
|
||||||
|
}
|
||||||
|
virtual void TearDown()
|
||||||
|
{
|
||||||
|
// HalTestTool::UnInit();
|
||||||
|
// AppManagerTestTool::UnInit();
|
||||||
|
DestroyAppManagerModule();
|
||||||
|
// DestroyAllKeysMock();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
// ../output_files/test/bin/AppManagerTest --gtest_filter=AppManagerTest.INTEGRATION_AppManager_EXAMPLE_Demo
|
||||||
|
TEST_F(AppManagerTest, INTEGRATION_AppManager_EXAMPLE_Demo)
|
||||||
|
{
|
||||||
|
IAppManager::GetInstance()->Init();
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(10000));
|
||||||
|
IAppManager::GetInstance()->UnInit();
|
||||||
|
}
|
||||||
|
} // namespace AppManagerTest
|
|
@ -3,4 +3,5 @@
|
||||||
add_subdirectory(IpcConfig)
|
add_subdirectory(IpcConfig)
|
||||||
add_subdirectory(McuManager)
|
add_subdirectory(McuManager)
|
||||||
add_subdirectory(McuAskBase)
|
add_subdirectory(McuAskBase)
|
||||||
add_subdirectory(DeviceManager)
|
add_subdirectory(DeviceManager)
|
||||||
|
add_subdirectory(AppManager)
|
|
@ -31,8 +31,6 @@ link_directories(
|
||||||
${EXTERNAL_LIBS_OUTPUT_PATH}
|
${EXTERNAL_LIBS_OUTPUT_PATH}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
aux_source_directory(. SRC_FILES_MAIN)
|
aux_source_directory(. SRC_FILES_MAIN)
|
||||||
aux_source_directory(./src SRC_FILES)
|
aux_source_directory(./src SRC_FILES)
|
||||||
if(${TARGET_PLATFORM} MATCHES ${DEFINE_LINUX})
|
if(${TARGET_PLATFORM} MATCHES ${DEFINE_LINUX})
|
||||||
|
|
|
@ -36,8 +36,8 @@ void HttpHandle(const char *url, const unsigned int urlLength, ResponseHandle re
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ../output_files/test/bin/FxHttpServerTest --gtest_filter=FxHttpServerTest.Demo
|
// ../output_files/test/bin/FxHttpServerTest --gtest_filter=FxHttpServerTest.INTEGRATION_AppManager_EXAMPLE_Demo
|
||||||
TEST(FxHttpServerTest, Demo)
|
TEST(FxHttpServerTest, INTEGRATION_AppManager_EXAMPLE_Demo)
|
||||||
{
|
{
|
||||||
CreateLogModule();
|
CreateLogModule();
|
||||||
ILogInit(LOG_INSTANCE_TYPE_END);
|
ILogInit(LOG_INSTANCE_TYPE_END);
|
||||||
|
|
|
@ -21,4 +21,42 @@ add_custom_command(
|
||||||
```
|
```
|
||||||
PUBLIC $<$<CONFIG:DEBUG>:-fsanitize=address -fsanitize=undefined -fno-sanitize-recover=all>
|
PUBLIC $<$<CONFIG:DEBUG>:-fsanitize=address -fsanitize=undefined -fno-sanitize-recover=all>
|
||||||
```
|
```
|
||||||
4.
|
4. 由于开源代码不支持安全退出,所以修改了开源代码;
|
||||||
|
```
|
||||||
|
int gHttpServerRuning = 1; // 增加一个运行标识
|
||||||
|
int hs_server_run_event_loop(http_server_t *serv, const char *ipaddr) {
|
||||||
|
hs_server_listen_on_addr(serv, ipaddr);
|
||||||
|
struct epoll_event ev_list[1];
|
||||||
|
while (gHttpServerRuning) { // 运行标识赋值为0时,httpserver退出
|
||||||
|
int nev = epoll_wait(serv->loop, ev_list, 1, -1);
|
||||||
|
for (int i = 0; i < nev; i++) {
|
||||||
|
ev_cb_t *ev_cb = (ev_cb_t *)ev_list[i].data.ptr;
|
||||||
|
ev_cb->handler(&ev_list[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
5. 修复一个内存安全漏洞;
|
||||||
|
```
|
||||||
|
void _hs_accept_and_begin_request_cycle(http_server_t *server,
|
||||||
|
hs_io_cb_t on_client_connection_cb,
|
||||||
|
hs_io_cb_t on_timer_event_cb) {
|
||||||
|
http_request_t *request = NULL;
|
||||||
|
while ((request = hs_server_accept_connection(server, on_client_connection_cb,
|
||||||
|
on_timer_event_cb))) {
|
||||||
|
if (server->memused > HTTP_MAX_TOTAL_EST_MEM_USAGE) {
|
||||||
|
hs_request_respond_error(request, 503, "Service Unavailable",
|
||||||
|
hs_request_begin_write);
|
||||||
|
} else {
|
||||||
|
hs_request_begin_read(request);
|
||||||
|
}
|
||||||
|
// ================ added by xiao ================ //
|
||||||
|
if (request) {
|
||||||
|
hs_request_terminate_connection(request); // 此处应该释放内存
|
||||||
|
}
|
||||||
|
// ================ added by xiao end ================ //
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
6.
|
|
@ -21,6 +21,7 @@ extern "C" {
|
||||||
typedef void (*ResponseHandle)(const char *, void *);
|
typedef void (*ResponseHandle)(const char *, void *);
|
||||||
typedef void (*HttpHandleCallback)(const char *, const unsigned int, ResponseHandle, void *);
|
typedef void (*HttpHandleCallback)(const char *, const unsigned int, ResponseHandle, void *);
|
||||||
StatusCode FxHttpServerInit(HttpHandleCallback httpHandle);
|
StatusCode FxHttpServerInit(HttpHandleCallback httpHandle);
|
||||||
|
StatusCode FxHttpServerExit(void);
|
||||||
StatusCode FxHttpServerUnInit(void);
|
StatusCode FxHttpServerUnInit(void);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include "ILog.h"
|
#include "ILog.h"
|
||||||
#include "httpserver.h"
|
#include "httpserver.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
extern int gHttpServerRuning;
|
||||||
static struct http_server_s *server = NULL;
|
static struct http_server_s *server = NULL;
|
||||||
static struct http_server_s *poll_server = NULL;
|
static struct http_server_s *poll_server = NULL;
|
||||||
static HttpHandleCallback gHttpHandle = NULL;
|
static HttpHandleCallback gHttpHandle = NULL;
|
||||||
|
@ -49,6 +50,11 @@ StatusCode FxHttpServerInit(HttpHandleCallback httpHandle)
|
||||||
http_server_listen(server);
|
http_server_listen(server);
|
||||||
return CreateStatusCode(STATUS_CODE_OK);
|
return CreateStatusCode(STATUS_CODE_OK);
|
||||||
}
|
}
|
||||||
|
StatusCode FxHttpServerExit(void)
|
||||||
|
{
|
||||||
|
gHttpServerRuning = 0;
|
||||||
|
return CreateStatusCode(STATUS_CODE_OK);
|
||||||
|
}
|
||||||
StatusCode FxHttpServerUnInit(void)
|
StatusCode FxHttpServerUnInit(void)
|
||||||
{
|
{
|
||||||
free(server);
|
free(server);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user