From 99619b3392ada902351333b3019e41a96f32e1fb Mon Sep 17 00:00:00 2001 From: akallabeth Date: Wed, 26 Mar 2025 19:41:39 +0100 Subject: [PATCH 1/3] [warnings] fix stringlength checks --- winpr/libwinpr/clipboard/synthetic_file.c | 9 +++++---- winpr/libwinpr/sspi/Kerberos/kerberos.c | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/winpr/libwinpr/clipboard/synthetic_file.c b/winpr/libwinpr/clipboard/synthetic_file.c index e17120598..806d48278 100644 --- a/winpr/libwinpr/clipboard/synthetic_file.c +++ b/winpr/libwinpr/clipboard/synthetic_file.c @@ -796,13 +796,14 @@ static void* convert_filedescriptors_to_file_list(wClipboard* clipboard, UINT32 previous_at = curName; while ((stop_at = stop_at_special_chars(previous_at)) != NULL) { - char* tmp = - strndup(previous_at, WINPR_ASSERTING_INT_CAST(size_t, stop_at - previous_at)); + const intptr_t diff = stop_at - previous_at; + if (diff < 0) + goto loop_fail; + char* tmp = strndup(previous_at, WINPR_ASSERTING_INT_CAST(size_t, diff)); if (!tmp) goto loop_fail; - rc = _snprintf(&dst[pos], WINPR_ASSERTING_INT_CAST(size_t, stop_at - previous_at + 1), - "%s", tmp); + rc = _snprintf(&dst[pos], WINPR_ASSERTING_INT_CAST(size_t, diff + 1), "%s", tmp); free(tmp); if (rc < 0) goto loop_fail; diff --git a/winpr/libwinpr/sspi/Kerberos/kerberos.c b/winpr/libwinpr/sspi/Kerberos/kerberos.c index 97e65e24d..60a38e0da 100644 --- a/winpr/libwinpr/sspi/Kerberos/kerberos.c +++ b/winpr/libwinpr/sspi/Kerberos/kerberos.c @@ -675,7 +675,7 @@ static BOOL append(char* dst, size_t dstSize, const char* src) const size_t slen = strlen(src); if (dlen + slen >= dstSize) return FALSE; - if (!strncat(dst, src, slen)) + if (!strncat(dst, src, dstSize - dlen)) return FALSE; return TRUE; } From 8d469feda09b57049401f94931b11196fbbc9023 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Wed, 26 Mar 2025 20:01:44 +0100 Subject: [PATCH 2/3] [client,sdl] fix initial window size * on high dpi displays set appropriate initial display size (divide pixel size with scale) * send display resize on window resize events * send display resize on any window event (minimize/maximize/expose/...) --- client/SDL/SDL3/sdl_disp.cpp | 6 ++++-- client/SDL/SDL3/sdl_window.cpp | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/client/SDL/SDL3/sdl_disp.cpp b/client/SDL/SDL3/sdl_disp.cpp index 9c32dc1a3..02cd09d3d 100644 --- a/client/SDL/SDL3/sdl_disp.cpp +++ b/client/SDL/SDL3/sdl_disp.cpp @@ -358,10 +358,12 @@ BOOL sdlDispContext::handle_window_event(const SDL_WindowEvent* ev) auto ctx = _sdl->context(); if (ctx && ctx->gdi) gdi_send_suppress_output(ctx->gdi, FALSE); - return TRUE; } + /* fallthrough */ + WINPR_FALLTHROUGH case SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED: case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED: + case SDL_EVENT_WINDOW_RESIZED: { if (freerdp_settings_get_bool(_sdl->context()->settings, FreeRDP_DynamicResolutionUpdate)) @@ -370,7 +372,7 @@ BOOL sdlDispContext::handle_window_event(const SDL_WindowEvent* ev) const auto factor = SDL_GetWindowDisplayScale(window.window()); _targetDesktopScaleFactor = static_cast(100 * factor); } - assert(SDL_GetWindowSizeInPixels(it->second.window(), &_targetWidth, &_targetHeight)); + SDL_GetWindowSizeInPixels(it->second.window(), &_targetWidth, &_targetHeight); return addTimer(); } case SDL_EVENT_WINDOW_MOUSE_LEAVE: diff --git a/client/SDL/SDL3/sdl_window.cpp b/client/SDL/SDL3/sdl_window.cpp index eefc7e558..61c4c4e70 100644 --- a/client/SDL/SDL3/sdl_window.cpp +++ b/client/SDL/SDL3/sdl_window.cpp @@ -33,6 +33,12 @@ SdlWindow::SdlWindow(const std::string& title, Sint32 startupX, Sint32 startupY, // SDL_SetProperty(props, SDL_PROP_WINDOW_CREATE_FL); _window = SDL_CreateWindowWithProperties(props); SDL_DestroyProperties(props); + + auto scale = SDL_GetWindowPixelDensity(_window); + const int iscale = static_cast(scale * 100.0f); + auto w = 100 * width / iscale; + auto h = 100 * height / iscale; + SDL_SetWindowSize(_window, w, h); } SdlWindow::SdlWindow(SdlWindow&& other) noexcept From 89340f096f5e070464c72bcd545bf0d8eeb83a77 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Wed, 26 Mar 2025 20:21:44 +0100 Subject: [PATCH 3/3] [gdi] clean up gdi_send_suppress_output --- libfreerdp/gdi/gdi.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/libfreerdp/gdi/gdi.c b/libfreerdp/gdi/gdi.c index 1b15c7ffe..3e4d35d99 100644 --- a/libfreerdp/gdi/gdi.c +++ b/libfreerdp/gdi/gdi.c @@ -1451,25 +1451,29 @@ void gdi_free(freerdp* instance) BOOL gdi_send_suppress_output(rdpGdi* gdi, BOOL suppress) { - RECTANGLE_16 rect; - rdpSettings* settings = NULL; - rdpUpdate* update = NULL; - - if (!gdi || !gdi->context->settings || !gdi->context->update) + if (!gdi || !gdi->context) return FALSE; if (gdi->suppressOutput == suppress) return TRUE; gdi->suppressOutput = suppress; - settings = gdi->context->settings; - update = gdi->context->update; - rect.left = 0; - rect.top = 0; + + rdpContext* context = gdi->context; + rdpSettings* settings = context->settings; + WINPR_ASSERT(settings); + + rdpUpdate* update = context->update; + WINPR_ASSERT(update); const UINT32 w = freerdp_settings_get_uint32(settings, FreeRDP_DesktopWidth); const UINT32 h = freerdp_settings_get_uint32(settings, FreeRDP_DesktopHeight); - rect.right = WINPR_ASSERTING_INT_CAST(UINT16, w); - rect.bottom = WINPR_ASSERTING_INT_CAST(UINT16, h); - return update->SuppressOutput(gdi->context, !suppress, &rect); + + const RECTANGLE_16 rect = { .left = 0, + .top = 0, + .right = WINPR_ASSERTING_INT_CAST(UINT16, w), + .bottom = WINPR_ASSERTING_INT_CAST(UINT16, h) }; + + WINPR_ASSERT(update->SuppressOutput); + return update->SuppressOutput(context, !suppress, &rect); }