diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,7 @@ find_package (ECM 1.2.0 REQUIRED NO_MODULE) set (CMAKE_MODULE_PATH ${ECM_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" ) +include(CheckFunctionExists) include(KDEInstallDirs) find_package(PAM REQUIRED) @@ -58,6 +59,14 @@ add_definitions(-DHAVE_PAM_APPL) endif() +set(CMAKE_REQUIRED_INCLUDES "string.h") +check_function_exists(explicit_bzero HAVE_EXPLICIT_BZERO) +set(CMAKE_REQUIRED_INCLUDES) + +if (HAVE_EXPLICIT_BZERO) + add_definitions(-DHAVE_EXPLICIT_BZERO) +endif() + add_library (${library_name} SHARED ${pam_kwallet_SRCS}) set_target_properties (${library_name} PROPERTIES PREFIX "") target_link_libraries (${library_name} diff --git a/pam_kwallet.c b/pam_kwallet.c --- a/pam_kwallet.c +++ b/pam_kwallet.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -177,19 +178,22 @@ return; } - size_t len; + const size_t len = strlen (str); +#if HAVE_EXPLICIT_BZERO + explicit_bzero(str, len); +#else volatile char *vp; /* Defeats some optimizations */ - len = strlen (str); memset (str, 0xAA, len); memset (str, 0xBB, len); /* Defeats others */ vp = (volatile char*)str; while (*vp) { *(vp++) = 0xAA; } +#endif free (str); }