Explorar el Código

fix stack corruption in DB::get

Grant Limberg hace 2 días
padre
commit
71d68e9a60
Se han modificado 2 ficheros con 24 adiciones y 5 borrados
  1. 14 2
      CMakeLists.txt
  2. 10 3
      nonfree/controller/DB.cpp

+ 14 - 2
CMakeLists.txt

@@ -4,12 +4,14 @@ cmake_minimum_required (VERSION 3.13)
 project (zerotier-one LANGUAGES CXX C)
 
 option(ZT1_CENTRAL_CONTROLLER "Build with ZeroTier Central Controller support" OFF)
-
+oiption(ADDRESS_SANITIZER "Build with Address Sanitizer enabled (only for x86_64/arm64)" OFF
+)
 set (PROJ_DIR ${PROJECT_SOURCE_DIR})
 
 execute_process(COMMAND uname -m COMMAND tr -d '\n' OUTPUT_VARIABLE CPU_ARCHITECTURE)
 set(CPU_ARCHITECTURE ${CPU_ARCHITECTURE} CACHE STRING "Target CPU architecture (detected automatically)")
 message(STATUS "Detected CPU architecture: ${CPU_ARCHITECTURE}")
+
 if(CPU_ARCHITECTURE STREQUAL "x86_64")
     add_definitions(
         -DZT_ARCHITECTURE=2 
@@ -20,9 +22,19 @@ if(CPU_ARCHITECTURE STREQUAL "x86_64")
         -DZT_USE_FAST_X64_ED25519=1
     )
     set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -z noexecstack")
-elseif(CPU_ARCHITECTURE STREQUAL "aarch64")
+
+    if(ADDRESS_SANITIZER)
+        add_compile_options(-fsanitize=address)
+        add_link_options(-fsanitize=address)
+    endif()
+elseif(CPU_ARCHITECTURE STREQUAL "aarch64" OR CPU_ARCHITECTURE STREQUAL "arm64")
     add_definitions(-DZT_ARCHITECTURE=4 -DZT_ARCH_ARM_HAS_NEON=1 -DZT_SSO_SUPPORTED=1 -DZT_AES_NEON=1)
     add_compile_options(-march=armv8-a+crypto -mtune=generic -mstrict-align)
+    
+    if(ADDRESS_SANITIZER)
+        add_compile_options(-fsanitize=address)
+        add_link_options(-fsanitize=address)
+    endif()
 endif()
 
 include(FetchContent)

+ 10 - 3
nonfree/controller/DB.cpp

@@ -216,14 +216,21 @@ bool DB::get(const uint64_t networkId, nlohmann::json& network, const uint64_t m
 	return true;
 }
 
-bool DB::get(const uint64_t networkId, nlohmann::json& network, const uint64_t memberId, nlohmann::json& member, NetworkSummaryInfo& info)
+bool DB::get(
+	const uint64_t networkId,
+	nlohmann::json& network,
+	const uint64_t memberId,
+	nlohmann::json& member,
+	NetworkSummaryInfo& info)
 {
 	auto provider = opentelemetry::trace::Provider::GetTracerProvider();
 	auto tracer = provider->GetTracer("db");
 	auto span = tracer->StartSpan("db::getNetworkAndMemberAndSummary");
 	auto scope = tracer->WithActiveSpan(span);
-	char networkIdStr[17];
-	char memberIdStr[11];
+	char networkIdStr[32];
+	memset(networkIdStr, 0, sizeof(networkIdStr));
+	char memberIdStr[32];
+	memset(memberIdStr, 0, sizeof(memberIdStr));
 	span->SetAttribute("network_id", Utils::hex(networkId, networkIdStr));
 	span->SetAttribute("member_id", Utils::hex(memberId, memberIdStr));