diff --git a/channels/rdpdr/server/CMakeLists.txt b/channels/rdpdr/server/CMakeLists.txt index 96112aef0..d82c29f1f 100644 --- a/channels/rdpdr/server/CMakeLists.txt +++ b/channels/rdpdr/server/CMakeLists.txt @@ -21,4 +21,5 @@ set(${MODULE_PREFIX}_SRCS rdpdr_main.c rdpdr_main.h) set(${MODULE_PREFIX}_LIBS freerdp) +option(WITH_WCHAR_FILE_DIRECTORY_INFORMATION "Build with WCHAR FILE_DIRECTORY_INFORMATION::FileName" OFF) add_channel_server_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} FALSE "VirtualChannelEntry") diff --git a/channels/rdpdr/server/rdpdr_main.c b/channels/rdpdr/server/rdpdr_main.c index cd31fcbb1..efaf5fb40 100644 --- a/channels/rdpdr/server/rdpdr_main.c +++ b/channels/rdpdr/server/rdpdr_main.c @@ -2341,9 +2341,17 @@ static UINT rdpdr_server_read_file_directory_information(wLog* log, wStream* s, if (!Stream_CheckAndLogRequiredLengthWLog(log, s, fileNameLength)) return ERROR_INVALID_DATA; + if (fileNameLength / sizeof(WCHAR) > ARRAYSIZE(fdi->FileName)) + return ERROR_INVALID_DATA; + +#if defined(__MINGW32__) || defined(WITH_WCHAR_FILE_DIRECTORY_INFORMATION) + if (Stream_Read_UTF16_String(s, fdi->FileName, fileNameLength / sizeof(WCHAR))) + return ERROR_INVALID_DATA; +#else if (Stream_Read_UTF16_String_As_UTF8_Buffer(s, fileNameLength / sizeof(WCHAR), fdi->FileName, ARRAYSIZE(fdi->FileName)) < 0) return ERROR_INVALID_DATA; +#endif return CHANNEL_RC_OK; } diff --git a/client/Windows/wf_client.c b/client/Windows/wf_client.c index 6445f3f4a..c7aa63e63 100644 --- a/client/Windows/wf_client.c +++ b/client/Windows/wf_client.c @@ -281,7 +281,7 @@ static BOOL wf_pre_connect(freerdp* instance) return FALSE; } - uint32_t keyboardLayoutId = freerdp_settings_get_uint32(settings, FreeRDP_KeyboardLayout); + DWORD keyboardLayoutId = freerdp_settings_get_uint32(settings, FreeRDP_KeyboardLayout); { CHAR name[KL_NAMELENGTH + 1] = { 0 }; diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 6a5216eef..9e2556f6c 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -2469,8 +2469,8 @@ static int parse_codec_cache_options(rdpSettings* settings, const COMMAND_LINE_A static BOOL check_kbd_remap_valid(const char* token) { - DWORD key = 0; - DWORD value = 0; + UINT32 key = 0; + UINT32 value = 0; WINPR_ASSERT(token); /* The remapping is only allowed for scancodes, so maximum is 999=999 */ diff --git a/include/config/config.h.in b/include/config/config.h.in index fe27a5f87..d42de2fef 100644 --- a/include/config/config.h.in +++ b/include/config/config.h.in @@ -239,4 +239,10 @@ #cmakedefine WITHOUT_FREERDP_3x_DEPRECATED #endif +/** Build FILE_DIRECTORY_INFORMATION::FileName with type WCHAR instead of char + * + * @since version 3.20.0 + */ +#cmakedefine WITH_WCHAR_FILE_DIRECTORY_INFORMATION + #endif /* FREERDP_CONFIG_H */ diff --git a/include/freerdp/server/rdpdr.h b/include/freerdp/server/rdpdr.h index 8f01f1fc5..c4ddc5ba5 100644 --- a/include/freerdp/server/rdpdr.h +++ b/include/freerdp/server/rdpdr.h @@ -24,6 +24,7 @@ #define FREERDP_CHANNEL_RDPDR_SERVER_RDPDR_H #include +#include #include #include #include @@ -59,7 +60,11 @@ typedef struct LARGE_INTEGER EndOfFile; LARGE_INTEGER AllocationSize; UINT32 FileAttributes; +#if defined(WITH_WCHAR_FILE_DIRECTORY_INFORMATION) + WCHAR FileName[512]; +#else char FileName[512]; +#endif } FILE_DIRECTORY_INFORMATION; #endif diff --git a/libfreerdp/core/gateway/http.c b/libfreerdp/core/gateway/http.c index cee034f51..5f94c10aa 100644 --- a/libfreerdp/core/gateway/http.c +++ b/libfreerdp/core/gateway/http.c @@ -330,7 +330,7 @@ static char* guid2str(const GUID* guid, char* buffer, size_t len) { if (!guid) return NULL; - char* strguid = NULL; + RPC_CSTR strguid = NULL; RPC_STATUS rpcStatus = UuidToStringA(guid, &strguid); diff --git a/libfreerdp/core/gateway/rpc.c b/libfreerdp/core/gateway/rpc.c index bcf808ce6..23abd26fd 100644 --- a/libfreerdp/core/gateway/rpc.c +++ b/libfreerdp/core/gateway/rpc.c @@ -539,7 +539,7 @@ static int rpc_channel_rpch_init(RpcClient* client, RpcChannel* channel, const c if (guid) { - char* strguid = NULL; + RPC_CSTR strguid = NULL; RPC_STATUS rpcStatus = UuidToStringA(guid, &strguid); if (rpcStatus != RPC_S_OK) diff --git a/libfreerdp/core/tcp.c b/libfreerdp/core/tcp.c index 8af130c33..bef9d21f1 100644 --- a/libfreerdp/core/tcp.c +++ b/libfreerdp/core/tcp.c @@ -1515,7 +1515,8 @@ BOOL freerdp_tcp_set_nodelay(wLog* log, DWORD level, int sockfd) int type = -1; socklen_t typelen = sizeof(type); - const int rc = getsockopt(sockfd, SOL_SOCKET, SO_TYPE, &type, &typelen); + char* ptype = (char*)&type; + const int rc = getsockopt(sockfd, SOL_SOCKET, SO_TYPE, ptype, &typelen); if (rc < 0) { char buffer[128] = { 0 }; diff --git a/libfreerdp/crypto/cert_common.c b/libfreerdp/crypto/cert_common.c index 17a0d4850..731dd32da 100644 --- a/libfreerdp/crypto/cert_common.c +++ b/libfreerdp/crypto/cert_common.c @@ -46,7 +46,7 @@ static BOOL cert_info_allocate(rdpCertInfo* info, size_t size); -BOOL read_bignum(BYTE** dst, UINT32* length, const BIGNUM* num, BOOL alloc) +BOOL read_bignum(BYTE** dst, DWORD* length, const BIGNUM* num, BOOL alloc) { WINPR_ASSERT(dst); WINPR_ASSERT(length); @@ -97,7 +97,7 @@ BOOL cert_info_create(rdpCertInfo* dst, const BIGNUM* rsa, const BIGNUM* rsa_e) if (!read_bignum(&dst->Modulus, &dst->ModulusLength, rsa, TRUE)) goto fail; - UINT32 len = sizeof(dst->exponent); + DWORD len = sizeof(dst->exponent); BYTE* ptr = &dst->exponent[0]; if (!read_bignum(&ptr, &len, rsa_e, FALSE)) goto fail; diff --git a/libfreerdp/crypto/cert_common.h b/libfreerdp/crypto/cert_common.h index dca753c02..9c7a65393 100644 --- a/libfreerdp/crypto/cert_common.h +++ b/libfreerdp/crypto/cert_common.h @@ -28,6 +28,8 @@ #include #include +#include "opensslcompat.h" + #ifdef __cplusplus extern "C" { @@ -40,7 +42,7 @@ extern "C" FREERDP_LOCAL BOOL cert_info_read_modulus(rdpCertInfo* info, size_t size, wStream* s); FREERDP_LOCAL BOOL cert_info_read_exponent(rdpCertInfo* info, size_t size, wStream* s); - FREERDP_LOCAL BOOL read_bignum(BYTE** dst, UINT32* length, const BIGNUM* num, BOOL alloc); + FREERDP_LOCAL BOOL read_bignum(BYTE** dst, DWORD* length, const BIGNUM* num, BOOL alloc); #if !defined(OPENSSL_VERSION_MAJOR) || (OPENSSL_VERSION_MAJOR < 3) FREERDP_LOCAL X509* x509_from_rsa(const RSA* rsa); diff --git a/libfreerdp/locale/keyboard.c b/libfreerdp/locale/keyboard.c index e1964c41d..450b76c26 100644 --- a/libfreerdp/locale/keyboard.c +++ b/libfreerdp/locale/keyboard.c @@ -382,8 +382,8 @@ FREERDP_REMAP_TABLE* freerdp_keyboard_remap_string_to_list(const char* list) char* token = strtok_s(copy, ",", &context); while (token) { - DWORD key = 0; - DWORD value = 0; + UINT32 key = 0; + UINT32 value = 0; if (!freerdp_extract_key_value(token, &key, &value)) goto fail; if (key >= remap_table_size) diff --git a/scripts/mingw.sh b/scripts/mingw.sh index a5ca52bc0..eb94fb217 100755 --- a/scripts/mingw.sh +++ b/scripts/mingw.sh @@ -141,19 +141,19 @@ if [ $CLONE -ne 0 ]; then do_clone v1.3.1 https://github.com/madler/zlib.git zlib do_clone uriparser-0.9.8 https://github.com/uriparser/uriparser.git uriparser do_clone json-c-0.18-20240915 https://github.com/json-c/json-c.git json-c - do_clone release-3.2.10 https://github.com/libsdl-org/SDL.git SDL + do_clone release-3.2.28 https://github.com/libsdl-org/SDL.git SDL if [ $FFMPEG -ne 0 ]; then - do_clone n7.1.1 https://github.com/FFmpeg/FFmpeg.git FFmpeg + do_clone n8.0.1 https://github.com/FFmpeg/FFmpeg.git FFmpeg fi if [ $OPENH264 -ne 0 ]; then do_clone v2.6.0 https://github.com/cisco/openh264.git openh264 fi - do_clone v1.0.28-0 https://github.com/libusb/libusb-cmake.git libusb-cmake + do_clone v1.0.29-0 https://github.com/libusb/libusb-cmake.git libusb-cmake do_clone release-3.2.4 https://github.com/libsdl-org/SDL_image.git SDL_image do_clone release-3.2.2 https://github.com/libsdl-org/SDL_ttf.git SDL_ttf do_clone v2.0.3 https://github.com/mstorsjo/fdk-aac.git fdk-aac do_clone v1.5.2 https://gitlab.xiph.org/xiph/opus.git opus - do_download https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/ libressl-4.0.0.tar.gz 4d841955f0acc3dfc71d0e3dd35f283af461222350e26843fea9731c0246a1e4 libressl + do_download https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/ libressl-4.2.1.tar.gz 6d5c2f58583588ea791f4c8645004071d00dfa554a5bf788a006ca1eb5abd70b libressl fi if [ $BUILD -eq 0 ]; then @@ -267,6 +267,7 @@ fi do_cmake_build \ "$BUILD_BASE/freerdp" \ -S "$SCRIPT_PATH/.." \ + -DWITHOUT_FREERDP_3x_DEPRECATED=ON \ -DWITH_SERVER=ON \ -DWITH_SHADOW=OFF \ -DWITH_PLATFORM_SERVER=OFF \ diff --git a/scripts/mingw64.cmake b/scripts/mingw64.cmake index 8cbaf3db3..39ac80874 100644 --- a/scripts/mingw64.cmake +++ b/scripts/mingw64.cmake @@ -33,3 +33,9 @@ set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "toolchain default") set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY ON CACHE BOOL "toolchain default") set(CMAKE_VERBOSE_MAKEFILE ON CACHE BOOL "toolchain default") set(THREADS_PREFER_PTHREAD_FLAG ON CACHE BOOL "toolchain default") + +# mingw does not support C11 +# +# https://stackoverflow.com/questions/52239644/mingw-w64-c11-threads-h-not-found +add_compile_definitions(__STDC_NO_THREADS__) +add_compile_definitions(__STDC_NO_ATOMICS__) diff --git a/winpr/libwinpr/wtsapi/wtsapi_win32.c b/winpr/libwinpr/wtsapi/wtsapi_win32.c index 3dff0ea93..207288612 100644 --- a/winpr/libwinpr/wtsapi/wtsapi_win32.c +++ b/winpr/libwinpr/wtsapi/wtsapi_win32.c @@ -72,7 +72,7 @@ typedef HANDLE(WINAPI* fnWinStationVirtualOpenEx)(HANDLE hServer, DWORD SessionI static fnWinStationVirtualOpen pfnWinStationVirtualOpen = NULL; static fnWinStationVirtualOpenEx pfnWinStationVirtualOpenEx = NULL; -BOOL WINAPI Win32_WTSVirtualChannelClose(HANDLE hChannel); +static BOOL WINAPI Win32_WTSVirtualChannelClose(HANDLE hChannel); /** * NOTE !! @@ -116,7 +116,7 @@ static void _wts_free(void* ptr) #endif } -BOOL Win32_WTSVirtualChannelReadAsync(WTSAPI_CHANNEL* pChannel) +static BOOL Win32_WTSVirtualChannelReadAsync(WTSAPI_CHANNEL* pChannel) { BOOL status = TRUE; DWORD numBytes = 0; @@ -170,8 +170,8 @@ BOOL Win32_WTSVirtualChannelReadAsync(WTSAPI_CHANNEL* pChannel) return TRUE; } -HANDLE WINAPI Win32_WTSVirtualChannelOpen_Internal(HANDLE hServer, DWORD SessionId, - LPSTR pVirtualName, DWORD flags) +static HANDLE WINAPI Win32_WTSVirtualChannelOpen_Internal(HANDLE hServer, DWORD SessionId, + LPSTR pVirtualName, DWORD flags) { HANDLE hFile; HANDLE hChannel; @@ -245,17 +245,18 @@ HANDLE WINAPI Win32_WTSVirtualChannelOpen_Internal(HANDLE hServer, DWORD Session return hChannel; } -HANDLE WINAPI Win32_WTSVirtualChannelOpen(HANDLE hServer, DWORD SessionId, LPSTR pVirtualName) +static HANDLE WINAPI Win32_WTSVirtualChannelOpen(HANDLE hServer, DWORD SessionId, + LPSTR pVirtualName) { return Win32_WTSVirtualChannelOpen_Internal(hServer, SessionId, pVirtualName, 0); } -HANDLE WINAPI Win32_WTSVirtualChannelOpenEx(DWORD SessionId, LPSTR pVirtualName, DWORD flags) +static HANDLE WINAPI Win32_WTSVirtualChannelOpenEx(DWORD SessionId, LPSTR pVirtualName, DWORD flags) { return Win32_WTSVirtualChannelOpen_Internal(0, SessionId, pVirtualName, flags); } -BOOL WINAPI Win32_WTSVirtualChannelClose(HANDLE hChannel) +static BOOL WINAPI Win32_WTSVirtualChannelClose(HANDLE hChannel) { BOOL status = TRUE; WTSAPI_CHANNEL* pChannel = (WTSAPI_CHANNEL*)hChannel; @@ -302,9 +303,10 @@ BOOL WINAPI Win32_WTSVirtualChannelClose(HANDLE hChannel) return status; } -BOOL WINAPI Win32_WTSVirtualChannelRead_Static(WTSAPI_CHANNEL* pChannel, DWORD dwMilliseconds, - LPVOID lpBuffer, DWORD nNumberOfBytesToRead, - LPDWORD lpNumberOfBytesTransferred) +static BOOL WINAPI Win32_WTSVirtualChannelRead_Static(WTSAPI_CHANNEL* pChannel, + DWORD dwMilliseconds, LPVOID lpBuffer, + DWORD nNumberOfBytesToRead, + LPDWORD lpNumberOfBytesTransferred) { if (pChannel->readDone) { @@ -449,9 +451,10 @@ BOOL WINAPI Win32_WTSVirtualChannelRead_Static(WTSAPI_CHANNEL* pChannel, DWORD d return FALSE; } -BOOL WINAPI Win32_WTSVirtualChannelRead_Dynamic(WTSAPI_CHANNEL* pChannel, DWORD dwMilliseconds, - LPVOID lpBuffer, DWORD nNumberOfBytesToRead, - LPDWORD lpNumberOfBytesTransferred) +static BOOL WINAPI Win32_WTSVirtualChannelRead_Dynamic(WTSAPI_CHANNEL* pChannel, + DWORD dwMilliseconds, LPVOID lpBuffer, + DWORD nNumberOfBytesToRead, + LPDWORD lpNumberOfBytesTransferred) { if (pChannel->readSync) { @@ -567,9 +570,9 @@ BOOL WINAPI Win32_WTSVirtualChannelRead_Dynamic(WTSAPI_CHANNEL* pChannel, DWORD return FALSE; } -BOOL WINAPI Win32_WTSVirtualChannelRead(HANDLE hChannel, DWORD dwMilliseconds, LPVOID lpBuffer, - DWORD nNumberOfBytesToRead, - LPDWORD lpNumberOfBytesTransferred) +static BOOL WINAPI Win32_WTSVirtualChannelRead(HANDLE hChannel, DWORD dwMilliseconds, + PCHAR lpBuffer, DWORD nNumberOfBytesToRead, + LPDWORD lpNumberOfBytesTransferred) { WTSAPI_CHANNEL* pChannel = (WTSAPI_CHANNEL*)hChannel; @@ -625,9 +628,9 @@ BOOL WINAPI Win32_WTSVirtualChannelRead(HANDLE hChannel, DWORD dwMilliseconds, L return FALSE; } -BOOL WINAPI Win32_WTSVirtualChannelWrite(HANDLE hChannel, LPCVOID lpBuffer, - DWORD nNumberOfBytesToWrite, - LPDWORD lpNumberOfBytesTransferred) +static BOOL WINAPI Win32_WTSVirtualChannelWrite(HANDLE hChannel, PCHAR lpBuffer, + DWORD nNumberOfBytesToWrite, + LPDWORD lpNumberOfBytesTransferred) { OVERLAPPED overlapped = { 0 }; WTSAPI_CHANNEL* pChannel = (WTSAPI_CHANNEL*)hChannel; @@ -652,7 +655,7 @@ BOOL WINAPI Win32_WTSVirtualChannelWrite(HANDLE hChannel, LPCVOID lpBuffer, #define FILE_DEVICE_TERMSRV 0x00000038 #endif -BOOL Win32_WTSVirtualChannelPurge_Internal(HANDLE hChannelHandle, ULONG IoControlCode) +static BOOL Win32_WTSVirtualChannelPurge_Internal(HANDLE hChannelHandle, ULONG IoControlCode) { IO_STATUS_BLOCK ioStatusBlock = { 0 }; WTSAPI_CHANNEL* pChannel = (WTSAPI_CHANNEL*)hChannelHandle; @@ -698,20 +701,21 @@ BOOL Win32_WTSVirtualChannelPurge_Internal(HANDLE hChannelHandle, ULONG IoContro return TRUE; } -BOOL WINAPI Win32_WTSVirtualChannelPurgeInput(HANDLE hChannelHandle) +static BOOL WINAPI Win32_WTSVirtualChannelPurgeInput(HANDLE hChannelHandle) { return Win32_WTSVirtualChannelPurge_Internal(hChannelHandle, (FILE_DEVICE_TERMSRV << 16) | 0x0107); } -BOOL WINAPI Win32_WTSVirtualChannelPurgeOutput(HANDLE hChannelHandle) +static BOOL WINAPI Win32_WTSVirtualChannelPurgeOutput(HANDLE hChannelHandle) { return Win32_WTSVirtualChannelPurge_Internal(hChannelHandle, (FILE_DEVICE_TERMSRV << 16) | 0x010B); } -BOOL WINAPI Win32_WTSVirtualChannelQuery(HANDLE hChannelHandle, WTS_VIRTUAL_CLASS WtsVirtualClass, - PVOID* ppBuffer, DWORD* pBytesReturned) +static BOOL WINAPI Win32_WTSVirtualChannelQuery(HANDLE hChannelHandle, + WTS_VIRTUAL_CLASS WtsVirtualClass, PVOID* ppBuffer, + DWORD* pBytesReturned) { WTSAPI_CHANNEL* pChannel = (WTSAPI_CHANNEL*)hChannelHandle; @@ -764,19 +768,19 @@ BOOL WINAPI Win32_WTSVirtualChannelQuery(HANDLE hChannelHandle, WTS_VIRTUAL_CLAS return TRUE; } -VOID WINAPI Win32_WTSFreeMemory(PVOID pMemory) +static VOID WINAPI Win32_WTSFreeMemory(PVOID pMemory) { _wts_free(pMemory); } -BOOL WINAPI Win32_WTSFreeMemoryExW(WTS_TYPE_CLASS WTSTypeClass, PVOID pMemory, - ULONG NumberOfEntries) +static BOOL WINAPI Win32_WTSFreeMemoryExW(WTS_TYPE_CLASS WTSTypeClass, PVOID pMemory, + ULONG NumberOfEntries) { return FALSE; } -BOOL WINAPI Win32_WTSFreeMemoryExA(WTS_TYPE_CLASS WTSTypeClass, PVOID pMemory, - ULONG NumberOfEntries) +static BOOL WINAPI Win32_WTSFreeMemoryExA(WTS_TYPE_CLASS WTSTypeClass, PVOID pMemory, + ULONG NumberOfEntries) { return WTSFreeMemoryExW(WTSTypeClass, pMemory, NumberOfEntries); }