Skip to content

Commit d48d345

Browse files
AhmedBMMariusNi
authored andcommitted
Added fuzzing for Telemetry (#1220)
* Added fuzzing for Telemetry (ProcessJsonFile) * added additional exception handlers
1 parent af4864c commit d48d345

File tree

10 files changed

+215
-112
lines changed

10 files changed

+215
-112
lines changed

.github/workflows/fuzzing-run.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ jobs:
7474
with:
7575
container: ${{ steps.container.outputs.id }}
7676
working-directory: ${{ env.MOUNT }}/tests/fuzzer
77-
cmd: set -o pipefail && ./osconfig-fuzzer -artifact_prefix=${{ env.MOUNT }}/output/artifacts/ -max_total_time=${{ inputs.timeout-seconds }} /tmp/corpus 2>&1 >/dev/null | tee ${{ env.MOUNT }}/output/osconfig-fuzzer.log
77+
cmd: set -o pipefail && LSAN_OPTIONS=suppressions=${{ env.MOUNT }}/src/tests/fuzzer/lsan.suppressions ./osconfig-fuzzer -artifact_prefix=${{ env.MOUNT }}/output/artifacts/ -max_total_time=${{ inputs.timeout-seconds }} /tmp/corpus 2>&1 >/dev/null | tee ${{ env.MOUNT }}/output/osconfig-fuzzer.log
7878

7979
- uses: actions/upload-artifact@v4
8080
if: success() || failure()

src/CMakeLists.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,10 @@ if (BUILD_FUZZER)
157157
message(STATUS "Fuzzer: Enabled")
158158
message(STATUS "Modified CXX flags: ${CMAKE_CXX_FLAGS}")
159159
message(STATUS "Modified C flags: ${CMAKE_C_FLAGS}")
160-
add_subdirectory(tests)
161160
else()
162161
message(STATUS "Fuzzer: Disabled")
163162
endif()
163+
164164
add_subdirectory(common)
165165
if (BUILD_ADAPTERS)
166166
add_subdirectory(adapters)
@@ -174,7 +174,7 @@ endif()
174174

175175
if (BUILD_TELEMETRY)
176176
ExternalProject_Get_Property(telemetry-external BINARY_DIR)
177-
set(TELEMETRY_TESTS_DIR ${BINARY_DIR}/lib/tests)
177+
set(TELEMETRY_TESTS_DIR ${TELEMETRY_LIB_DIR}/tests)
178178
set(TELEMETRY_BIN_TESTS_DIR ${BINARY_DIR}/bin/tests)
179179
configure_file(
180180
${CMAKE_SOURCE_DIR}/cmake/ExternalTests.cmake.in
@@ -186,6 +186,8 @@ if (BUILD_TELEMETRY)
186186
${CMAKE_BINARY_DIR}/ExternalTests.cmake)
187187
endif()
188188

189+
add_subdirectory(tests)
190+
189191
message(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
190192
message(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
191193

src/adapters/mc/CMakeLists.txt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@ if (BUILD_TELEMETRY)
1313
message(FATAL_ERROR "g++-5 not found in PATH, but required for 1DS SDK with GCC < 5.5")
1414
endif()
1515
set(CMAKE_ARGS -DCMAKE_C_COMPILER=gcc-5 -DCMAKE_CXX_COMPILER=g++-5)
16+
elseif(BUILD_FUZZER)
17+
set(CMAKE_ARGS
18+
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
19+
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
20+
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
21+
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
22+
)
1623
endif()
1724
ExternalProject_Add(
1825
telemetry-external
@@ -32,6 +39,38 @@ if (BUILD_TELEMETRY)
3239
-DONEDS_CPP_SDK_VERSION=${ONEDS_CPP_SDK_VERSION}
3340
)
3441
ExternalProject_Get_Property(telemetry-external BINARY_DIR)
42+
43+
set(TELEMETRY_LIB_DIR ${BINARY_DIR}/lib CACHE PATH "Telemetry library directory" FORCE)
44+
set(MAT_SDK_LIB ${BINARY_DIR}/1ds_install/lib)
45+
set(MAT_SDK_INCLUDE ${BINARY_DIR}/1ds_install/include/mat)
46+
47+
set(VCPKG_PACKAGES_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}")
48+
find_package(CURL REQUIRED NO_DEFAULT_PATH PATHS ${VCPKG_PACKAGES_DIR})
49+
find_package(OpenSSL REQUIRED NO_DEFAULT_PATH PATHS ${VCPKG_PACKAGES_DIR})
50+
find_package(Threads REQUIRED)
51+
find_package(unofficial-sqlite3 REQUIRED NO_DEFAULT_PATH PATHS ${VCPKG_PACKAGES_DIR})
52+
find_package(nlohmann_json REQUIRED NO_DEFAULT_PATH PATHS ${VCPKG_PACKAGES_DIR})
53+
54+
add_library(telemetry-interface INTERFACE)
55+
add_dependencies(telemetry-interface telemetry-external)
56+
target_link_libraries(telemetry-interface
57+
INTERFACE
58+
${BINARY_DIR}/lib/libtelemetrylib.a
59+
${MAT_SDK_LIB}/libmat.a
60+
unofficial::sqlite3::sqlite3
61+
nlohmann_json::nlohmann_json
62+
CURL::libcurl
63+
OpenSSL::SSL
64+
dl
65+
${CMAKE_THREAD_LIBS_INIT}
66+
)
67+
target_include_directories(telemetry-interface
68+
INTERFACE
69+
${BINARY_DIR}
70+
${CMAKE_SOURCE_DIR}/common/telemetry/lib
71+
${MAT_SDK_INCLUDE}
72+
${TELEMETRY_LIB_DIR}
73+
)
3574
endif()
3675

3776
add_compile_options("-Wall;-Wextra;-Wunused;-Werror;-Wformat;-Wformat-security;-Wno-unused-result")

src/common/telemetry/lib/CMakeLists.txt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,12 @@ find_package(Threads REQUIRED) # Threads can still use system
6161
find_package(unofficial-sqlite3 REQUIRED NO_DEFAULT_PATH PATHS ${VCPKG_PACKAGES_DIR})
6262
find_package(nlohmann_json REQUIRED NO_DEFAULT_PATH PATHS ${VCPKG_PACKAGES_DIR})
6363

64-
include_directories(../../telemetry)
65-
add_subdirectory(../../parson ${CMAKE_CURRENT_BINARY_DIR}/parson)
66-
add_subdirectory(../../logging ${CMAKE_CURRENT_BINARY_DIR}/logging)
67-
add_subdirectory(../../commonutils ${CMAKE_CURRENT_BINARY_DIR}/commonutils)
64+
if(BUILD_EXTERNAL)
65+
include_directories(../../telemetry)
66+
add_subdirectory(../../parson ${CMAKE_CURRENT_BINARY_DIR}/parson)
67+
add_subdirectory(../../logging ${CMAKE_CURRENT_BINARY_DIR}/logging)
68+
add_subdirectory(../../commonutils ${CMAKE_CURRENT_BINARY_DIR}/commonutils)
69+
endif()
6870

6971
# Add telemetry ingestion key (if defined)
7072
if(DEFINED ENV{OsConfigTelemetryApiKey} AND NOT "$ENV{OsConfigTelemetryApiKey}" STREQUAL "")
@@ -81,8 +83,10 @@ add_library(telemetrylib STATIC
8183
)
8284
add_dependencies(telemetrylib 1dscpplib)
8385

84-
# commonutils is used which uses telemetry, create an alias to avoid name conflict
85-
add_library(telemetry ALIAS telemetrylib)
86+
if(BUILD_EXTERNAL)
87+
# commonutils is used which uses telemetry, create an alias to avoid name conflict
88+
add_library(telemetry ALIAS telemetrylib)
89+
endif()
8690

8791
target_link_libraries(telemetrylib
8892
PUBLIC

src/common/telemetry/lib/Telemetry.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ TelemetryManager::TelemetryManager(bool enableDebug, std::chrono::seconds teardo
3535

3636
status_t status = STATUS_SUCCESS;
3737
m_logManager.reset(LogManagerProvider::CreateLogManager(m_logConfig, status));
38-
if (STATUS_SUCCESS != status)
38+
if ((STATUS_SUCCESS != status) || !m_logManager)
3939
{
4040
OsConfigLogError(m_log, "Telemetry initialization failed. status=%d", status);
4141
throw std::runtime_error("Telemetry initialization failed");
@@ -166,9 +166,19 @@ bool TelemetryManager::ProcessJsonLine(const std::string& jsonLine)
166166
{
167167
jsonObject = nlohmann::json::parse(jsonLine);
168168
}
169-
catch(const nlohmann::json::parse_error& e)
169+
catch(const nlohmann::json::exception& e)
170+
{
171+
OsConfigLogError(m_log, "JSON exception: %s", e.what());
172+
return false;
173+
}
174+
catch(const std::exception& e)
175+
{
176+
OsConfigLogError(m_log, "Exception during JSON parsing: %s", e.what());
177+
return false;
178+
}
179+
catch(...)
170180
{
171-
// Ignore invalid JSON lines
181+
OsConfigLogError(m_log, "Unknown exception during JSON parsing");
172182
return false;
173183
}
174184

src/tests/fuzzer/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ target_link_libraries(osconfig-fuzzer PRIVATE
1919
securitybaselinelib
2020
complianceenginelib
2121
parsonlib
22+
$<$<BOOL:${BUILD_TELEMETRY}>:telemetry-interface>
2223
)
2324

2425
target_compile_definitions(osconfig-fuzzer PRIVATE

src/tests/fuzzer/lsan.suppressions

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# LeakSanitizer suppressions for fuzzer
2+
# Suppress leaks from external dependencies that are not part of our codebase
3+
4+
# SQLite3 internal allocations
5+
leak:sqlite3MemMalloc
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ProcessJsonFile.{"EventName":"TestEvent","Parameter1":"value1"}
Binary file not shown.

0 commit comments

Comments
 (0)