From 8062adf83d53ae2e758cb858d3a62e7db342782b Mon Sep 17 00:00:00 2001 From: akallabeth Date: Tue, 16 Sep 2025 09:23:31 +0200 Subject: [PATCH] [clients] add checks from #11804 to all clients --- client/Mac/MRDPView.m | 40 +++++++++++++++----------- client/SDL/SDL2/sdl_freerdp.cpp | 43 ++++++++++++++++++---------- client/SDL/SDL3/sdl_freerdp.cpp | 37 ++++++++++++++++-------- client/Sample/tf_freerdp.c | 13 ++++++--- client/Wayland/wlfreerdp.c | 34 +++++++++++----------- client/Windows/wf_client.c | 33 +++++++++++++++------- client/iOS/FreeRDP/ios_freerdp_ui.m | 44 ++++++++++++++++++++++++----- 7 files changed, 164 insertions(+), 80 deletions(-) diff --git a/client/Mac/MRDPView.m b/client/Mac/MRDPView.m index bbb761083..f51ccab3c 100644 --- a/client/Mac/MRDPView.m +++ b/client/Mac/MRDPView.m @@ -1400,29 +1400,37 @@ BOOL mac_begin_paint(rdpContext *context) BOOL mac_end_paint(rdpContext *context) { - rdpGdi *gdi; - HGDI_RGN invalid; NSRect newDrawRect; - int ww, wh, dw, dh; - mfContext *mfc = (mfContext *)context; - MRDPView *view = (MRDPView *)mfc->view; - gdi = context->gdi; - - if (!gdi) - return FALSE; - - ww = mfc->client_width; - wh = mfc->client_height; - dw = freerdp_settings_get_uint32(mfc->common.context.settings, FreeRDP_DesktopWidth); - dh = freerdp_settings_get_uint32(mfc->common.context.settings, FreeRDP_DesktopHeight); if ((!context) || (!context->gdi)) return FALSE; - if (context->gdi->primary->hdc->hwnd->invalid->null) + mfContext *mfc = (mfContext *)context; + MRDPView *view = (MRDPView *)mfc->view; + WINPR_ASSERT(view); + + rdpGdi *gdi = context->gdi; + + if (!gdi) + return FALSE; + + const int ww = mfc->client_width; + const int wh = mfc->client_height; + const int dw = freerdp_settings_get_uint32(mfc->common.context.settings, FreeRDP_DesktopWidth); + const int dh = freerdp_settings_get_uint32(mfc->common.context.settings, FreeRDP_DesktopHeight); + + HGDI_DC hdc = gdi->primary->hdc; + WINPR_ASSERT(hdc); + if (!hdc->hwnd) return TRUE; - invalid = gdi->primary->hdc->hwnd->invalid; + HGDI_WND hwnd = hdc->hwnd; + WINPR_ASSERT(hwnd->invalid || (hwnd->ninvalid == 0)); + + if (hwnd->invalid->null) + return TRUE; + + HGDI_RGN invalid = gdi->primary->hdc->hwnd->invalid; newDrawRect.origin.x = invalid->x; newDrawRect.origin.y = invalid->y; newDrawRect.size.width = invalid->w; diff --git a/client/SDL/SDL2/sdl_freerdp.cpp b/client/SDL/SDL2/sdl_freerdp.cpp index 8c489fe65..696057e29 100644 --- a/client/SDL/SDL2/sdl_freerdp.cpp +++ b/client/SDL/SDL2/sdl_freerdp.cpp @@ -285,7 +285,6 @@ static int error_info_to_error(freerdp* instance, DWORD* pcode, char** msg, size * It can be used to reset invalidated areas. */ static BOOL sdl_begin_paint(rdpContext* context) { - rdpGdi* gdi = nullptr; auto sdl = get_context(context); WINPR_ASSERT(sdl); @@ -301,14 +300,19 @@ static BOOL sdl_begin_paint(rdpContext* context) } sdl->update_complete.clear(); - gdi = context->gdi; + auto gdi = context->gdi; WINPR_ASSERT(gdi); WINPR_ASSERT(gdi->primary); - WINPR_ASSERT(gdi->primary->hdc); - WINPR_ASSERT(gdi->primary->hdc->hwnd); - WINPR_ASSERT(gdi->primary->hdc->hwnd->invalid); - gdi->primary->hdc->hwnd->invalid->null = TRUE; - gdi->primary->hdc->hwnd->ninvalid = 0; + + HGDI_DC hdc = gdi->primary->hdc; + WINPR_ASSERT(hdc); + if (!hdc->hwnd) + return TRUE; + + HGDI_WND hwnd = hdc->hwnd; + WINPR_ASSERT(hwnd->invalid); + hwnd->invalid->null = TRUE; + hwnd->ninvalid = 0; return TRUE; } @@ -437,24 +441,33 @@ static BOOL sdl_draw_to_window(SdlContext* sdl, std::map& win static BOOL sdl_end_paint_process(rdpContext* context) { - rdpGdi* gdi = nullptr; auto sdl = get_context(context); WINPR_ASSERT(context); SdlEventUpdateTriggerGuard guard(sdl); - gdi = context->gdi; + auto gdi = context->gdi; WINPR_ASSERT(gdi); WINPR_ASSERT(gdi->primary); - WINPR_ASSERT(gdi->primary->hdc); - WINPR_ASSERT(gdi->primary->hdc->hwnd); - WINPR_ASSERT(gdi->primary->hdc->hwnd->invalid); - if (gdi->suppressOutput || gdi->primary->hdc->hwnd->invalid->null) + + HGDI_DC hdc = gdi->primary->hdc; + WINPR_ASSERT(hdc); + if (!hdc->hwnd) return TRUE; - const INT32 ninvalid = gdi->primary->hdc->hwnd->ninvalid; - const GDI_RGN* cinvalid = gdi->primary->hdc->hwnd->cinvalid; + HGDI_WND hwnd = hdc->hwnd; + WINPR_ASSERT(hwnd->invalid || (hwnd->ninvalid == 0)); + + if (hwnd->invalid->null) + return TRUE; + + WINPR_ASSERT(hwnd->invalid); + if (gdi->suppressOutput || hwnd->invalid->null) + return TRUE; + + const INT32 ninvalid = hwnd->ninvalid; + const GDI_RGN* cinvalid = hwnd->cinvalid; if (ninvalid < 1) return TRUE; diff --git a/client/SDL/SDL3/sdl_freerdp.cpp b/client/SDL/SDL3/sdl_freerdp.cpp index 0adb4ab67..aa6166d72 100644 --- a/client/SDL/SDL3/sdl_freerdp.cpp +++ b/client/SDL/SDL3/sdl_freerdp.cpp @@ -285,11 +285,16 @@ static BOOL sdl_begin_paint(rdpContext* context) auto gdi = context->gdi; WINPR_ASSERT(gdi); WINPR_ASSERT(gdi->primary); - WINPR_ASSERT(gdi->primary->hdc); - WINPR_ASSERT(gdi->primary->hdc->hwnd); - WINPR_ASSERT(gdi->primary->hdc->hwnd->invalid); - gdi->primary->hdc->hwnd->invalid->null = TRUE; - gdi->primary->hdc->hwnd->ninvalid = 0; + + HGDI_DC hdc = gdi->primary->hdc; + WINPR_ASSERT(hdc); + if (!hdc->hwnd) + return TRUE; + + HGDI_WND hwnd = hdc->hwnd; + WINPR_ASSERT(hwnd->invalid); + hwnd->invalid->null = TRUE; + hwnd->ninvalid = 0; return TRUE; } @@ -377,14 +382,24 @@ static BOOL sdl_end_paint(rdpContext* context) auto gdi = context->gdi; WINPR_ASSERT(gdi); WINPR_ASSERT(gdi->primary); - WINPR_ASSERT(gdi->primary->hdc); - WINPR_ASSERT(gdi->primary->hdc->hwnd); - WINPR_ASSERT(gdi->primary->hdc->hwnd->invalid); - if (gdi->suppressOutput || gdi->primary->hdc->hwnd->invalid->null) + + HGDI_DC hdc = gdi->primary->hdc; + WINPR_ASSERT(hdc); + if (!hdc->hwnd) return TRUE; - const INT32 ninvalid = gdi->primary->hdc->hwnd->ninvalid; - const GDI_RGN* cinvalid = gdi->primary->hdc->hwnd->cinvalid; + HGDI_WND hwnd = hdc->hwnd; + WINPR_ASSERT(hwnd->invalid || (hwnd->ninvalid == 0)); + + if (hwnd->invalid->null) + return TRUE; + + WINPR_ASSERT(hwnd->invalid); + if (gdi->suppressOutput || hwnd->invalid->null) + return TRUE; + + const INT32 ninvalid = hwnd->ninvalid; + const GDI_RGN* cinvalid = hwnd->cinvalid; if (ninvalid < 1) return TRUE; diff --git a/client/Sample/tf_freerdp.c b/client/Sample/tf_freerdp.c index 39823d5e6..2f419753d 100644 --- a/client/Sample/tf_freerdp.c +++ b/client/Sample/tf_freerdp.c @@ -78,11 +78,16 @@ static BOOL tf_end_paint(rdpContext* context) gdi = context->gdi; WINPR_ASSERT(gdi); WINPR_ASSERT(gdi->primary); - WINPR_ASSERT(gdi->primary->hdc); - WINPR_ASSERT(gdi->primary->hdc->hwnd); - WINPR_ASSERT(gdi->primary->hdc->hwnd->invalid); - if (gdi->primary->hdc->hwnd->invalid->null) + HGDI_DC hdc = gdi->primary->hdc; + WINPR_ASSERT(hdc); + if (!hdc->hwnd) + return TRUE; + + HGDI_WND hwnd = hdc->hwnd; + WINPR_ASSERT(hwnd->invalid || (hwnd->ninvalid == 0)); + + if (hwnd->invalid->null) return TRUE; return TRUE; diff --git a/client/Wayland/wlfreerdp.c b/client/Wayland/wlfreerdp.c index ae84d8403..fec56faf4 100644 --- a/client/Wayland/wlfreerdp.c +++ b/client/Wayland/wlfreerdp.c @@ -120,33 +120,33 @@ fail: static BOOL wl_end_paint(rdpContext* context) { - rdpGdi* gdi = NULL; - wlfContext* context_w = NULL; - INT32 x = 0; - INT32 y = 0; - INT32 w = 0; - INT32 h = 0; - if (!context || !context->gdi || !context->gdi->primary) return FALSE; - gdi = context->gdi; - - if (gdi->primary->hdc->hwnd->invalid->null) + rdpGdi* gdi = context->gdi; + HGDI_DC hdc = gdi->primary->hdc; + WINPR_ASSERT(hdc); + if (!hdc->hwnd) return TRUE; - x = gdi->primary->hdc->hwnd->invalid->x; - y = gdi->primary->hdc->hwnd->invalid->y; - w = gdi->primary->hdc->hwnd->invalid->w; - h = gdi->primary->hdc->hwnd->invalid->h; - context_w = (wlfContext*)context; + HGDI_WND hwnd = hdc->hwnd; + WINPR_ASSERT(hwnd->invalid || (hwnd->ninvalid == 0)); + + if (hwnd->invalid->null) + return TRUE; + + const INT32 x = hwnd->invalid->x; + const INT32 y = hwnd->invalid->y; + const INT32 w = hwnd->invalid->w; + const INT32 h = hwnd->invalid->h; + wlfContext* context_w = (wlfContext*)context; if (!wl_update_buffer(context_w, x, y, w, h)) { return FALSE; } - gdi->primary->hdc->hwnd->invalid->null = TRUE; - gdi->primary->hdc->hwnd->ninvalid = 0; + hwnd->invalid->null = TRUE; + hwnd->ninvalid = 0; return TRUE; } diff --git a/client/Windows/wf_client.c b/client/Windows/wf_client.c index c8fab2a8d..6445f3f4a 100644 --- a/client/Windows/wf_client.c +++ b/client/Windows/wf_client.c @@ -83,17 +83,30 @@ static BOOL wf_has_console(void) static BOOL wf_end_paint(rdpContext* context) { - rdpGdi* gdi; - int ninvalid; - RECT updateRect; - HGDI_RGN cinvalid; - REGION16 invalidRegion; - RECTANGLE_16 invalidRect; - const RECTANGLE_16* extents; + RECT updateRect = { 0 }; + REGION16 invalidRegion = { 0 }; + RECTANGLE_16 invalidRect = { 0 }; + const RECTANGLE_16* extents = NULL; + + WINPR_ASSERT(context); + wfContext* wfc = (wfContext*)context; - gdi = context->gdi; - ninvalid = gdi->primary->hdc->hwnd->ninvalid; - cinvalid = gdi->primary->hdc->hwnd->cinvalid; + rdpGdi* gdi = context->gdi; + WINPR_ASSERT(gdi); + + HGDI_DC hdc = gdi->primary->hdc; + WINPR_ASSERT(hdc); + if (!hdc->hwnd) + return TRUE; + + HGDI_WND hwnd = hdc->hwnd; + WINPR_ASSERT(hwnd->invalid || (hwnd->ninvalid == 0)); + + if (hwnd->invalid->null) + return TRUE; + + const int ninvalid = hwnd->ninvalid; + const HGDI_RGN cinvalid = hwnd->cinvalid; if (ninvalid < 1) return TRUE; diff --git a/client/iOS/FreeRDP/ios_freerdp_ui.m b/client/iOS/FreeRDP/ios_freerdp_ui.m index d03513ee6..346aaaba9 100644 --- a/client/iOS/FreeRDP/ios_freerdp_ui.m +++ b/client/iOS/FreeRDP/ios_freerdp_ui.m @@ -129,20 +129,50 @@ DWORD ios_ui_verify_changed_certificate_ex(freerdp *instance, const char *host, BOOL ios_ui_begin_paint(rdpContext *context) { + WINPR_ASSERT(context); + rdpGdi *gdi = context->gdi; - gdi->primary->hdc->hwnd->invalid->null = TRUE; + WINPR_ASSERT(gdi); + WINPR_ASSERT(gdi->primary); + + HGDI_DC hdc = gdi->primary->hdc; + WINPR_ASSERT(hdc); + if (!hdc->hwnd) + return TRUE; + + HGDI_WND hwnd = hdc->hwnd; + if (!hwnd->invalid) + return TRUE; + hwnd->invalid->null = TRUE; return TRUE; } BOOL ios_ui_end_paint(rdpContext *context) { - mfInfo *mfi = MFI_FROM_INSTANCE(context->instance); - rdpGdi *gdi = context->gdi; - CGRect dirty_rect = - CGRectMake(gdi->primary->hdc->hwnd->invalid->x, gdi->primary->hdc->hwnd->invalid->y, - gdi->primary->hdc->hwnd->invalid->w, gdi->primary->hdc->hwnd->invalid->h); + WINPR_ASSERT(context); - if (!gdi->primary->hdc->hwnd->invalid->null) + mfInfo *mfi = MFI_FROM_INSTANCE(context->instance); + WINPR_ASSERT(mfi); + + rdpGdi *gdi = context->gdi; + WINPR_ASSERT(gdi); + WINPR_ASSERT(gdi->primary); + + HGDI_DC hdc = gdi->primary->hdc; + WINPR_ASSERT(hdc); + if (!hdc->hwnd) + return TRUE; + + HGDI_WND hwnd = hdc->hwnd; + WINPR_ASSERT(hwnd->invalid || (hwnd->ninvalid == 0)); + + if (hwnd->invalid->null) + return TRUE; + + CGRect dirty_rect = + CGRectMake(hwnd->invalid->x, hwnd->invalid->y, hwnd->invalid->w, hwnd->invalid->h); + + if (!hwnd->invalid->null) [mfi->session performSelectorOnMainThread:@selector(setNeedsDisplayInRectAsValue:) withObject:[NSValue valueWithCGRect:dirty_rect] waitUntilDone:NO];