From db9449aaae8fab8608200a38210d17fa2ab039d3 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Sun, 15 Dec 2024 14:59:49 +0100 Subject: [PATCH 1/3] [cmake] add cmake option for WITH_NO_UNDEFINED --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index f0a34451f..340553aaf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -313,6 +313,7 @@ if(CMAKE_COMPILER_IS_CLANG OR CMAKE_COMPILER_IS_GNUCC) file(REMOVE ${PROJECT_BINARY_DIR}/foo.txt) set(CMAKE_REQUIRED_LINK_OPTIONS ${CMAKE_REQUIRED_LINK_OPTIONS_SAVED}) + option(WITH_NO_UNDEFINED "compile with -Wl,--no-undefined" OFF) if(WITH_NO_UNDEFINED) check_c_compiler_flag(-Wl,--no-undefined no-undefined) From e0554a8540082673e1d6cfc6a4bac1822a017895 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Sun, 15 Dec 2024 14:57:36 +0100 Subject: [PATCH 2/3] [ci,freebsd] update configuration * fix linking issues * enable all available options to cover as much code as possible --- .github/workflows/freebsd.yml | 4 +++- ci/cmake-preloads/config-freebsd.txt | 21 +++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 85488e200..49187a285 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -21,9 +21,11 @@ jobs: libcjson fdk-aac libsoxr sdl2 sdl3 sdl2_ttf sdl2_image opus \ png webp openjpeg libjpeg-turbo opensc v4l_compat libv4l uriparser \ pkcs11-helper ffmpeg pulseaudio pcsc-lite cups opencl libressl openssl33 \ - gsm influxpkg-config icu fusefs-libs3 + gsm influxpkg-config icu fusefs-libs3 ccache opencl-clang-llvm15 faac faad2 \ + opus-tools openh264 alsa-lib cairo ocl-icd run: | + export LD_LIBRARY_PATH=/usr/lib/clang/18/lib/freebsd \ cmake -GNinja \ -C ci/cmake-preloads/config-freebsd.txt \ -B ci-build \ diff --git a/ci/cmake-preloads/config-freebsd.txt b/ci/cmake-preloads/config-freebsd.txt index 04df32aa0..c02a66f92 100644 --- a/ci/cmake-preloads/config-freebsd.txt +++ b/ci/cmake-preloads/config-freebsd.txt @@ -3,17 +3,26 @@ set(CMAKE_VERBOSE_MAKEFILE ON CACHE BOOL "preload") set(BUILD_TESTING_INTERNAL ON CACHE BOOL "preload") set(WITH_MANPAGES ON CACHE BOOL "preload") set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "preload") +set(WITH_CAIRO ON CACHE BOOL "preload") +set(WITH_ALSA ON CACHE BOOL "preload") set(WITH_PULSE ON CACHE BOOL "preload") set(WITH_CHANNELS ON CACHE BOOL "preload") set(WITH_CUPS ON CACHE BOOL "preload") set(WITH_LIBRESSL OFF CACHE BOOL "preload") set(WITH_GSM OFF CACHE BOOL "preload") set(WITH_CLIENT_SDL3 OFF CACHE BOOL "preload") +set(WITH_SDL_IMAGE_DIALOGS ON CACHE BOOL "preload") set(WITH_WAYLAND ON CACHE BOOL "preload") set(WITH_KRB5 ON CACHE BOOL "preload") set(WITH_PCSC ON CACHE BOOL "preload") set(WITH_JPEG ON CACHE BOOL "preload") set(WITH_GSM ON CACHE BOOL "preload") +set(CHANNEL_SSHAGENT ON CACHE BOOL "preload") +set(CHANNEL_RDPECAM ON CACHE BOOL "preload") +set(CHANNEL_RDPECAM_CLIENT ON CACHE BOOL "preload") +set(WINPR_UTILS_IMAGE_JPEG ON CACHE BOOL "preload") +set(WINPR_UTILS_IMAGE_PNG ON CACHE BOOL "preload") +set(WINPR_UTILS_IMAGE_WEBP ON CACHE BOOL "preload") set(CHANNEL_URBDRC ON CACHE BOOL "preload") set(CHANNEL_URBDRC_CLIENT ON CACHE BOOL "preload") set(WITH_SERVER ON CACHE BOOL "preload") @@ -48,8 +57,16 @@ set(WITH_DEBUG_X11 OFF CACHE BOOL "preload") set(WITH_DEBUG_X11_LOCAL_MOVESIZE OFF CACHE BOOL "preload") set(WITH_DEBUG_XV OFF CACHE BOOL "preload") set(WITH_SAMPLE ON CACHE BOOL "preload") -set(WITH_NO_UNDEFINED ON CACHE BOOL "preload") -set(WITH_SANITIZE_ADDRESS OFF CACHE BOOL "preload") +set(WITH_FAAC ON CACHE BOOL "preload") +set(WITH_FAAD ON CACHE BOOL "preload") +set(WITH_LAME ON CACHE BOOL "preload") +set(WITH_OPENCL ON CACHE BOOL "preload") +set(WITH_OPUS ON CACHE BOOL "preload") +set(WITH_SOXR ON CACHE BOOL "preload") +set(WITH_OPENH264 ON CACHE BOOL "preload") +set(WITH_FDK_AAC ON CACHE BOOL "preload") +set(WITH_NO_UNDEFINED OFF CACHE BOOL "preload") +set(WITH_SANITIZE_ADDRESS ON CACHE BOOL "preload") set(WITH_FFMPEG ON CACHE BOOL "preload") set(WITH_SWSCALE ON CACHE BOOL "preload") set(WITH_DSP_FFMPEG ON CACHE BOOL "preload") From 9d367aaecb5f202e1132bdcc7a7fce7d15076883 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Sun, 15 Dec 2024 15:56:47 +0100 Subject: [PATCH 3/3] [winpr,library] fix GetModuleFileNameA Properly implement the function for FreeBSD --- winpr/libwinpr/library/library.c | 111 +++++++++++++++++++------------ 1 file changed, 69 insertions(+), 42 deletions(-) diff --git a/winpr/libwinpr/library/library.c b/winpr/libwinpr/library/library.c index 8d21eb919..9ccbb7211 100644 --- a/winpr/libwinpr/library/library.c +++ b/winpr/libwinpr/library/library.c @@ -299,65 +299,92 @@ static DWORD module_from_proc(const char* proc, LPSTR lpFilename, DWORD nSize) DWORD GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize) { + if (hModule) + { + WLog_ERR(TAG, "is not implemented"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return 0; + } + #if defined(__linux__) - if (!hModule) - return module_from_proc("/proc/self/exe", lpFilename, nSize); + return module_from_proc("/proc/self/exe", lpFilename, nSize); #elif defined(__FreeBSD__) int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; size_t cb = nSize; - const int rc = sysctl(mib, ARRAYSIZE(mib), lpFilename, &cb, NULL, 0); - if ((rc != 0) || (cb > nSize)) + { + const int rc = sysctl(mib, ARRAYSIZE(mib), NULL, &cb, NULL, 0); + if (rc != 0) + { + SetLastError(ERROR_INTERNAL_ERROR); + return 0; + } + } + + char* fullname = calloc(cb + 1, sizeof(char)); + if (!fullname) { SetLastError(ERROR_INTERNAL_ERROR); return 0; } - return (DWORD)cb; -#elif defined(__NetBSD__) - if (!hModule) - return module_from_proc("/proc/curproc/exe", lpFilename, nSize); -#elif defined(__DragonFly__) - if (!hModule) - return module_from_proc("/proc/curproc/file", lpFilename, nSize); -#elif defined(__MACOSX__) - int status; - size_t length; - - if (!hModule) { - char path[4096]; - char buffer[4096]; - uint32_t size = sizeof(path); - status = _NSGetExecutablePath(path, &size); - - if (status != 0) + size_t cb2 = cb; + const int rc = sysctl(mib, ARRAYSIZE(mib), fullname, &cb2, NULL, 0); + if ((rc != 0) || (cb2 != cb)) { - /* path too small */ SetLastError(ERROR_INTERNAL_ERROR); + free(fullname); return 0; } - - /* - * _NSGetExecutablePath may not return the canonical path, - * so use realpath to find the absolute, canonical path. - */ - realpath(path, buffer); - length = strnlen(buffer, sizeof(buffer)); - - if (length < nSize) - { - CopyMemory(lpFilename, buffer, length); - lpFilename[length] = '\0'; - return (DWORD)length; - } - - CopyMemory(lpFilename, buffer, nSize - 1); - lpFilename[nSize - 1] = '\0'; - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return nSize; } + if (nSize > 0) + { + strncpy(lpFilename, fullname, nSize - 1); + lpFilename[nSize - 1] = '\0'; + } + free(fullname); + + if (nSize < cb) + SetLastError(ERROR_INSUFFICIENT_BUFFER); + + return (DWORD)MIN(nSize, cb); +#elif defined(__NetBSD__) + return module_from_proc("/proc/curproc/exe", lpFilename, nSize); +#elif defined(__DragonFly__) + return module_from_proc("/proc/curproc/file", lpFilename, nSize); +#elif defined(__MACOSX__) + char path[4096] = { 0 }; + char buffer[4096] = { 0 }; + uint32_t size = sizeof(path); + const int status = _NSGetExecutablePath(path, &size); + + if (status != 0) + { + /* path too small */ + SetLastError(ERROR_INTERNAL_ERROR); + return 0; + } + + /* + * _NSGetExecutablePath may not return the canonical path, + * so use realpath to find the absolute, canonical path. + */ + realpath(path, buffer); + const size_t length = strnlen(buffer, sizeof(buffer)); + + if (length < nSize) + { + CopyMemory(lpFilename, buffer, length); + lpFilename[length] = '\0'; + return (DWORD)length; + } + + CopyMemory(lpFilename, buffer, nSize - 1); + lpFilename[nSize - 1] = '\0'; + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return nSize; #endif WLog_ERR(TAG, "is not implemented"); SetLastError(ERROR_CALL_NOT_IMPLEMENTED);