diff --git a/CMakeLists.txt b/CMakeLists.txt index 5cc311605606f77b7762146d2ad56a89568d4877..244ad139b7506ace0ea981b39a09260932546aae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,10 +109,19 @@ cmake_dependent_option(OPUS_STACK_PROTECTOR OFF) add_feature_info(OPUS_STACK_PROTECTOR OPUS_STACK_PROTECTOR ${OPUS_STACK_PROTECTOR_HELP_STR}) -if(NOT MSVC AND NOT MINGW) - set(OPUS_FORTIFY_SOURCE_HELP_STR "add protection against buffer overflows.") - option(OPUS_FORTIFY_SOURCE ${OPUS_FORTIFY_SOURCE_HELP_STR} ON) - add_feature_info(OPUS_FORTIFY_SOURCE OPUS_FORTIFY_SOURCE ${OPUS_FORTIFY_SOURCE_HELP_STR}) +if(NOT MSVC) + set(OPUS_FORTIFY_SOURCE_HELP_STR "add protection against buffer overflows.") + cmake_dependent_option(OPUS_FORTIFY_SOURCE + ${OPUS_FORTIFY_SOURCE_HELP_STR} + ON + "FORTIFY_SOURCE_SUPPORTED" + OFF) + add_feature_info(OPUS_FORTIFY_SOURCE OPUS_FORTIFY_SOURCE ${OPUS_FORTIFY_SOURCE_HELP_STR}) +endif() + +if(MINGW AND (OPUS_FORTIFY_SOURCE OR OPUS_STACK_PROTECTOR)) + # ssp lib is needed for security features for MINGW + list(APPEND OPUS_REQUIRED_LIBRARIES ssp) endif() if(OPUS_CPU_X86 OR OPUS_CPU_X64) @@ -247,8 +256,9 @@ target_include_directories( target_link_libraries(opus PRIVATE ${OPUS_REQUIRED_LIBRARIES}) target_compile_definitions(opus PRIVATE OPUS_BUILD ENABLE_HARDENING) -if(OPUS_FORTIFY_SOURCE) - target_compile_definitions(opus PRIVATE _FORTIFY_SOURCE=2) +if(OPUS_FORTIFY_SOURCE AND NOT MSVC) + target_compile_definitions(opus PRIVATE + $<$>:_FORTIFY_SOURCE=2>) endif() if(OPUS_FLOAT_APPROX) diff --git a/cmake/OpusConfig.cmake b/cmake/OpusConfig.cmake index 43a66b73a66575cb5ddd479cb3ab7dac562c87eb..8d19a5357c4fe36d705e05b82b899cfb2deb2e8a 100644 --- a/cmake/OpusConfig.cmake +++ b/cmake/OpusConfig.cmake @@ -77,6 +77,18 @@ else() check_flag(FAST_MATH -ffast-math) check_flag(STACK_PROTECTOR -fstack-protector-strong) check_flag(HIDDEN_VISIBILITY -fvisibility=hidden) + set(FORTIFY_SOURCE_SUPPORTED 1) +endif() + +if(MINGW) + # For MINGW we need to link ssp lib for security features such as + # stack protector and fortify_sources + check_library_exists(ssp __stack_chk_fail "" HAVE_LIBSSP) + if(NOT HAVE_LIBSSP) + message(WARNING "Could not find libssp in MinGW, disabling STACK_PROTECTOR and FORTIFY_SOURCE") + set(STACK_PROTECTOR_SUPPORTED 0) + set(FORTIFY_SOURCE_SUPPORTED 0) + endif() endif() if(NOT MSVC)