From df64d00a9740ef031f1bee2730b5594c169baed9 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Mon, 16 Feb 2026 10:57:57 +0100 Subject: [PATCH] [warnings,api] fix -Wunused-result With marking publid API [[nodiscard]] some problematic error checks in the core library were uncovered. This commit addresses these shortcomings. --- channels/rdpei/client/rdpei_main.c | 2 +- channels/rdpgfx/client/rdpgfx_main.c | 3 +- channels/rdpsnd/server/rdpsnd_main.c | 3 +- .../SDL2/dialogs/sdl_connection_dialog.cpp | 6 +- client/SDL/SDL2/sdl_disp.cpp | 6 +- client/SDL/SDL2/sdl_freerdp.cpp | 3 +- .../SDL3/dialogs/sdl_connection_dialog.cpp | 6 +- client/Wayland/wlf_cliprdr.c | 6 +- client/X11/xf_client.c | 8 +- client/X11/xf_cliprdr.c | 26 +++--- client/X11/xf_event.c | 5 +- client/X11/xf_gfx.c | 15 +++- client/X11/xf_keyboard.c | 10 +-- client/X11/xf_rail.c | 6 +- client/common/client.c | 8 +- client/common/client_cliprdr_file.c | 12 +-- libfreerdp/codec/progressive.c | 88 +++++++++++++------ libfreerdp/codec/rfx.c | 26 +++++- libfreerdp/codec/rfx_quantization.c | 6 +- libfreerdp/codec/yuv.c | 9 +- libfreerdp/common/settings.c | 66 +++++++------- libfreerdp/common/settings_str.c | 8 +- libfreerdp/core/client.c | 6 +- libfreerdp/core/freerdp.c | 3 +- libfreerdp/core/gcc.c | 4 +- libfreerdp/core/info.c | 2 +- libfreerdp/core/mcs.c | 88 +++++++++++++------ libfreerdp/core/utils.c | 6 +- libfreerdp/crypto/ber.c | 39 +++++--- libfreerdp/crypto/tls.c | 4 +- libfreerdp/gdi/clipping.c | 27 +++--- libfreerdp/gdi/gdi.c | 13 ++- libfreerdp/gdi/gfx.c | 69 ++++++++++----- libfreerdp/gdi/graphics.c | 9 +- libfreerdp/gdi/region.c | 19 ++-- libfreerdp/gdi/shape.c | 32 +++---- libfreerdp/gdi/video.c | 8 +- libfreerdp/utils/smartcard_call.c | 4 +- server/Sample/sfreerdp.c | 27 +++--- server/proxy/pf_client.c | 6 +- server/shadow/X11/x11_shadow.c | 8 +- server/shadow/shadow_client.c | 59 ++++++++----- server/shadow/shadow_encoder.c | 3 +- server/shadow/shadow_lobby.c | 6 +- 44 files changed, 479 insertions(+), 291 deletions(-) diff --git a/channels/rdpei/client/rdpei_main.c b/channels/rdpei/client/rdpei_main.c index 5479d29a5..fc5477b87 100644 --- a/channels/rdpei/client/rdpei_main.c +++ b/channels/rdpei/client/rdpei_main.c @@ -1568,7 +1568,7 @@ static void terminate_plugin_cb(GENERIC_DYNVC_PLUGIN* base) } if (rdpei->event && !rdpei->async) - (void)freerdp_client_channel_unregister(rdpei->rdpcontext->channels, rdpei->event); + freerdp_client_channel_unregister(rdpei->rdpcontext->channels, rdpei->event); if (rdpei->event) (void)CloseHandle(rdpei->event); diff --git a/channels/rdpgfx/client/rdpgfx_main.c b/channels/rdpgfx/client/rdpgfx_main.c index b51d82a4a..e640a6b1f 100644 --- a/channels/rdpgfx/client/rdpgfx_main.c +++ b/channels/rdpgfx/client/rdpgfx_main.c @@ -682,7 +682,8 @@ static UINT rdpgfx_save_persistent_cache(RDPGFX_PLUGIN* gfx) if (context->ExportCacheEntry(context, cacheSlot, &cacheEntry) != CHANNEL_RC_OK) continue; - persistent_cache_write_entry(persistent, &cacheEntry); + if (persistent_cache_write_entry(persistent, &cacheEntry) < 0) + goto fail; } } diff --git a/channels/rdpsnd/server/rdpsnd_main.c b/channels/rdpsnd/server/rdpsnd_main.c index 0bbd64986..fa8b285a8 100644 --- a/channels/rdpsnd/server/rdpsnd_main.c +++ b/channels/rdpsnd/server/rdpsnd_main.c @@ -414,7 +414,8 @@ static UINT rdpsnd_server_select_format(RdpsndServerContext* context, UINT16 cli context->priv->out_buffer_size = out_buffer_size; } - freerdp_dsp_context_reset(context->priv->dsp_context, format, 0u); + if (!freerdp_dsp_context_reset(context->priv->dsp_context, format, 0u)) + error = ERROR_INTERNAL_ERROR; out: LeaveCriticalSection(&context->priv->lock); return error; diff --git a/client/SDL/SDL2/dialogs/sdl_connection_dialog.cpp b/client/SDL/SDL2/dialogs/sdl_connection_dialog.cpp index 476287c93..9ae26fe0e 100644 --- a/client/SDL/SDL2/dialogs/sdl_connection_dialog.cpp +++ b/client/SDL/SDL2/dialogs/sdl_connection_dialog.cpp @@ -233,7 +233,7 @@ bool SDLConnectionDialog::handle(const SDL_Event& event) case SDLK_KP_ENTER: if (event.type == SDL_KEYUP) { - freerdp_abort_event(_context); + freerdp_abort_connect_context(_context); sdl_push_quit(); } break; @@ -269,7 +269,7 @@ bool SDLConnectionDialog::handle(const SDL_Event& event) { if (event.type == SDL_MOUSEBUTTONUP) { - freerdp_abort_event(_context); + freerdp_abort_connect_context(_context); sdl_push_quit(); } } @@ -306,7 +306,7 @@ bool SDLConnectionDialog::handle(const SDL_Event& event) case SDL_WINDOWEVENT_CLOSE: if (windowID == ev.windowID) { - freerdp_abort_event(_context); + freerdp_abort_connect_context(_context); sdl_push_quit(); } break; diff --git a/client/SDL/SDL2/sdl_disp.cpp b/client/SDL/SDL2/sdl_disp.cpp index ee022aead..6bc51f328 100644 --- a/client/SDL/SDL2/sdl_disp.cpp +++ b/client/SDL/SDL2/sdl_disp.cpp @@ -354,15 +354,13 @@ BOOL sdlDispContext::handle_window_event(const SDL_WindowEvent* ev) { case SDL_WINDOWEVENT_HIDDEN: case SDL_WINDOWEVENT_MINIMIZED: - gdi_send_suppress_output(_sdl->context()->gdi, TRUE); - return TRUE; + return gdi_send_suppress_output(_sdl->context()->gdi, TRUE); case SDL_WINDOWEVENT_EXPOSED: case SDL_WINDOWEVENT_SHOWN: case SDL_WINDOWEVENT_MAXIMIZED: case SDL_WINDOWEVENT_RESTORED: - gdi_send_suppress_output(_sdl->context()->gdi, FALSE); - return TRUE; + return gdi_send_suppress_output(_sdl->context()->gdi, FALSE); case SDL_WINDOWEVENT_RESIZED: case SDL_WINDOWEVENT_SIZE_CHANGED: diff --git a/client/SDL/SDL2/sdl_freerdp.cpp b/client/SDL/SDL2/sdl_freerdp.cpp index f0b08176f..35cb7bb8c 100644 --- a/client/SDL/SDL2/sdl_freerdp.cpp +++ b/client/SDL/SDL2/sdl_freerdp.cpp @@ -846,7 +846,8 @@ static int sdl_run(SdlContext* sdl) SDL_SetHint(SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR, "0"); #endif - freerdp_add_signal_cleanup_handler(sdl->context(), sdl_term_handler); + if (!freerdp_add_signal_cleanup_handler(sdl->context(), sdl_term_handler)) + return -1; sdl->initialized.set(); diff --git a/client/SDL/SDL3/dialogs/sdl_connection_dialog.cpp b/client/SDL/SDL3/dialogs/sdl_connection_dialog.cpp index ffc2edd91..2ac984aab 100644 --- a/client/SDL/SDL3/dialogs/sdl_connection_dialog.cpp +++ b/client/SDL/SDL3/dialogs/sdl_connection_dialog.cpp @@ -206,7 +206,7 @@ bool SDLConnectionDialog::handle(const SDL_Event& event) case SDLK_KP_ENTER: if (event.type == SDL_EVENT_KEY_UP) { - freerdp_abort_event(_context); + freerdp_abort_connect_context(_context); std::ignore = sdl_push_quit(); } break; @@ -245,7 +245,7 @@ bool SDLConnectionDialog::handle(const SDL_Event& event) { if (event.type == SDL_EVENT_MOUSE_BUTTON_UP) { - freerdp_abort_event(_context); + freerdp_abort_connect_context(_context); std::ignore = sdl_push_quit(); } } @@ -281,7 +281,7 @@ bool SDLConnectionDialog::handle(const SDL_Event& event) case SDL_EVENT_WINDOW_CLOSE_REQUESTED: if (windowID == ev.windowID) { - freerdp_abort_event(_context); + freerdp_abort_connect_context(_context); std::ignore = sdl_push_quit(); } break; diff --git a/client/Wayland/wlf_cliprdr.c b/client/Wayland/wlf_cliprdr.c index 4fe89fab7..b92402680 100644 --- a/client/Wayland/wlf_cliprdr.c +++ b/client/Wayland/wlf_cliprdr.c @@ -230,7 +230,8 @@ static UINT wlf_cliprdr_send_client_format_list(wfClipboard* clipboard) .formats = clipboard->clientFormats, .common.msgType = CB_FORMAT_LIST }; - cliprdr_file_context_clear(clipboard->file); + if (!cliprdr_file_context_clear(clipboard->file)) + return ERROR_INTERNAL_ERROR; WLog_VRB(TAG, "-------------- client format list [%" PRIu32 "] ------------------", formatList.numFormats); @@ -601,7 +602,8 @@ static UINT wlf_cliprdr_server_format_list(CliprdrClientContext* context, WINPR_ASSERT(clipboard); wlf_cliprdr_free_server_formats(clipboard); - cliprdr_file_context_clear(clipboard->file); + if (!cliprdr_file_context_clear(clipboard->file)) + return ERROR_INTERNAL_ERROR; if (!(clipboard->serverFormats = (CLIPRDR_FORMAT*)calloc(formatList->numFormats, sizeof(CLIPRDR_FORMAT)))) diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index 2f7e2d8c6..802d9273a 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -1371,11 +1371,13 @@ static DWORD WINAPI xf_handle_pipe(void* arg) } void* ctx = WINPR_CAST_CONST_PTR_AWAY(pipe, void*); - freerdp_add_signal_cleanup_handler(ctx, cleanup_pipe); + if (freerdp_add_signal_cleanup_handler(ctx, cleanup_pipe)) + { - xf_process_pipe(context, pipe); + xf_process_pipe(context, pipe); - freerdp_del_signal_cleanup_handler(ctx, cleanup_pipe); + freerdp_del_signal_cleanup_handler(ctx, cleanup_pipe); + } unlink(pipe); return 0; diff --git a/client/X11/xf_cliprdr.c b/client/X11/xf_cliprdr.c index db097e84a..bca37e019 100644 --- a/client/X11/xf_cliprdr.c +++ b/client/X11/xf_cliprdr.c @@ -1906,20 +1906,17 @@ static UINT xf_cliprdr_monitor_ready(CliprdrClientContext* context, static UINT xf_cliprdr_server_capabilities(CliprdrClientContext* context, const CLIPRDR_CAPABILITIES* capabilities) { - const CLIPRDR_GENERAL_CAPABILITY_SET* generalCaps = NULL; - const BYTE* capsPtr = NULL; - xfClipboard* clipboard = NULL; - WINPR_ASSERT(context); WINPR_ASSERT(capabilities); - clipboard = cliprdr_file_context_get_context(context->custom); + xfClipboard* clipboard = cliprdr_file_context_get_context(context->custom); WINPR_ASSERT(clipboard); - capsPtr = (const BYTE*)capabilities->capabilitySets; + const BYTE* capsPtr = (const BYTE*)capabilities->capabilitySets; WINPR_ASSERT(capsPtr); - cliprdr_file_context_remote_set_flags(clipboard->file, 0); + if (!cliprdr_file_context_remote_set_flags(clipboard->file, 0)) + return ERROR_INTERNAL_ERROR; for (UINT32 i = 0; i < capabilities->cCapabilitiesSets; i++) { @@ -1927,9 +1924,11 @@ static UINT xf_cliprdr_server_capabilities(CliprdrClientContext* context, if (caps->capabilitySetType == CB_CAPSTYPE_GENERAL) { - generalCaps = (const CLIPRDR_GENERAL_CAPABILITY_SET*)caps; + const CLIPRDR_GENERAL_CAPABILITY_SET* generalCaps = + (const CLIPRDR_GENERAL_CAPABILITY_SET*)caps; - cliprdr_file_context_remote_set_flags(clipboard->file, generalCaps->generalFlags); + if (!cliprdr_file_context_remote_set_flags(clipboard->file, generalCaps->generalFlags)) + return ERROR_INTERNAL_ERROR; } capsPtr += caps->capabilitySetLength; @@ -2564,7 +2563,8 @@ xfClipboard* xf_clipboard_new(xfContext* xfc, BOOL relieveFilenameRestriction) const UINT32 uid = ClipboardGetFormatId(clipboard->system, mime_uri_list); if (uid) { - cliprdr_file_context_set_locally_available(clipboard->file, TRUE); + if (!cliprdr_file_context_set_locally_available(clipboard->file, TRUE)) + goto fail; clientFormat->atom = Logging_XInternAtom(xfc->log, xfc->display, mime_uri_list, False); clientFormat->localFormat = uid; @@ -2582,7 +2582,8 @@ xfClipboard* xf_clipboard_new(xfContext* xfc, BOOL relieveFilenameRestriction) const UINT32 gid = ClipboardGetFormatId(clipboard->system, mime_gnome_copied_files); if (gid != 0) { - cliprdr_file_context_set_locally_available(clipboard->file, TRUE); + if (!cliprdr_file_context_set_locally_available(clipboard->file, TRUE)) + goto fail; clientFormat->atom = Logging_XInternAtom(xfc->log, xfc->display, mime_gnome_copied_files, False); clientFormat->localFormat = gid; @@ -2600,7 +2601,8 @@ xfClipboard* xf_clipboard_new(xfContext* xfc, BOOL relieveFilenameRestriction) const UINT32 mid = ClipboardGetFormatId(clipboard->system, mime_mate_copied_files); if (mid != 0) { - cliprdr_file_context_set_locally_available(clipboard->file, TRUE); + if (!cliprdr_file_context_set_locally_available(clipboard->file, TRUE)) + goto fail; clientFormat->atom = Logging_XInternAtom(xfc->log, xfc->display, mime_mate_copied_files, False); clientFormat->localFormat = mid; diff --git a/client/X11/xf_event.c b/client/X11/xf_event.c index 9cc554cbc..0a7dc80c1 100644 --- a/client/X11/xf_event.c +++ b/client/X11/xf_event.c @@ -946,7 +946,10 @@ static BOOL xf_event_MapNotify(xfContext* xfc, const XMapEvent* event, BOOL app) { WINPR_ASSERT(xfc); if (!app) - gdi_send_suppress_output(xfc->common.context.gdi, FALSE); + { + if (!gdi_send_suppress_output(xfc->common.context.gdi, FALSE)) + return FALSE; + } else { xfAppWindow* appWindow = xf_AppWindowFromX11Window(xfc, event->window); diff --git a/client/X11/xf_gfx.c b/client/X11/xf_gfx.c index ffec6818f..f0c4ae742 100644 --- a/client/X11/xf_gfx.c +++ b/client/X11/xf_gfx.c @@ -63,8 +63,9 @@ static UINT xf_OutputUpdate(xfContext* xfc, xfGfxSurface* surface) LogDynAndXSetClipMask(xfc->log, xfc->display, xfc->gc, None); LogDynAndXSetFunction(xfc->log, xfc->display, xfc->gc, GXcopy); LogDynAndXSetFillStyle(xfc->log, xfc->display, xfc->gc, FillSolid); - region16_intersect_rect(&(surface->gdi.invalidRegion), &(surface->gdi.invalidRegion), - &surfaceRect); + if (!region16_intersect_rect(&(surface->gdi.invalidRegion), &(surface->gdi.invalidRegion), + &surfaceRect)) + return ERROR_INTERNAL_ERROR; WINPR_ASSERT(surface->gdi.mappedWidth); WINPR_ASSERT(surface->gdi.mappedHeight); @@ -246,8 +247,14 @@ UINT xf_OutputExpose(xfContext* xfc, UINT32 x, UINT32 y, UINT32 width, UINT32 he intersection.top -= surfaceRect.top; intersection.right -= surfaceRect.left; intersection.bottom -= surfaceRect.top; - region16_union_rect(&surface->gdi.invalidRegion, &surface->gdi.invalidRegion, - &intersection); + if (!region16_union_rect(&surface->gdi.invalidRegion, &surface->gdi.invalidRegion, + &intersection)) + { + free(pSurfaceIds); + LeaveCriticalSection(&context->mux); + + goto fail; + } } } diff --git a/client/X11/xf_keyboard.c b/client/X11/xf_keyboard.c index 32886f063..3bee3152a 100644 --- a/client/X11/xf_keyboard.c +++ b/client/X11/xf_keyboard.c @@ -681,7 +681,7 @@ void xf_keyboard_send_key(xfContext* xfc, BOOL down, BOOL repeat, const XKeyEven */ if (down) { - (void)freerdp_input_send_keyboard_pause_event(input); + freerdp_input_send_keyboard_pause_event(input); } } else @@ -731,7 +731,7 @@ void xf_keyboard_send_key(xfContext* xfc, BOOL down, BOOL repeat, const XKeyEven if (rdp_scancode == RDP_SCANCODE_UNKNOWN) WLog_ERR(TAG, "Unknown key with X keycode 0x%02" PRIx8 "", event->keycode); else - (void)freerdp_input_send_keyboard_event_ex(input, down, repeat, rdp_scancode); + freerdp_input_send_keyboard_event_ex(input, down, repeat, rdp_scancode); } else { @@ -741,14 +741,14 @@ void xf_keyboard_send_key(xfContext* xfc, BOOL down, BOOL repeat, const XKeyEven WCHAR wbuffer[ARRAYSIZE(buffer)] = { 0 }; (void)ConvertUtf8ToWChar(str, wbuffer, rc); - (void)freerdp_input_send_unicode_keyboard_event(input, down ? 0 : KBD_FLAGS_RELEASE, - wbuffer[0]); + freerdp_input_send_unicode_keyboard_event(input, down ? 0 : KBD_FLAGS_RELEASE, + wbuffer[0]); } } else if (rdp_scancode == RDP_SCANCODE_UNKNOWN) WLog_ERR(TAG, "Unknown key with X keycode 0x%02" PRIx8 "", event->keycode); else - (void)freerdp_input_send_keyboard_event_ex(input, down, repeat, rdp_scancode); + freerdp_input_send_keyboard_event_ex(input, down, repeat, rdp_scancode); } } diff --git a/client/X11/xf_rail.c b/client/X11/xf_rail.c index 05d043387..462b13fbb 100644 --- a/client/X11/xf_rail.c +++ b/client/X11/xf_rail.c @@ -308,8 +308,10 @@ BOOL xf_rail_paint_surface(xfContext* xfc, UINT64 windowId, const RECTANGLE_16* REGION16 windowInvalidRegion = { 0 }; region16_init(&windowInvalidRegion); - region16_union_rect(&windowInvalidRegion, &windowInvalidRegion, &windowRect); - region16_intersect_rect(&windowInvalidRegion, &windowInvalidRegion, rect); + if (!region16_union_rect(&windowInvalidRegion, &windowInvalidRegion, &windowRect)) + return FALSE; + if (!region16_intersect_rect(&windowInvalidRegion, &windowInvalidRegion, rect)) + return FALSE; if (!region16_is_empty(&windowInvalidRegion)) { diff --git a/client/common/client.c b/client/common/client.c index d1410698a..9f491de36 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -988,7 +988,6 @@ BOOL client_cli_present_gateway_message(freerdp* instance, UINT32 type, BOOL isD BOOL isConsentMandatory, size_t length, const WCHAR* message) { - int answer = 0; const char* msgType = (type == GATEWAY_MESSAGE_CONSENT) ? "Consent message" : "Service message"; WINPR_ASSERT(instance); @@ -1018,7 +1017,7 @@ BOOL client_cli_present_gateway_message(freerdp* instance, UINT32 type, BOOL isD { printf("I understand and agree to the terms of this policy (Y/N) \n"); (void)fflush(stdout); - answer = freerdp_interruptible_getc(instance->context, stdin); + const int answer = freerdp_interruptible_getc(instance->context, stdin); if ((answer == EOF) || feof(stdin)) { @@ -1026,18 +1025,17 @@ BOOL client_cli_present_gateway_message(freerdp* instance, UINT32 type, BOOL isD return FALSE; } + const int confirm = freerdp_interruptible_getc(instance->context, stdin); switch (answer) { case 'y': case 'Y': - answer = freerdp_interruptible_getc(instance->context, stdin); - if (answer == EOF) + if (confirm == EOF) return FALSE; return TRUE; case 'n': case 'N': - (void)freerdp_interruptible_getc(instance->context, stdin); return FALSE; default: diff --git a/client/common/client_cliprdr_file.c b/client/common/client_cliprdr_file.c index e0da0812e..b594bc0ec 100644 --- a/client/common/client_cliprdr_file.c +++ b/client/common/client_cliprdr_file.c @@ -1184,13 +1184,15 @@ static DWORD WINAPI cliprdr_file_fuse_thread(LPVOID arg) if (file->fuse_sess != NULL) { - freerdp_add_signal_cleanup_handler(file, fuse_abort); - if (0 == fuse_session_mount(file->fuse_sess, file->path)) + if (freerdp_add_signal_cleanup_handler(file, fuse_abort)) { - fuse_session_loop(file->fuse_sess); - fuse_session_unmount(file->fuse_sess); + if (0 == fuse_session_mount(file->fuse_sess, file->path)) + { + fuse_session_loop(file->fuse_sess); + fuse_session_unmount(file->fuse_sess); + } + freerdp_del_signal_cleanup_handler(file, fuse_abort); } - freerdp_del_signal_cleanup_handler(file, fuse_abort); WLog_Print(file->log, WLOG_DEBUG, "Waiting for FUSE stop sync"); if (WaitForSingleObject(file->fuse_stop_sync, INFINITE) == WAIT_FAILED) diff --git a/libfreerdp/codec/progressive.c b/libfreerdp/codec/progressive.c index 3cb6ee199..1f9cf3434 100644 --- a/libfreerdp/codec/progressive.c +++ b/libfreerdp/codec/progressive.c @@ -784,14 +784,14 @@ static inline int progressive_rfx_dwt_2d_decode(PROGRESSIVE_CONTEXT* WINPR_RESTR return 1; } -static inline void progressive_rfx_decode_block(const primitives_t* prims, +static inline BOOL progressive_rfx_decode_block(const primitives_t* prims, INT16* WINPR_RESTRICT buffer, UINT32 length, UINT32 shift) { - if (!shift) - return; + if (shift == 0) + return TRUE; - (void)prims->lShiftC_16s_inplace(buffer, shift, length); + return prims->lShiftC_16s_inplace(buffer, shift, length) == PRIMITIVES_SUCCESS; } static inline int @@ -814,30 +814,50 @@ progressive_rfx_decode_component(PROGRESSIVE_CONTEXT* WINPR_RESTRICT progressive if (!extrapolate) { rfx_differential_decode(buffer + 4032, 64); - progressive_rfx_decode_block(prims, &buffer[0], 1024, shift->HL1); /* HL1 */ - progressive_rfx_decode_block(prims, &buffer[1024], 1024, shift->LH1); /* LH1 */ - progressive_rfx_decode_block(prims, &buffer[2048], 1024, shift->HH1); /* HH1 */ - progressive_rfx_decode_block(prims, &buffer[3072], 256, shift->HL2); /* HL2 */ - progressive_rfx_decode_block(prims, &buffer[3328], 256, shift->LH2); /* LH2 */ - progressive_rfx_decode_block(prims, &buffer[3584], 256, shift->HH2); /* HH2 */ - progressive_rfx_decode_block(prims, &buffer[3840], 64, shift->HL3); /* HL3 */ - progressive_rfx_decode_block(prims, &buffer[3904], 64, shift->LH3); /* LH3 */ - progressive_rfx_decode_block(prims, &buffer[3968], 64, shift->HH3); /* HH3 */ - progressive_rfx_decode_block(prims, &buffer[4032], 64, shift->LL3); /* LL3 */ + if (!progressive_rfx_decode_block(prims, &buffer[0], 1024, shift->HL1)) /* HL1 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[1024], 1024, shift->LH1)) /* LH1 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[2048], 1024, shift->HH1)) /* HH1 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[3072], 256, shift->HL2)) /* HL2 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[3328], 256, shift->LH2)) /* LH2 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[3584], 256, shift->HH2)) /* HH2 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[3840], 64, shift->HL3)) /* HL3 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[3904], 64, shift->LH3)) /* LH3 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[3968], 64, shift->HH3)) /* HH3 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[4032], 64, shift->LL3)) /* LL3 */ + return -1; } else { - progressive_rfx_decode_block(prims, &buffer[0], 1023, shift->HL1); /* HL1 */ - progressive_rfx_decode_block(prims, &buffer[1023], 1023, shift->LH1); /* LH1 */ - progressive_rfx_decode_block(prims, &buffer[2046], 961, shift->HH1); /* HH1 */ - progressive_rfx_decode_block(prims, &buffer[3007], 272, shift->HL2); /* HL2 */ - progressive_rfx_decode_block(prims, &buffer[3279], 272, shift->LH2); /* LH2 */ - progressive_rfx_decode_block(prims, &buffer[3551], 256, shift->HH2); /* HH2 */ - progressive_rfx_decode_block(prims, &buffer[3807], 72, shift->HL3); /* HL3 */ - progressive_rfx_decode_block(prims, &buffer[3879], 72, shift->LH3); /* LH3 */ - progressive_rfx_decode_block(prims, &buffer[3951], 64, shift->HH3); /* HH3 */ + if (!progressive_rfx_decode_block(prims, &buffer[0], 1023, shift->HL1)) /* HL1 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[1023], 1023, shift->LH1)) /* LH1 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[2046], 961, shift->HH1)) /* HH1 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[3007], 272, shift->HL2)) /* HL2 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[3279], 272, shift->LH2)) /* LH2 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[3551], 256, shift->HH2)) /* HH2 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[3807], 72, shift->HL3)) /* HL3 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[3879], 72, shift->LH3)) /* LH3 */ + return -1; + if (!progressive_rfx_decode_block(prims, &buffer[3951], 64, shift->HH3)) /* HH3 */ + return -1; rfx_differential_decode(&buffer[4015], 81); /* LL3 */ - progressive_rfx_decode_block(prims, &buffer[4015], 81, shift->LL3); /* LL3 */ + if (!progressive_rfx_decode_block(prims, &buffer[4015], 81, shift->LL3)) /* LL3 */ + return -1; } return progressive_rfx_dwt_2d_decode(progressive, buffer, current, coeffDiff, extrapolate, FALSE); @@ -2273,7 +2293,11 @@ static inline BOOL update_tiles(PROGRESSIVE_CONTEXT* WINPR_RESTRICT progressive, clippingRect.top = (UINT16)nYDst + rect->y; clippingRect.right = clippingRect.left + rect->width; clippingRect.bottom = clippingRect.top + rect->height; - region16_union_rect(&clippingRects, &clippingRects, &clippingRect); + if (!region16_union_rect(&clippingRects, &clippingRects, &clippingRect)) + { + region16_uninit(&clippingRects); + return FALSE; + } } for (UINT32 i = 0; i < surface->numUpdatedTiles; i++) @@ -2299,7 +2323,11 @@ static inline BOOL update_tiles(PROGRESSIVE_CONTEXT* WINPR_RESTRICT progressive, REGION16 updateRegion = { 0 }; region16_init(&updateRegion); - region16_intersect_rect(&updateRegion, &clippingRects, &updateRect); + if (!region16_intersect_rect(&updateRegion, &clippingRects, &updateRect)) + { + region16_uninit(&updateRegion); + goto fail; + } updateRects = region16_rects(&updateRegion, &nbUpdateRects); for (UINT32 j = 0; j < nbUpdateRects; j++) @@ -2324,7 +2352,13 @@ static inline BOOL update_tiles(PROGRESSIVE_CONTEXT* WINPR_RESTRICT progressive, break; if (invalidRegion) - region16_union_rect(invalidRegion, invalidRegion, rect); + { + if (!region16_union_rect(invalidRegion, invalidRegion, rect)) + { + region16_uninit(&updateRegion); + goto fail; + } + } } region16_uninit(&updateRegion); diff --git a/libfreerdp/codec/rfx.c b/libfreerdp/codec/rfx.c index ad45633fd..da1c188bb 100644 --- a/libfreerdp/codec/rfx.c +++ b/libfreerdp/codec/rfx.c @@ -293,7 +293,8 @@ RFX_CONTEXT* rfx_context_new_ex(BOOL encoder, UINT32 ThreadingFlags) /* Call primitives_get here in order to avoid race conditions when using primitives_get */ /* from multiple threads. This call will initialize all function pointers correctly */ /* before any decoding threads are started */ - primitives_get(); + if (!primitives_get()) + goto fail; } /* initialize the default pixel format */ @@ -1289,7 +1290,12 @@ BOOL rfx_process_message(RFX_CONTEXT* WINPR_RESTRICT context, const BYTE* WINPR_ const uint16_t bottom = WINPR_ASSERTING_INT_CAST(UINT16, MIN(rh, dstHeight)); clippingRect.right = right; clippingRect.bottom = bottom; - region16_union_rect(&clippingRects, &clippingRects, &clippingRect); + if (!region16_union_rect(&clippingRects, &clippingRects, &clippingRect)) + { + region16_uninit(&updateRegion); + region16_uninit(&clippingRects); + return FALSE; + } } for (UINT32 i = 0; i < message->numTiles; i++) @@ -1305,7 +1311,12 @@ BOOL rfx_process_message(RFX_CONTEXT* WINPR_RESTRICT context, const BYTE* WINPR_ updateRect.right = updateRect.left + 64; updateRect.bottom = updateRect.top + 64; region16_init(&updateRegion); - region16_intersect_rect(&updateRegion, &clippingRects, &updateRect); + if (!region16_intersect_rect(&updateRegion, &clippingRects, &updateRect)) + { + region16_uninit(&updateRegion); + region16_uninit(&clippingRects); + return FALSE; + } updateRects = region16_rects(&updateRegion, &nbUpdateRects); for (UINT32 j = 0; j < nbUpdateRects; j++) @@ -1332,7 +1343,14 @@ BOOL rfx_process_message(RFX_CONTEXT* WINPR_RESTRICT context, const BYTE* WINPR_ } if (invalidRegion) - region16_union_rect(invalidRegion, invalidRegion, cur); + { + if (!region16_union_rect(invalidRegion, invalidRegion, cur)) + { + region16_uninit(&updateRegion); + region16_uninit(&clippingRects); + return FALSE; + } + } } region16_uninit(&updateRegion); diff --git a/libfreerdp/codec/rfx_quantization.c b/libfreerdp/codec/rfx_quantization.c index e4576a6bd..5bfabab17 100644 --- a/libfreerdp/codec/rfx_quantization.c +++ b/libfreerdp/codec/rfx_quantization.c @@ -44,14 +44,14 @@ * LL3 4032 8x8 64 */ -static inline void rfx_quantization_decode_block(const primitives_t* WINPR_RESTRICT prims, +static inline BOOL rfx_quantization_decode_block(const primitives_t* WINPR_RESTRICT prims, INT16* WINPR_RESTRICT buffer, UINT32 buffer_size, UINT32 factor) { if (factor == 0) - return; + return TRUE; - (void)prims->lShiftC_16s_inplace(buffer, factor, buffer_size); + return prims->lShiftC_16s_inplace(buffer, factor, buffer_size) == PRIMITIVES_SUCCESS; } void rfx_quantization_decode(INT16* WINPR_RESTRICT buffer, const UINT32* WINPR_RESTRICT quantVals) diff --git a/libfreerdp/codec/yuv.c b/libfreerdp/codec/yuv.c index 3a1c9a360..6f489d410 100644 --- a/libfreerdp/codec/yuv.c +++ b/libfreerdp/codec/yuv.c @@ -225,14 +225,15 @@ fail: YUV_CONTEXT* yuv_context_new(BOOL encoder, UINT32 ThreadingFlags) { - SYSTEM_INFO sysInfos; + SYSTEM_INFO sysInfos = { 0 }; + /** do it here to avoid a race condition between threads */ + if (!primitives_get()) + return NULL; + YUV_CONTEXT* ret = winpr_aligned_calloc(1, sizeof(*ret), 32); if (!ret) return NULL; - /** do it here to avoid a race condition between threads */ - primitives_get(); - ret->encoder = encoder; if (!(ThreadingFlags & THREADING_FLAGS_DISABLE_THREADS)) { diff --git a/libfreerdp/common/settings.c b/libfreerdp/common/settings.c index 97d423f33..972af94fd 100644 --- a/libfreerdp/common/settings.c +++ b/libfreerdp/common/settings.c @@ -548,14 +548,14 @@ void freerdp_device_collection_free(rdpSettings* settings) if (settings->DeviceArray) { for (UINT32 index = 0; index < settings->DeviceArraySize; index++) - (void)freerdp_settings_set_pointer_array(settings, FreeRDP_DeviceArray, index, NULL); + freerdp_settings_set_pointer_array(settings, FreeRDP_DeviceArray, index, NULL); } free((void*)settings->DeviceArray); - (void)freerdp_settings_set_pointer(settings, FreeRDP_DeviceArray, NULL); - (void)freerdp_settings_set_uint32(settings, FreeRDP_DeviceArraySize, 0); - (void)freerdp_settings_set_uint32(settings, FreeRDP_DeviceCount, 0); + freerdp_settings_set_pointer(settings, FreeRDP_DeviceArray, NULL); + freerdp_settings_set_uint32(settings, FreeRDP_DeviceArraySize, 0); + freerdp_settings_set_uint32(settings, FreeRDP_DeviceCount, 0); } BOOL freerdp_static_channel_collection_del(rdpSettings* settings, const char* name) @@ -659,9 +659,9 @@ void freerdp_static_channel_collection_free(rdpSettings* settings) } free((void*)settings->StaticChannelArray); - (void)freerdp_settings_set_uint32(settings, FreeRDP_StaticChannelArraySize, 0); + freerdp_settings_set_uint32(settings, FreeRDP_StaticChannelArraySize, 0); settings->StaticChannelArray = NULL; - (void)freerdp_settings_set_uint32(settings, FreeRDP_StaticChannelCount, 0); + freerdp_settings_set_uint32(settings, FreeRDP_StaticChannelCount, 0); } BOOL freerdp_dynamic_channel_collection_del(rdpSettings* settings, const char* name) @@ -821,9 +821,9 @@ void freerdp_dynamic_channel_collection_free(rdpSettings* settings) } free((void*)settings->DynamicChannelArray); - (void)freerdp_settings_set_uint32(settings, FreeRDP_DynamicChannelArraySize, 0); + freerdp_settings_set_uint32(settings, FreeRDP_DynamicChannelArraySize, 0); settings->DynamicChannelArray = NULL; - (void)freerdp_settings_set_uint32(settings, FreeRDP_DynamicChannelCount, 0); + freerdp_settings_set_uint32(settings, FreeRDP_DynamicChannelCount, 0); } static void freerdp_capability_data_free(rdpSettings* settings, size_t offset, BOOL full) @@ -1082,41 +1082,37 @@ void freerdp_performance_flags_make(rdpSettings* settings) if (freerdp_settings_get_bool(settings, FreeRDP_DisableThemes)) PerformanceFlags |= PERF_DISABLE_THEMING; - (void)freerdp_settings_set_uint32(settings, FreeRDP_PerformanceFlags, PerformanceFlags); + freerdp_settings_set_uint32(settings, FreeRDP_PerformanceFlags, PerformanceFlags); } void freerdp_performance_flags_split(rdpSettings* settings) { - (void)freerdp_settings_set_bool( - settings, FreeRDP_AllowFontSmoothing, - (freerdp_settings_get_uint32(settings, FreeRDP_PerformanceFlags) & - PERF_ENABLE_FONT_SMOOTHING) - ? TRUE - : FALSE); - (void)freerdp_settings_set_bool( - settings, FreeRDP_AllowDesktopComposition, - (freerdp_settings_get_uint32(settings, FreeRDP_PerformanceFlags) & - PERF_ENABLE_DESKTOP_COMPOSITION) - ? TRUE - : FALSE); - (void)freerdp_settings_set_bool( + freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, + (freerdp_settings_get_uint32(settings, FreeRDP_PerformanceFlags) & + PERF_ENABLE_FONT_SMOOTHING) + ? TRUE + : FALSE); + freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, + (freerdp_settings_get_uint32(settings, FreeRDP_PerformanceFlags) & + PERF_ENABLE_DESKTOP_COMPOSITION) + ? TRUE + : FALSE); + freerdp_settings_set_bool( settings, FreeRDP_DisableWallpaper, (freerdp_settings_get_uint32(settings, FreeRDP_PerformanceFlags) & PERF_DISABLE_WALLPAPER) ? TRUE : FALSE); - (void)freerdp_settings_set_bool( - settings, FreeRDP_DisableFullWindowDrag, - (freerdp_settings_get_uint32(settings, FreeRDP_PerformanceFlags) & - PERF_DISABLE_FULLWINDOWDRAG) - ? TRUE - : FALSE); - (void)freerdp_settings_set_bool( - settings, FreeRDP_DisableMenuAnims, - (freerdp_settings_get_uint32(settings, FreeRDP_PerformanceFlags) & - PERF_DISABLE_MENUANIMATIONS) - ? TRUE - : FALSE); - (void)freerdp_settings_set_bool( + freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, + (freerdp_settings_get_uint32(settings, FreeRDP_PerformanceFlags) & + PERF_DISABLE_FULLWINDOWDRAG) + ? TRUE + : FALSE); + freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, + (freerdp_settings_get_uint32(settings, FreeRDP_PerformanceFlags) & + PERF_DISABLE_MENUANIMATIONS) + ? TRUE + : FALSE); + freerdp_settings_set_bool( settings, FreeRDP_DisableThemes, (freerdp_settings_get_uint32(settings, FreeRDP_PerformanceFlags) & PERF_DISABLE_THEMING) ? TRUE diff --git a/libfreerdp/common/settings_str.c b/libfreerdp/common/settings_str.c index fff968166..1017077e5 100644 --- a/libfreerdp/common/settings_str.c +++ b/libfreerdp/common/settings_str.c @@ -335,12 +335,12 @@ void freerdp_settings_free_keys(rdpSettings* dst, BOOL cleanup) switch (cur->type) { case FREERDP_SETTINGS_TYPE_STRING: /* strings */ - (void)freerdp_settings_set_string_copy_(dst, (FreeRDP_Settings_Keys_String)cur->id, - NULL, 0, cleanup); + freerdp_settings_set_string_copy_(dst, (FreeRDP_Settings_Keys_String)cur->id, NULL, + 0, cleanup); break; case FREERDP_SETTINGS_TYPE_POINTER: /* pointer */ - (void)freerdp_settings_set_pointer_len(dst, (FreeRDP_Settings_Keys_Pointer)cur->id, - NULL, 0); + freerdp_settings_set_pointer_len(dst, (FreeRDP_Settings_Keys_Pointer)cur->id, NULL, + 0); break; default: break; diff --git a/libfreerdp/core/client.c b/libfreerdp/core/client.c index 510008a63..e27a27431 100644 --- a/libfreerdp/core/client.c +++ b/libfreerdp/core/client.c @@ -864,7 +864,7 @@ UINT freerdp_channels_disconnect(rdpChannels* channels, freerdp* instance) if (!channels->connected) return 0; - (void)freerdp_channels_check_fds(channels, instance); + freerdp_channels_check_fds(channels, instance); /* tell all libraries we are shutting down */ for (int index = 0; index < channels->clientDataCount; index++) @@ -894,7 +894,7 @@ UINT freerdp_channels_disconnect(rdpChannels* channels, freerdp* instance) channels->connected = FALSE; /* Flush pending messages */ - (void)freerdp_channels_check_fds(channels, instance); + freerdp_channels_check_fds(channels, instance); return error; } @@ -907,7 +907,7 @@ void freerdp_channels_close(rdpChannels* channels, freerdp* instance) WINPR_ASSERT(instance); MessageQueue_PostQuit(channels->queue, 0); - (void)freerdp_channels_check_fds(channels, instance); + freerdp_channels_check_fds(channels, instance); /* tell all libraries we are shutting down */ for (int index = 0; index < channels->clientDataCount; index++) diff --git a/libfreerdp/core/freerdp.c b/libfreerdp/core/freerdp.c index c1a90f991..7cd87be3f 100644 --- a/libfreerdp/core/freerdp.c +++ b/libfreerdp/core/freerdp.c @@ -113,7 +113,8 @@ static int freerdp_connect_begin(freerdp* instance) if (!freerdp_settings_set_default_order_support(settings)) return -1; - freerdp_add_signal_cleanup_handler(instance->context, sig_abort_connect); + if (!freerdp_add_signal_cleanup_handler(instance->context, sig_abort_connect)) + return -1; IFCALLRET(instance->PreConnect, status, instance); instance->ConnectionCallbackState = CLIENT_STATE_PRECONNECT_PASSED; diff --git a/libfreerdp/core/gcc.c b/libfreerdp/core/gcc.c index 530253769..d6c716ce0 100644 --- a/libfreerdp/core/gcc.c +++ b/libfreerdp/core/gcc.c @@ -1791,8 +1791,8 @@ BOOL gcc_read_server_security_data(wStream* s, rdpMcs* mcs) } return TRUE; fail: - (void)freerdp_settings_set_pointer_len(settings, FreeRDP_ServerRandom, NULL, 0); - (void)freerdp_settings_set_pointer_len(settings, FreeRDP_ServerCertificate, NULL, 0); + freerdp_settings_set_pointer_len(settings, FreeRDP_ServerRandom, NULL, 0); + freerdp_settings_set_pointer_len(settings, FreeRDP_ServerCertificate, NULL, 0); return FALSE; } diff --git a/libfreerdp/core/info.c b/libfreerdp/core/info.c index b4e18ce3f..557c644e5 100644 --- a/libfreerdp/core/info.c +++ b/libfreerdp/core/info.c @@ -644,7 +644,7 @@ static BOOL rdp_read_info_string(rdpSettings* settings, FreeRDP_Settings_Keys_St if (terminator.w != L'\0') { WLog_ERR(TAG, "protocol error: Domain must be null terminated"); - (void)freerdp_settings_set_string(settings, id, NULL); + freerdp_settings_set_string(settings, id, NULL); return FALSE; } diff --git a/libfreerdp/core/mcs.c b/libfreerdp/core/mcs.c index cd13ef0ae..8ecebf16b 100644 --- a/libfreerdp/core/mcs.c +++ b/libfreerdp/core/mcs.c @@ -449,13 +449,13 @@ static BOOL mcs_read_domain_parameters(wStream* s, DomainParameters* domainParam static BOOL mcs_write_domain_parameters(wLog* log, wStream* s, DomainParameters* domainParameters) { + BOOL rc = FALSE; size_t length = 0; - wStream* tmps = NULL; if (!s || !domainParameters) return FALSE; - tmps = Stream_New(NULL, Stream_Capacity(s)); + wStream* tmps = Stream_New(NULL, Stream_Capacity(s)); if (!tmps) { @@ -463,19 +463,31 @@ static BOOL mcs_write_domain_parameters(wLog* log, wStream* s, DomainParameters* return FALSE; } - ber_write_integer(tmps, domainParameters->maxChannelIds); - ber_write_integer(tmps, domainParameters->maxUserIds); - ber_write_integer(tmps, domainParameters->maxTokenIds); - ber_write_integer(tmps, domainParameters->numPriorities); - ber_write_integer(tmps, domainParameters->minThroughput); - ber_write_integer(tmps, domainParameters->maxHeight); - ber_write_integer(tmps, domainParameters->maxMCSPDUsize); - ber_write_integer(tmps, domainParameters->protocolVersion); + if (!ber_write_integer(tmps, domainParameters->maxChannelIds)) + goto fail; + if (!ber_write_integer(tmps, domainParameters->maxUserIds)) + goto fail; + if (!ber_write_integer(tmps, domainParameters->maxTokenIds)) + goto fail; + if (!ber_write_integer(tmps, domainParameters->numPriorities)) + goto fail; + if (!ber_write_integer(tmps, domainParameters->minThroughput)) + goto fail; + if (!ber_write_integer(tmps, domainParameters->maxHeight)) + goto fail; + if (!ber_write_integer(tmps, domainParameters->maxMCSPDUsize)) + goto fail; + if (!ber_write_integer(tmps, domainParameters->protocolVersion)) + goto fail; length = Stream_GetPosition(tmps); - ber_write_sequence_tag(s, length); + if (!ber_write_sequence_tag(s, length)) + goto fail; Stream_Write(s, Stream_Buffer(tmps), length); + + rc = TRUE; +fail: Stream_Free(tmps, TRUE); - return TRUE; + return rc; } #ifdef DEBUG_MCS @@ -738,9 +750,11 @@ BOOL mcs_write_connect_initial(wStream* s, rdpMcs* mcs, wStream* userData) } /* callingDomainSelector (OCTET_STRING) */ - ber_write_octet_string(tmps, callingDomainSelector, sizeof(callingDomainSelector)); + if (!ber_write_octet_string(tmps, callingDomainSelector, sizeof(callingDomainSelector))) + goto out; /* calledDomainSelector (OCTET_STRING) */ - ber_write_octet_string(tmps, calledDomainSelector, sizeof(calledDomainSelector)); + if (!ber_write_octet_string(tmps, calledDomainSelector, sizeof(calledDomainSelector))) + goto out; /* upwardFlag (BOOLEAN) */ ber_write_BOOL(tmps, TRUE); @@ -757,7 +771,8 @@ BOOL mcs_write_connect_initial(wStream* s, rdpMcs* mcs, wStream* userData) goto out; /* userData (OCTET_STRING) */ - ber_write_octet_string(tmps, Stream_Buffer(userData), Stream_GetPosition(userData)); + if (!ber_write_octet_string(tmps, Stream_Buffer(userData), Stream_GetPosition(userData))) + goto out; length = Stream_GetPosition(tmps); /* Connect-Initial (APPLICATION 101, IMPLICIT SEQUENCE) */ ber_write_application_tag(s, MCS_TYPE_CONNECT_INITIAL, length); @@ -796,13 +811,15 @@ BOOL mcs_write_connect_response(wStream* s, rdpMcs* mcs, wStream* userData) } ber_write_enumerated(tmps, 0, MCS_Result_enum_length); - ber_write_integer(tmps, 0); /* calledConnectId */ + if (!ber_write_integer(tmps, 0)) /* calledConnectId */ + goto out; if (!mcs_write_domain_parameters(mcs->log, tmps, &(mcs->domainParameters))) goto out; /* userData (OCTET_STRING) */ - ber_write_octet_string(tmps, Stream_Buffer(userData), Stream_GetPosition(userData)); + if (!ber_write_octet_string(tmps, Stream_Buffer(userData), Stream_GetPosition(userData))) + goto out; length = Stream_GetPosition(tmps); ber_write_application_tag(s, MCS_TYPE_CONNECT_RESPONSE, length); Stream_Write(s, Stream_Buffer(tmps), length); @@ -1048,6 +1065,7 @@ BOOL mcs_recv_erect_domain_request(rdpMcs* mcs, wStream* s) BOOL mcs_send_erect_domain_request(rdpMcs* mcs) { + int status = -1; UINT16 length = 12; if (!mcs) @@ -1062,12 +1080,15 @@ BOOL mcs_send_erect_domain_request(rdpMcs* mcs) } mcs_write_domain_mcspdu_header(s, DomainMCSPDU_ErectDomainRequest, length, 0); - per_write_integer(s, 0); /* subHeight (INTEGER) */ - per_write_integer(s, 0); /* subInterval (INTEGER) */ + if (!per_write_integer(s, 0)) /* subHeight (INTEGER) */ + goto out; + if (!per_write_integer(s, 0)) /* subInterval (INTEGER) */ + goto out; Stream_SealLength(s); rdpTransport* transport = freerdp_get_transport(mcs->context); - const int status = transport_write(transport, s); + status = transport_write(transport, s); +out: Stream_Free(s, TRUE); return (status < 0) ? FALSE : TRUE; } @@ -1152,6 +1173,7 @@ BOOL mcs_recv_attach_user_confirm(rdpMcs* mcs, wStream* s) BOOL mcs_send_attach_user_confirm(rdpMcs* mcs) { + int status = -1; UINT16 length = 11; if (!mcs) @@ -1166,13 +1188,17 @@ BOOL mcs_send_attach_user_confirm(rdpMcs* mcs) } mcs->userId = mcs->baseChannelId++; - mcs_write_domain_mcspdu_header(s, DomainMCSPDU_AttachUserConfirm, length, 2); - per_write_enumerated(s, 0, MCS_Result_enum_length); /* result */ - per_write_integer16(s, mcs->userId, MCS_BASE_CHANNEL_ID); /* initiator (UserId) */ + if (!mcs_write_domain_mcspdu_header(s, DomainMCSPDU_AttachUserConfirm, length, 2)) + goto out; + if (!per_write_enumerated(s, 0, MCS_Result_enum_length)) /* result */ + goto out; + if (!per_write_integer16(s, mcs->userId, MCS_BASE_CHANNEL_ID)) /* initiator (UserId) */ + goto out; Stream_SealLength(s); rdpTransport* transport = freerdp_get_transport(mcs->context); - const int status = transport_write(transport, s); + status = transport_write(transport, s); +out: Stream_Free(s, TRUE); return (status < 0) ? FALSE : TRUE; } @@ -1223,6 +1249,7 @@ BOOL mcs_recv_channel_join_request(rdpMcs* mcs, const rdpSettings* settings, wSt BOOL mcs_send_channel_join_request(rdpMcs* mcs, UINT16 channelId) { + int status = -1; UINT16 length = 12; WINPR_ASSERT(mcs); @@ -1235,13 +1262,18 @@ BOOL mcs_send_channel_join_request(rdpMcs* mcs, UINT16 channelId) return FALSE; } - mcs_write_domain_mcspdu_header(s, DomainMCSPDU_ChannelJoinRequest, length, 0); - per_write_integer16(s, mcs->userId, MCS_BASE_CHANNEL_ID); - per_write_integer16(s, channelId, 0); + if (!mcs_write_domain_mcspdu_header(s, DomainMCSPDU_ChannelJoinRequest, length, 0)) + goto out; + if (!per_write_integer16(s, mcs->userId, MCS_BASE_CHANNEL_ID)) + goto out; + if (!per_write_integer16(s, channelId, 0)) + goto out; Stream_SealLength(s); rdpTransport* transport = freerdp_get_transport(mcs->context); - const int status = transport_write(transport, s); + status = transport_write(transport, s); + +out: Stream_Free(s, TRUE); return (status < 0) ? FALSE : TRUE; } diff --git a/libfreerdp/core/utils.c b/libfreerdp/core/utils.c index 78f3ca5f1..130e55575 100644 --- a/libfreerdp/core/utils.c +++ b/libfreerdp/core/utils.c @@ -328,14 +328,16 @@ const char* utils_is_vsock(const char* hostname) static BOOL remove_rdpdr_type(rdpSettings* settings, UINT32 type) { + BOOL rc = TRUE; RDPDR_DEVICE* printer = NULL; do { printer = freerdp_device_collection_find_type(settings, type); - freerdp_device_collection_del(settings, printer); + if (!freerdp_device_collection_del(settings, printer)) + rc = FALSE; freerdp_device_free(printer); } while (printer); - return TRUE; + return rc; } static BOOL disable_clipboard(rdpSettings* settings) diff --git a/libfreerdp/crypto/ber.c b/libfreerdp/crypto/ber.c index 9dd73496d..31368ddfd 100644 --- a/libfreerdp/crypto/ber.c +++ b/libfreerdp/crypto/ber.c @@ -513,8 +513,10 @@ BOOL ber_read_octet_string(wStream* s, BYTE** content, size_t* length) size_t ber_write_octet_string_tag(wStream* s, size_t length) { - ber_write_universal_tag(s, BER_TAG_OCTET_STRING, FALSE); - ber_write_length(s, length); + if (ber_write_universal_tag(s, BER_TAG_OCTET_STRING, FALSE) == 0) + return 0; + if (ber_write_length(s, length) == 0) + return 0; return 1 + _ber_sizeof_length(length); } @@ -640,24 +642,30 @@ size_t ber_write_integer(wStream* s, UINT32 value) if (value < 0x80) { - ber_write_universal_tag(s, BER_TAG_INTEGER, FALSE); - ber_write_length(s, 1); + if (ber_write_universal_tag(s, BER_TAG_INTEGER, FALSE) == 0) + return 0; + if (ber_write_length(s, 1) == 0) + return 0; Stream_Write_UINT8(s, WINPR_ASSERTING_INT_CAST(UINT8, value)); return 3; } else if (value < 0x8000) { - ber_write_universal_tag(s, BER_TAG_INTEGER, FALSE); - ber_write_length(s, 2); + if (ber_write_universal_tag(s, BER_TAG_INTEGER, FALSE) == 0) + return 0; + if (ber_write_length(s, 2) == 0) + return 0; Stream_Write_UINT16_BE(s, WINPR_ASSERTING_INT_CAST(UINT16, value)); return 4; } else if (value < 0x800000) { - ber_write_universal_tag(s, BER_TAG_INTEGER, FALSE); - ber_write_length(s, 3); + if (ber_write_universal_tag(s, BER_TAG_INTEGER, FALSE) == 0) + return 0; + if (ber_write_length(s, 3) == 0) + return 0; Stream_Write_UINT8(s, WINPR_ASSERTING_INT_CAST(UINT8, value >> 16)); Stream_Write_UINT16_BE(s, WINPR_ASSERTING_INT_CAST(UINT16, value)); @@ -665,8 +673,10 @@ size_t ber_write_integer(wStream* s, UINT32 value) } else if (value < 0x80000000) { - ber_write_universal_tag(s, BER_TAG_INTEGER, FALSE); - ber_write_length(s, 4); + if (ber_write_universal_tag(s, BER_TAG_INTEGER, FALSE) == 0) + return 0; + if (ber_write_length(s, 4) == 0) + return 0; Stream_Write_UINT32_BE(s, value); return 6; @@ -674,8 +684,10 @@ size_t ber_write_integer(wStream* s, UINT32 value) else { /* treat as signed integer i.e. NT/HRESULT error codes */ - ber_write_universal_tag(s, BER_TAG_INTEGER, FALSE); - ber_write_length(s, 4); + if (ber_write_universal_tag(s, BER_TAG_INTEGER, FALSE) == 0) + return 0; + if (ber_write_length(s, 4) == 0) + return 0; Stream_Write_UINT32_BE(s, value); return 6; @@ -691,7 +703,8 @@ size_t ber_write_contextual_integer(wStream* s, BYTE tag, UINT32 value) WINPR_ASSERT(Stream_EnsureRemainingCapacity(s, len + 5)); len += ber_write_contextual_tag(s, tag, len, TRUE); - ber_write_integer(s, value); + if (ber_write_integer(s, value) == 0) + return 0; return len; } diff --git a/libfreerdp/crypto/tls.c b/libfreerdp/crypto/tls.c index 2f3db93ff..789a1f9ef 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -1394,8 +1394,8 @@ static BOOL is_accepted(rdpTls* tls, const rdpCertificate* cert) return TRUE; } - (void)freerdp_settings_set_string(settings, keyAccepted, NULL); - (void)freerdp_settings_set_uint32(settings, keyLength, 0); + freerdp_settings_set_string(settings, keyAccepted, NULL); + freerdp_settings_set_uint32(settings, keyLength, 0); return FALSE; } diff --git a/libfreerdp/gdi/clipping.c b/libfreerdp/gdi/clipping.c index 9481c5924..62a7644ad 100644 --- a/libfreerdp/gdi/clipping.c +++ b/libfreerdp/gdi/clipping.c @@ -77,10 +77,9 @@ BOOL gdi_SetNullClipRgn(HGDI_DC hdc) BOOL gdi_ClipCoords(HGDI_DC hdc, INT32* x, INT32* y, INT32* w, INT32* h, INT32* srcx, INT32* srcy) { - GDI_RECT bmp; - GDI_RECT clip; - GDI_RECT coords; - HGDI_BITMAP hBmp = NULL; + GDI_RECT bmp = { 0 }; + GDI_RECT clip = { 0 }; + GDI_RECT coords = { 0 }; int dx = 0; int dy = 0; BOOL draw = TRUE; @@ -88,18 +87,21 @@ BOOL gdi_ClipCoords(HGDI_DC hdc, INT32* x, INT32* y, INT32* w, INT32* h, INT32* if (hdc == NULL) return FALSE; - hBmp = (HGDI_BITMAP)hdc->selectedObject; + HGDI_BITMAP hBmp = (HGDI_BITMAP)hdc->selectedObject; if (hBmp != NULL) { if (hdc->clip->null) { - gdi_CRgnToRect(0, 0, hBmp->width, hBmp->height, &clip); + if (!gdi_CRgnToRect(0, 0, hBmp->width, hBmp->height, &clip)) + return TRUE; } else { - gdi_RgnToRect(hdc->clip, &clip); - gdi_CRgnToRect(0, 0, hBmp->width, hBmp->height, &bmp); + if (!gdi_RgnToRect(hdc->clip, &clip)) + return TRUE; + if (!gdi_CRgnToRect(0, 0, hBmp->width, hBmp->height, &bmp)) + return FALSE; if (clip.left < bmp.left) clip.left = bmp.left; @@ -116,10 +118,12 @@ BOOL gdi_ClipCoords(HGDI_DC hdc, INT32* x, INT32* y, INT32* w, INT32* h, INT32* } else { - gdi_RgnToRect(hdc->clip, &clip); + if (!gdi_RgnToRect(hdc->clip, &clip)) + return TRUE; } - gdi_CRgnToRect(*x, *y, *w, *h, &coords); + if (!gdi_CRgnToRect(*x, *y, *w, *h, &coords)) + return FALSE; if (coords.right >= clip.left && coords.left <= clip.right && coords.bottom >= clip.top && coords.top <= clip.bottom) @@ -159,6 +163,7 @@ BOOL gdi_ClipCoords(HGDI_DC hdc, INT32* x, INT32* y, INT32* w, INT32* h, INT32* if (srcy != NULL) *srcy += dy; - gdi_RectToCRgn(&coords, x, y, w, h); + if (!gdi_RectToCRgn(&coords, x, y, w, h)) + return FALSE; return draw; } diff --git a/libfreerdp/gdi/gdi.c b/libfreerdp/gdi/gdi.c index d5e70a230..1e396e064 100644 --- a/libfreerdp/gdi/gdi.c +++ b/libfreerdp/gdi/gdi.c @@ -732,7 +732,8 @@ static BOOL gdi_opaque_rect(rdpContext* context, const OPAQUE_RECT_ORDER* opaque if (!gdi || !gdi->drawing) return FALSE; - gdi_CRgnToRect(x, y, w, h, &rect); + if (!gdi_CRgnToRect(x, y, w, h, &rect)) + return TRUE; if (!gdi_decode_color(gdi, opaque_rect->color, &brush_color, NULL)) return FALSE; @@ -775,7 +776,9 @@ static BOOL gdi_multi_opaque_rect(rdpContext* context, const INT32 w = rectangle->width; const INT32 h = rectangle->height; - gdi_CRgnToRect(x, y, w, h, &rect); + ret = FALSE; + if (!gdi_CRgnToRect(x, y, w, h, &rect)) + break; ret = gdi_FillRect(gdi->drawing->hdc, &rect, hBrush); if (!ret) @@ -1152,7 +1155,8 @@ static BOOL gdi_surface_bits(rdpContext* context, const SURFACE_BITS_COMMAND* cm goto out; } - region16_union_rect(®ion, ®ion, &cmdRect); + if (!region16_union_rect(®ion, ®ion, &cmdRect)) + goto out; break; case RDP_CODEC_ID_NONE: @@ -1174,7 +1178,8 @@ static BOOL gdi_surface_bits(rdpContext* context, const SURFACE_BITS_COMMAND* cm goto out; } - region16_union_rect(®ion, ®ion, &cmdRect); + if (!region16_union_rect(®ion, ®ion, &cmdRect)) + goto out; break; default: diff --git a/libfreerdp/gdi/gfx.c b/libfreerdp/gdi/gfx.c index 14893b8be..622127116 100644 --- a/libfreerdp/gdi/gfx.c +++ b/libfreerdp/gdi/gfx.c @@ -192,7 +192,10 @@ static UINT gdi_OutputUpdate(rdpGdi* gdi, gdiGfxSurface* surface) surfaceRect.top = 0; surfaceRect.right = (UINT16)MIN(UINT16_MAX, surface->mappedWidth); surfaceRect.bottom = (UINT16)MIN(UINT16_MAX, surface->mappedHeight); - region16_intersect_rect(&(surface->invalidRegion), &(surface->invalidRegion), &surfaceRect); + if (!region16_intersect_rect(&(surface->invalidRegion), &(surface->invalidRegion), + &surfaceRect)) + goto fail; + const double sx = surface->outputTargetWidth / (double)surface->mappedWidth; const double sy = surface->outputTargetHeight / (double)surface->mappedHeight; @@ -221,8 +224,9 @@ static UINT gdi_OutputUpdate(rdpGdi* gdi, gdiGfxSurface* surface) goto fail; } - gdi_InvalidateRegion(gdi->primary->hdc, (INT32)nXDst, (INT32)nYDst, (INT32)dwidth, - (INT32)dheight); + if (!gdi_InvalidateRegion(gdi->primary->hdc, (INT32)nXDst, (INT32)nYDst, (INT32)dwidth, + (INT32)dheight)) + goto fail; } rc = CHANNEL_RC_OK; @@ -389,7 +393,8 @@ static UINT gdi_SurfaceCommand_Uncompressed(rdpGdi* gdi, RdpgfxClientContext* co invalidRect.top = (UINT16)MIN(UINT16_MAX, cmd->top); invalidRect.right = (UINT16)MIN(UINT16_MAX, cmd->right); invalidRect.bottom = (UINT16)MIN(UINT16_MAX, cmd->bottom); - region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), &invalidRect); + if (!region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), &invalidRect)) + goto fail; status = IFCALLRESULT(CHANNEL_RC_OK, context->UpdateSurfaceArea, context, surface->surfaceId, 1, &invalidRect); @@ -449,7 +454,10 @@ static UINT gdi_SurfaceCommand_RemoteFX(rdpGdi* gdi, RdpgfxClientContext* contex goto fail; for (UINT32 x = 0; x < nrRects; x++) - region16_union_rect(&surface->invalidRegion, &surface->invalidRegion, &rects[x]); + { + if (!region16_union_rect(&surface->invalidRegion, &surface->invalidRegion, &rects[x])) + goto fail; + } status = gdi_interFrameUpdate(gdi, context); @@ -499,7 +507,8 @@ static UINT gdi_SurfaceCommand_ClearCodec(rdpGdi* gdi, RdpgfxClientContext* cont invalidRect.top = (UINT16)MIN(UINT16_MAX, cmd->top); invalidRect.right = (UINT16)MIN(UINT16_MAX, cmd->right); invalidRect.bottom = (UINT16)MIN(UINT16_MAX, cmd->bottom); - region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), &invalidRect); + if (!region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), &invalidRect)) + goto fail; status = IFCALLRESULT(CHANNEL_RC_OK, context->UpdateSurfaceArea, context, surface->surfaceId, 1, &invalidRect); @@ -553,7 +562,8 @@ static UINT gdi_SurfaceCommand_Planar(rdpGdi* gdi, RdpgfxClientContext* context, invalidRect.top = (UINT16)MIN(UINT16_MAX, cmd->top); invalidRect.right = (UINT16)MIN(UINT16_MAX, cmd->right); invalidRect.bottom = (UINT16)MIN(UINT16_MAX, cmd->bottom); - region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), &invalidRect); + if (!region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), &invalidRect)) + goto fail; status = IFCALLRESULT(CHANNEL_RC_OK, context->UpdateSurfaceArea, context, surface->surfaceId, 1, &invalidRect); @@ -629,8 +639,9 @@ static UINT gdi_SurfaceCommand_AVC420(rdpGdi* gdi, RdpgfxClientContext* context, for (UINT32 i = 0; i < meta->numRegionRects; i++) { - region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), - &(meta->regionRects[i])); + if (!region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), + &(meta->regionRects[i]))) + goto fail; } status = IFCALLRESULT(CHANNEL_RC_OK, context->UpdateSurfaceArea, context, surface->surfaceId, @@ -718,8 +729,9 @@ static UINT gdi_SurfaceCommand_AVC444(rdpGdi* gdi, RdpgfxClientContext* context, for (UINT32 i = 0; i < meta1->numRegionRects; i++) { - region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), - &(meta1->regionRects[i])); + if (!region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), + &(meta1->regionRects[i]))) + goto fail; } status = IFCALLRESULT(CHANNEL_RC_OK, context->UpdateSurfaceArea, context, surface->surfaceId, @@ -730,8 +742,9 @@ static UINT gdi_SurfaceCommand_AVC444(rdpGdi* gdi, RdpgfxClientContext* context, for (UINT32 i = 0; i < meta2->numRegionRects; i++) { - region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), - &(meta2->regionRects[i])); + if (!region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), + &(meta2->regionRects[i]))) + goto fail; } status = IFCALLRESULT(CHANNEL_RC_OK, context->UpdateSurfaceArea, context, surface->surfaceId, @@ -905,7 +918,8 @@ static UINT gdi_SurfaceCommand_Alpha(rdpGdi* gdi, RdpgfxClientContext* context, invalidRect.top = (UINT16)MIN(UINT16_MAX, cmd->top); invalidRect.right = (UINT16)MIN(UINT16_MAX, cmd->right); invalidRect.bottom = (UINT16)MIN(UINT16_MAX, cmd->bottom); - region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), &invalidRect); + if (!region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), &invalidRect)) + goto fail; status = IFCALLRESULT(CHANNEL_RC_OK, context->UpdateSurfaceArea, context, surface->surfaceId, 1, &invalidRect); @@ -959,7 +973,7 @@ static UINT gdi_SurfaceCommand_Progressive(rdpGdi* gdi, RdpgfxClientContext* con const RDPGFX_SURFACE_COMMAND* cmd) { INT32 rc = 0; - UINT status = CHANNEL_RC_OK; + UINT status = ERROR_INTERNAL_ERROR; gdiGfxSurface* surface = NULL; REGION16 invalidRegion; const RECTANGLE_16* rects = NULL; @@ -1005,8 +1019,7 @@ static UINT gdi_SurfaceCommand_Progressive(rdpGdi* gdi, RdpgfxClientContext* con if (rc < 0) { WLog_ERR(TAG, "progressive_decompress failure: %" PRId32 "", rc); - region16_uninit(&invalidRegion); - return ERROR_INTERNAL_ERROR; + goto fail; } rects = region16_rects(&invalidRegion, &nrRects); @@ -1016,14 +1029,18 @@ static UINT gdi_SurfaceCommand_Progressive(rdpGdi* gdi, RdpgfxClientContext* con if (status != CHANNEL_RC_OK) goto fail; + status = ERROR_INTERNAL_ERROR; for (UINT32 x = 0; x < nrRects; x++) - region16_union_rect(&surface->invalidRegion, &surface->invalidRegion, &rects[x]); - - region16_uninit(&invalidRegion); + { + if (!region16_union_rect(&surface->invalidRegion, &surface->invalidRegion, &rects[x])) + goto fail; + } status = gdi_interFrameUpdate(gdi, context); fail: + + region16_uninit(&invalidRegion); return status; } @@ -1310,7 +1327,9 @@ static UINT gdi_SolidFill(RdpgfxClientContext* context, const RDPGFX_SOLID_FILL_ invalidRect.left, invalidRect.top, nWidth, nHeight, color)) goto fail; - region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), &invalidRect); + if (!region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), + &invalidRect)) + goto fail; } } @@ -1385,8 +1404,9 @@ static UINT gdi_SurfaceToSurface(RdpgfxClientContext* context, goto fail; invalidRect = rect; - region16_union_rect(&surfaceDst->invalidRegion, &surfaceDst->invalidRegion, - &invalidRect); + if (!region16_union_rect(&surfaceDst->invalidRegion, &surfaceDst->invalidRegion, + &invalidRect)) + goto fail; status = IFCALLRESULT(CHANNEL_RC_OK, context->UpdateSurfaceArea, context, surfaceDst->surfaceId, 1, &invalidRect); @@ -1537,7 +1557,8 @@ static UINT gdi_CacheToSurface(RdpgfxClientContext* context, goto fail; invalidRect = rect; - region16_union_rect(&surface->invalidRegion, &surface->invalidRegion, &invalidRect); + if (!region16_union_rect(&surface->invalidRegion, &surface->invalidRegion, &invalidRect)) + goto fail; status = IFCALLRESULT(CHANNEL_RC_OK, context->UpdateSurfaceArea, context, surface->surfaceId, 1, &invalidRect); diff --git a/libfreerdp/gdi/graphics.c b/libfreerdp/gdi/graphics.c index 1521dbbaf..2f41eea7a 100644 --- a/libfreerdp/gdi/graphics.c +++ b/libfreerdp/gdi/graphics.c @@ -354,8 +354,10 @@ static BOOL gdi_Glyph_Draw(rdpContext* context, const rdpGlyph* glyph, INT32 x, if (!brush) return FALSE; - gdi_FillRect(gdi->drawing->hdc, &rect, brush); + const BOOL res = gdi_FillRect(gdi->drawing->hdc, &rect, brush); gdi_DeleteObject((HGDIOBJECT)brush); + if (!res) + return res; } } @@ -414,7 +416,10 @@ static BOOL gdi_Glyph_BeginDraw(rdpContext* context, INT32 x, INT32 y, INT32 wid rect.bottom = y + height - 1; if ((x + width > rect.left) && (y + height > rect.top)) - gdi_FillRect(gdi->drawing->hdc, &rect, brush); + { + if (!gdi_FillRect(gdi->drawing->hdc, &rect, brush)) + return FALSE; + } gdi_DeleteObject((HGDIOBJECT)brush); } diff --git a/libfreerdp/gdi/region.c b/libfreerdp/gdi/region.c index 7a3f6ab74..fba68c71b 100644 --- a/libfreerdp/gdi/region.c +++ b/libfreerdp/gdi/region.c @@ -445,8 +445,10 @@ inline BOOL gdi_CopyOverlap(INT32 x, INT32 y, INT32 width, INT32 height, INT32 s { GDI_RECT dst; GDI_RECT src; - gdi_CRgnToRect(x, y, width, height, &dst); - gdi_CRgnToRect(srcx, srcy, width, height, &src); + if (!gdi_CRgnToRect(x, y, width, height, &dst)) + return FALSE; + if (!gdi_CRgnToRect(srcx, srcy, width, height, &src)) + return FALSE; if (dst.right < src.left) return FALSE; @@ -647,10 +649,12 @@ inline BOOL gdi_InvalidateRegion(HGDI_DC hdc, INT32 x, INT32 y, INT32 w, INT32 h cinvalid = new_rgn; } - gdi_SetRgn(&cinvalid[hdc->hwnd->ninvalid++], x, y, w, h); hdc->hwnd->cinvalid = cinvalid; invalid = hdc->hwnd->invalid; + if (!gdi_SetRgn(&cinvalid[hdc->hwnd->ninvalid++], x, y, w, h)) + return FALSE; + if (invalid->null) { invalid->x = x; @@ -661,8 +665,10 @@ inline BOOL gdi_InvalidateRegion(HGDI_DC hdc, INT32 x, INT32 y, INT32 w, INT32 h return TRUE; } - gdi_CRgnToRect(x, y, w, h, &rgn); - gdi_RgnToRect(invalid, &inv); + if (!gdi_CRgnToRect(x, y, w, h, &rgn)) + return FALSE; + if (!gdi_RgnToRect(invalid, &inv)) + return FALSE; if (rgn.left < inv.left) inv.left = rgn.left; @@ -676,6 +682,5 @@ inline BOOL gdi_InvalidateRegion(HGDI_DC hdc, INT32 x, INT32 y, INT32 w, INT32 h if (rgn.bottom > inv.bottom) inv.bottom = rgn.bottom; - gdi_RectToRgn(&inv, invalid); - return TRUE; + return gdi_RectToRgn(&inv, invalid); } diff --git a/libfreerdp/gdi/shape.c b/libfreerdp/gdi/shape.c index 1b55aeb7b..384bfb328 100644 --- a/libfreerdp/gdi/shape.c +++ b/libfreerdp/gdi/shape.c @@ -39,21 +39,15 @@ #define TAG FREERDP_TAG("gdi.shape") -static void Ellipse_Bresenham(HGDI_DC hdc, int x1, int y1, int x2, int y2) +WINPR_ATTR_NODISCARD +static BOOL Ellipse_Bresenham(HGDI_DC hdc, int x1, int y1, int x2, int y2) { - INT32 e = 0; - INT32 e2 = 0; - INT32 dx = 0; - INT32 dy = 0; - INT32 a = 0; - INT32 b = 0; - INT32 c = 0; - a = (x1 < x2) ? x2 - x1 : x1 - x2; - b = (y1 < y2) ? y2 - y1 : y1 - y2; - c = b & 1; - dx = 4 * (1 - a) * b * b; - dy = 4 * (c + 1) * a * a; - e = dx + dy + c * a * a; + INT32 a = (x1 < x2) ? x2 - x1 : x1 - x2; + const INT32 b = (y1 < y2) ? y2 - y1 : y1 - y2; + INT32 c = b & 1; + INT32 dx = 4 * (1 - a) * b * b; + INT32 dy = 4 * (c + 1) * a * a; + INT32 e = dx + dy + c * a * a; if (x1 > x2) { @@ -79,7 +73,8 @@ static void Ellipse_Bresenham(HGDI_DC hdc, int x1, int y1, int x2, int y2) WINPR_ASSERTING_INT_CAST(UINT32, y2), 0); gdi_SetPixel(hdc, WINPR_ASSERTING_INT_CAST(UINT32, x2), WINPR_ASSERTING_INT_CAST(UINT32, y2), 0); - e2 = 2 * e; + + const INT32 e2 = 2 * e; if (e2 >= dx) { @@ -106,6 +101,7 @@ static void Ellipse_Bresenham(HGDI_DC hdc, int x1, int y1, int x2, int y2) gdi_SetPixel(hdc, WINPR_ASSERTING_INT_CAST(uint32_t, x1 - 1), WINPR_ASSERTING_INT_CAST(uint32_t, y2), 0); } + return TRUE; } /** @@ -122,8 +118,7 @@ static void Ellipse_Bresenham(HGDI_DC hdc, int x1, int y1, int x2, int y2) */ BOOL gdi_Ellipse(HGDI_DC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect) { - Ellipse_Bresenham(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); - return TRUE; + return Ellipse_Bresenham(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); } /** @@ -148,7 +143,8 @@ BOOL gdi_FillRect(HGDI_DC hdc, const GDI_RECT* rect, HGDI_BRUSH hbr) INT32 nHeight = 0; const BYTE* srcp = NULL; DWORD formatSize = 0; - gdi_RectToCRgn(rect, &nXDest, &nYDest, &nWidth, &nHeight); + if (!gdi_RectToCRgn(rect, &nXDest, &nYDest, &nWidth, &nHeight)) + return FALSE; if (!hdc || !hbr) return FALSE; diff --git a/libfreerdp/gdi/video.c b/libfreerdp/gdi/video.c index dddbf1e35..6b1d6f1b0 100644 --- a/libfreerdp/gdi/video.c +++ b/libfreerdp/gdi/video.c @@ -80,7 +80,7 @@ static BOOL gdiVideoShowSurface(VideoClientContext* video, const VideoSurface* s if ((gdi->width < 0) || (gdi->height < 0)) goto fail; - else + { const UINT32 nXSrc = surface->x; const UINT32 nYSrc = surface->y; @@ -106,11 +106,9 @@ static BOOL gdiVideoShowSurface(VideoClientContext* video, const VideoSurface* s (height > INT32_MAX)) goto fail; - gdi_InvalidateRegion(gdi->primary->hdc, (INT32)nXDst, (INT32)nYDst, (INT32)width, - (INT32)height); + rc = gdi_InvalidateRegion(gdi->primary->hdc, (INT32)nXDst, (INT32)nYDst, (INT32)width, + (INT32)height); } - - rc = TRUE; fail: if (!update_end_paint(update)) diff --git a/libfreerdp/utils/smartcard_call.c b/libfreerdp/utils/smartcard_call.c index 1d14dcf83..deea2356a 100644 --- a/libfreerdp/utils/smartcard_call.c +++ b/libfreerdp/utils/smartcard_call.c @@ -1825,7 +1825,9 @@ LONG smartcard_irp_device_control_call(scard_call_context* smartcard, wStream* o (ioControlCode != SCARD_IOCTL_RELEASETARTEDEVENT)) { offset = (RDPDR_DEVICE_IO_RESPONSE_LENGTH + RDPDR_DEVICE_IO_CONTROL_RSP_HDR_LENGTH); - smartcard_pack_write_size_align(out, Stream_GetPosition(out) - offset, 8); + const LONG rc = smartcard_pack_write_size_align(out, Stream_GetPosition(out) - offset, 8); + if (rc != SCARD_S_SUCCESS) + result = rc; } if ((result != SCARD_S_SUCCESS) && (result != SCARD_E_TIMEOUT) && diff --git a/server/Sample/sfreerdp.c b/server/Sample/sfreerdp.c index 66b234e20..e265e53e8 100644 --- a/server/Sample/sfreerdp.c +++ b/server/Sample/sfreerdp.c @@ -130,7 +130,8 @@ static BOOL test_peer_context_new(freerdp_peer* client, rdpContext* ctx) { const UINT32 rlgr = freerdp_settings_get_uint32(ctx->settings, FreeRDP_RemoteFxRlgrMode); - rfx_context_set_mode(context->rfx_context, WINPR_ASSERTING_INT_CAST(RLGR_MODE, rlgr)); + if (!rfx_context_set_mode(context->rfx_context, WINPR_ASSERTING_INT_CAST(RLGR_MODE, rlgr))) + goto fail; } if (!(context->nsc_context = nsc_context_new())) @@ -285,11 +286,13 @@ static BOOL test_peer_draw_background(freerdp_peer* client, const RFX_RECT* rect else { WLog_DBG(TAG, "Using NSCodec"); - nsc_context_set_parameters(context->nsc_context, NSC_COLOR_FORMAT, colorFormat); + if (!nsc_context_set_parameters(context->nsc_context, NSC_COLOR_FORMAT, colorFormat)) + goto out; WINPR_ASSERT(bpp <= UINT16_MAX); - nsc_compose_message(context->nsc_context, s, rgb_data, rect->width, rect->height, - (UINT32)(bpp * rect->width)); + if (!nsc_compose_message(context->nsc_context, s, rgb_data, rect->width, rect->height, + (UINT32)(bpp * rect->width))) + goto out; const UINT32 NSCodecId = freerdp_settings_get_uint32(settings, FreeRDP_NSCodecId); WINPR_ASSERT(NSCodecId <= UINT16_MAX); cmd.bmp.codecID = (UINT16)NSCodecId; @@ -430,14 +433,17 @@ static void test_send_cursor_update(freerdp_peer* client, UINT32 x, UINT32 y) if (RemoteFxCodec) { rfx_context_set_pixel_format(context->rfx_context, colorFormat); - rfx_compose_message(context->rfx_context, s, &rect, 1, context->image->data, rect.width, - rect.height, context->image->scanline); + if (!rfx_compose_message(context->rfx_context, s, &rect, 1, context->image->data, + rect.width, rect.height, context->image->scanline)) + WLog_WARN(TAG, "rfx_compose_message failed"); } else { - nsc_context_set_parameters(context->nsc_context, NSC_COLOR_FORMAT, colorFormat); - nsc_compose_message(context->nsc_context, s, context->image->data, rect.width, - rect.height, context->image->scanline); + if (!nsc_context_set_parameters(context->nsc_context, NSC_COLOR_FORMAT, colorFormat)) + WLog_WARN(TAG, "nsc_context_set_parameters failed"); + else if (!nsc_compose_message(context->nsc_context, s, context->image->data, rect.width, + rect.height, context->image->scanline)) + WLog_WARN(TAG, "rfx_compose_message failed"); } } @@ -1204,7 +1210,8 @@ static DWORD WINAPI test_peer_mainloop(LPVOID arg) replay = *cb; context->io = *cb; replay.WritePdu = hook_peer_write_pdu; - freerdp_set_io_callbacks(client->context, &replay); + if (!freerdp_set_io_callbacks(client->context, &replay)) + goto fail; } WLog_INFO(TAG, "We've got a client %s", client->local ? "(local)" : client->hostname); diff --git a/server/proxy/pf_client.c b/server/proxy/pf_client.c index fc1746dbf..c887858af 100644 --- a/server/proxy/pf_client.c +++ b/server/proxy/pf_client.c @@ -90,7 +90,11 @@ static void pf_client_on_error_info(void* ctx, const ErrorInfoEventArgs* e) /* forward error back to client */ freerdp_set_error_info(ps->context.rdp, e->code); - freerdp_send_error_info(ps->context.rdp); + if (!freerdp_send_error_info(ps->context.rdp)) + { + PROXY_LOG_WARN(TAG, pc, "[fail] reply ErrorInfo PDU. code=0x%08" PRIu32 ", message: %s", + e->code, freerdp_get_error_info_string(e->code)); + } } static void pf_client_on_activated(void* ctx, WINPR_ATTR_UNUSED const ActivatedEventArgs* e) diff --git a/server/shadow/X11/x11_shadow.c b/server/shadow/X11/x11_shadow.c index d93e830c4..c956dafc1 100644 --- a/server/shadow/X11/x11_shadow.c +++ b/server/shadow/X11/x11_shadow.c @@ -876,8 +876,12 @@ static int x11_shadow_screen_grab(x11ShadowSubsystem* subsystem) { BOOL empty = 0; EnterCriticalSection(&surface->lock); - region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), &invalidRect); - region16_intersect_rect(&(surface->invalidRegion), &(surface->invalidRegion), &surfaceRect); + if (!region16_union_rect(&(surface->invalidRegion), &(surface->invalidRegion), + &invalidRect)) + goto fail_capture; + if (!region16_intersect_rect(&(surface->invalidRegion), &(surface->invalidRegion), + &surfaceRect)) + goto fail_capture; empty = region16_is_empty(&(surface->invalidRegion)); LeaveCriticalSection(&surface->lock); diff --git a/server/shadow/shadow_client.c b/server/shadow/shadow_client.c index 3b484c096..591b4020c 100644 --- a/server/shadow/shadow_client.c +++ b/server/shadow/shadow_client.c @@ -348,13 +348,10 @@ fail: static inline void shadow_client_mark_invalid(rdpShadowClient* client, UINT32 numRects, const RECTANGLE_16* rects) { - RECTANGLE_16 screenRegion; - rdpSettings* settings = NULL; - WINPR_ASSERT(client); WINPR_ASSERT(rects || (numRects == 0)); - settings = client->context.settings; + rdpSettings* settings = client->context.settings; WINPR_ASSERT(settings); EnterCriticalSection(&(client->lock)); @@ -364,20 +361,22 @@ static inline void shadow_client_mark_invalid(rdpShadowClient* client, UINT32 nu { for (UINT32 index = 0; index < numRects; index++) { - region16_union_rect(&(client->invalidRegion), &(client->invalidRegion), &rects[index]); + if (!region16_union_rect(&(client->invalidRegion), &(client->invalidRegion), + &rects[index])) + goto fail; } } else { - screenRegion.left = 0; - screenRegion.top = 0; + RECTANGLE_16 screenRegion = { 0 }; WINPR_ASSERT(freerdp_settings_get_uint32(settings, FreeRDP_DesktopWidth) <= UINT16_MAX); WINPR_ASSERT(freerdp_settings_get_uint32(settings, FreeRDP_DesktopHeight) <= UINT16_MAX); screenRegion.right = (UINT16)freerdp_settings_get_uint32(settings, FreeRDP_DesktopWidth); screenRegion.bottom = (UINT16)freerdp_settings_get_uint32(settings, FreeRDP_DesktopHeight); - region16_union_rect(&(client->invalidRegion), &(client->invalidRegion), &screenRegion); + if (!region16_union_rect(&(client->invalidRegion), &(client->invalidRegion), &screenRegion)) + goto fail; } - +fail: LeaveCriticalSection(&(client->lock)); } @@ -410,7 +409,8 @@ static inline BOOL shadow_client_recalc_desktop_size(rdpShadowClient* client) if (server->shareSubRect) { - rectangles_intersection(&viewport, &(server->subRect), &viewport); + if (!rectangles_intersection(&viewport, &(server->subRect), &viewport)) + return FALSE; } width = viewport.right - viewport.left; @@ -1170,7 +1170,8 @@ static BOOL shadow_client_send_surface_gfx(rdpShadowClient* client, const BYTE* if (client->first_frame) { - rfx_context_reset(encoder->rfx, nWidth, nHeight); + if (!rfx_context_reset(encoder->rfx, nWidth, nHeight)) + return FALSE; client->first_frame = FALSE; } @@ -1365,7 +1366,11 @@ static BOOL shadow_client_send_surface_gfx(rdpShadowClient* client, const BYTE* regionRect.right = (UINT16)cmd.right; regionRect.bottom = (UINT16)cmd.bottom; region16_init(®ion); - region16_union_rect(®ion, ®ion, ®ionRect); + if (!region16_union_rect(®ion, ®ion, ®ionRect)) + { + region16_uninit(®ion); + return FALSE; + } rc = progressive_compress(encoder->progressive, pSrcData, nSrcStep * nHeight, cmd.format, nWidth, nHeight, nSrcStep, ®ion, &cmd.data, &cmd.length); region16_uninit(®ion); @@ -1617,7 +1622,9 @@ static BOOL shadow_client_send_surface_bits(rdpShadowClient* client, BYTE* pSrcD s = encoder->bs; Stream_SetPosition(s, 0); pSrcData = &pSrcData[(nYSrc * nSrcStep) + (nXSrc * 4)]; - nsc_compose_message(encoder->nsc, s, pSrcData, nWidth, nHeight, nSrcStep); + if (!nsc_compose_message(encoder->nsc, s, pSrcData, nWidth, nHeight, nSrcStep)) + return FALSE; + cmd.cmdType = CMDTYPE_SET_SURFACE_BITS; cmd.bmp.bpp = 32; WINPR_ASSERT(nsID <= UINT16_MAX); @@ -1767,9 +1774,12 @@ static BOOL shadow_client_send_bitmap_update(rdpShadowClient* client, BYTE* pSrc UINT32 bytesPerPixel = (bitsPerPixel + 7) / 8; DstSize = 64 * 64 * 4; buffer = encoder->grid[k]; - interleaved_compress(encoder->interleaved, buffer, &DstSize, bitmap->width, - bitmap->height, pSrcData, SrcFormat, nSrcStep, - bitmap->destLeft, bitmap->destTop, NULL, bitsPerPixel); + + ret = interleaved_compress(encoder->interleaved, buffer, &DstSize, bitmap->width, + bitmap->height, pSrcData, SrcFormat, nSrcStep, + bitmap->destLeft, bitmap->destTop, NULL, bitsPerPixel); + if (!ret) + goto out; bitmap->bitmapDataStream = buffer; bitmap->bitmapLength = DstSize; bitmap->bitsPerPixel = bitsPerPixel; @@ -1900,7 +1910,8 @@ static BOOL shadow_client_send_surface_update(rdpShadowClient* client, SHADOW_GF EnterCriticalSection(&(client->lock)); region16_init(&invalidRegion); - region16_copy(&invalidRegion, &(client->invalidRegion)); + if (!region16_copy(&invalidRegion, &(client->invalidRegion))) + goto out; region16_clear(&(client->invalidRegion)); LeaveCriticalSection(&(client->lock)); @@ -1908,7 +1919,10 @@ static BOOL shadow_client_send_surface_update(rdpShadowClient* client, SHADOW_GF rects = region16_rects(&(surface->invalidRegion), &numRects); for (UINT32 index = 0; index < numRects; index++) - region16_union_rect(&invalidRegion, &invalidRegion, &rects[index]); + { + if (!region16_union_rect(&invalidRegion, &invalidRegion, &rects[index])) + goto out; + } surfaceRect.left = 0; surfaceRect.top = 0; @@ -1916,11 +1930,13 @@ static BOOL shadow_client_send_surface_update(rdpShadowClient* client, SHADOW_GF WINPR_ASSERT(surface->height <= UINT16_MAX); surfaceRect.right = (UINT16)surface->width; surfaceRect.bottom = (UINT16)surface->height; - region16_intersect_rect(&invalidRegion, &invalidRegion, &surfaceRect); + if (!region16_intersect_rect(&invalidRegion, &invalidRegion, &surfaceRect)) + goto out; if (server->shareSubRect) { - region16_intersect_rect(&invalidRegion, &invalidRegion, &(server->subRect)); + if (!region16_intersect_rect(&invalidRegion, &invalidRegion, &(server->subRect))) + goto out; } if (region16_is_empty(&invalidRegion)) @@ -2481,7 +2497,8 @@ static DWORD WINAPI shadow_client_thread(LPVOID arg) { if (WaitForSingleObject(gfxevent, 0) == WAIT_OBJECT_0) { - rdpgfx_server_handle_messages(client->rdpgfx); + if (!rdpgfx_server_handle_messages(client->rdpgfx)) + goto fail; } } #endif diff --git a/server/shadow/shadow_encoder.c b/server/shadow/shadow_encoder.c index 8bc8c95ca..6d2c871d6 100644 --- a/server/shadow/shadow_encoder.c +++ b/server/shadow/shadow_encoder.c @@ -143,7 +143,8 @@ static int shadow_encoder_init_rfx(rdpShadowEncoder* encoder) { const UINT32 mode = freerdp_settings_get_uint32(encoder->server->settings, FreeRDP_RemoteFxRlgrMode); - rfx_context_set_mode(encoder->rfx, WINPR_ASSERTING_INT_CAST(RLGR_MODE, mode)); + if (!rfx_context_set_mode(encoder->rfx, WINPR_ASSERTING_INT_CAST(RLGR_MODE, mode))) + goto fail; } rfx_context_set_pixel_format(encoder->rfx, PIXEL_FORMAT_BGRX32); encoder->codecs |= FREERDP_CODEC_REMOTEFX; diff --git a/server/shadow/shadow_lobby.c b/server/shadow/shadow_lobby.c index 032a2eac4..1bde2f0c8 100644 --- a/server/shadow/shadow_lobby.c +++ b/server/shadow/shadow_lobby.c @@ -59,7 +59,8 @@ BOOL shadow_client_init_lobby(rdpShadowServer* server) if (server->shareSubRect) { /* If we have shared sub rect setting, only fill shared rect */ - rectangles_intersection(&invalidRect, &(server->subRect), &invalidRect); + if (!rectangles_intersection(&invalidRect, &(server->subRect), &invalidRect)) + goto fail; } width = invalidRect.right - invalidRect.left; @@ -78,7 +79,8 @@ BOOL shadow_client_init_lobby(rdpShadowServer* server) rdtk_surface_free(surface); - region16_union_rect(&(lobby->invalidRegion), &(lobby->invalidRegion), &invalidRect); + if (!region16_union_rect(&(lobby->invalidRegion), &(lobby->invalidRegion), &invalidRect)) + goto fail; rc = TRUE; fail: