From 18120a0ef00c5725ccd2984b1a41c41db9a9b6e4 Mon Sep 17 00:00:00 2001 From: John Humlick <15677335+jhumlick@users.noreply.github.com> Date: Fri, 7 Mar 2025 16:12:40 -0800 Subject: [PATCH] clamd: Fix bug reporting memory stats, used by clamdtop ClamD's STATS API reports process memory stats on systems that provide the `mallinfo()` system call. This feature is used by ClamDTOP to show process memory usage. When we switched to the CMake build system, we neglected to add the check for the `mallinfo()` system call and so broke ClamD memory usage reporting. This commit adds the CMake check for `mallinfo()` and sets HAVE_MALLINFO, if found. Fixes: https://github.com/Cisco-Talos/clamav/issues/706 Jira: CLAM-2742 --- CMakeLists.txt | 2 ++ cmake/CheckMallinfo.c | 8 ++++++++ cmake/CheckMallinfo.cmake | 26 ++++++++++++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 cmake/CheckMallinfo.c create mode 100644 cmake/CheckMallinfo.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 5aea5210e..f27d65ac0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -778,6 +778,8 @@ include(CheckFTS) include(CheckUnamePosix) # Check support for file descriptor passing include(CheckFDPassing) +# Check support for mallinfo memory stats +include(CheckMallinfo) # Check if big-endian include(TestBigEndian) diff --git a/cmake/CheckMallinfo.c b/cmake/CheckMallinfo.c new file mode 100644 index 000000000..af27d6d1c --- /dev/null +++ b/cmake/CheckMallinfo.c @@ -0,0 +1,8 @@ +#include + +int main() +{ + struct mallinfo mi; + mi = mallinfo(); + return 0; +} diff --git a/cmake/CheckMallinfo.cmake b/cmake/CheckMallinfo.cmake new file mode 100644 index 000000000..a7a3188bd --- /dev/null +++ b/cmake/CheckMallinfo.cmake @@ -0,0 +1,26 @@ +# +# Check for mallinfo(3) sys call. +# + +GET_FILENAME_COMPONENT(_selfdir_CheckMallinfo + "${CMAKE_CURRENT_LIST_FILE}" PATH) + +# Check that the POSIX compliant uname(2) call works properly (HAVE_UNAME_SYSCALL) +try_run( + # Name of variable to store the run result (process exit status; number) in: + test_run_result + # Name of variable to store the compile result (TRUE or FALSE) in: + test_compile_result + # Binary directory: + ${CMAKE_CURRENT_BINARY_DIR} + # Source file to be compiled: + ${_selfdir_CheckMallinfo}/CheckMallinfo.c + # Where to store the output produced during compilation: + COMPILE_OUTPUT_VARIABLE test_compile_output + # Where to store the output produced by running the compiled executable: + RUN_OUTPUT_VARIABLE test_run_output ) + +# Did compilation succeed and process return 0 (success)? +if("${test_compile_result}" AND ("${test_run_result}" EQUAL 0)) + set(HAVE_MALLINFO 1) +endif()