diff --git a/client/Android/FreeRDPCore/jni/android_freerdp.c b/client/Android/FreeRDPCore/jni/android_freerdp.c index e4a386f53..d2602fbe4 100644 --- a/client/Android/FreeRDPCore/jni/android_freerdp.c +++ b/client/Android/FreeRDPCore/jni/android_freerdp.c @@ -102,14 +102,15 @@ void android_OnChannelDisconnectedEventHandler(rdpContext* context, ChannelDisco } } -void android_begin_paint(rdpContext* context) +BOOL android_begin_paint(rdpContext* context) { rdpGdi* gdi = context->gdi; gdi->primary->hdc->hwnd->invalid->null = 1; gdi->primary->hdc->hwnd->ninvalid = 0; + return TRUE; } -void android_end_paint(rdpContext* context) +BOOL android_end_paint(rdpContext* context) { int i; int ninvalid; @@ -126,7 +127,7 @@ void android_end_paint(rdpContext* context) if (ninvalid == 0) { DEBUG_ANDROID("ui_update: ninvalid=%d", ninvalid); - return; + return TRUE; } cinvalid = ctx->rdpCtx.gdi->primary->hdc->hwnd->cinvalid; @@ -149,9 +150,10 @@ void android_end_paint(rdpContext* context) freerdp_callback("OnGraphicsUpdate", "(IIIII)V", context->instance, x1, y1, x2 - x1, y2 - y1); + return TRUE; } -void android_desktop_resize(rdpContext* context) +BOOL android_desktop_resize(rdpContext* context) { DEBUG_ANDROID("ui_desktop_resize"); @@ -162,6 +164,7 @@ void android_desktop_resize(rdpContext* context) freerdp_callback("OnGraphicsResize", "(IIII)V", context->instance, context->settings->DesktopWidth, context->settings->DesktopHeight, context->settings->ColorDepth); + return TRUE; } BOOL android_pre_connect(freerdp* instance) diff --git a/client/Mac/MRDPView.m b/client/Mac/MRDPView.m index 0674d45d1..3f3f9ef0e 100644 --- a/client/Mac/MRDPView.m +++ b/client/Mac/MRDPView.m @@ -46,15 +46,15 @@ #define TAG CLIENT_TAG("mac") -void mf_Pointer_New(rdpContext* context, rdpPointer* pointer); +BOOL mf_Pointer_New(rdpContext* context, rdpPointer* pointer); void mf_Pointer_Free(rdpContext* context, rdpPointer* pointer); -void mf_Pointer_Set(rdpContext* context, rdpPointer* pointer); -void mf_Pointer_SetNull(rdpContext* context); -void mf_Pointer_SetDefault(rdpContext* context); +BOOL mf_Pointer_Set(rdpContext* context, rdpPointer* pointer); +BOOL mf_Pointer_SetNull(rdpContext* context); +BOOL mf_Pointer_SetDefault(rdpContext* context); -void mac_begin_paint(rdpContext* context); -void mac_end_paint(rdpContext* context); -void mac_desktop_resize(rdpContext* context); +BOOL mac_begin_paint(rdpContext* context); +BOOL mac_end_paint(rdpContext* context); +BOOL mac_desktop_resize(rdpContext* context); static void update_activity_cb(freerdp* instance); static void input_activity_cb(freerdp* instance); @@ -1000,7 +1000,7 @@ BOOL mac_authenticate(freerdp* instance, char** username, char** password, char* return ok; } -void mf_Pointer_New(rdpContext* context, rdpPointer* pointer) +BOOL mf_Pointer_New(rdpContext* context, rdpPointer* pointer) { NSRect rect; NSImage* image; @@ -1019,6 +1019,8 @@ void mf_Pointer_New(rdpContext* context, rdpPointer* pointer) rect.origin.y = pointer->yPos; cursor_data = (BYTE*) malloc(rect.size.width * rect.size.height * 4); + if (!cursor_data) + return FALSE; mrdpCursor->cursor_data = cursor_data; freerdp_image_copy_from_pointer_data(cursor_data, PIXEL_FORMAT_ARGB32, @@ -1056,6 +1058,7 @@ void mf_Pointer_New(rdpContext* context, rdpPointer* pointer) /* save cursor for later use in mf_Pointer_Set() */ ma = view->cursors; [ma addObject:mrdpCursor]; + return TRUE; } void mf_Pointer_Free(rdpContext* context, rdpPointer* pointer) @@ -1078,7 +1081,7 @@ void mf_Pointer_Free(rdpContext* context, rdpPointer* pointer) } } -void mf_Pointer_Set(rdpContext* context, rdpPointer* pointer) +BOOL mf_Pointer_Set(rdpContext* context, rdpPointer* pointer) { mfContext* mfc = (mfContext*) context; MRDPView* view = (MRDPView*) mfc->view; @@ -1090,23 +1093,25 @@ void mf_Pointer_Set(rdpContext* context, rdpPointer* pointer) if (cursor->pointer == pointer) { [view setCursor:cursor->nsCursor]; - return; + return TRUE; } } NSLog(@"Cursor not found"); + return TRUE; } -void mf_Pointer_SetNull(rdpContext* context) +BOOL mf_Pointer_SetNull(rdpContext* context) { - + return TRUE; } -void mf_Pointer_SetDefault(rdpContext* context) +BOOL mf_Pointer_SetDefault(rdpContext* context) { mfContext* mfc = (mfContext*) context; MRDPView* view = (MRDPView*) mfc->view; [view setCursor:[NSCursor arrowCursor]]; + return TRUE; } CGContextRef mac_create_bitmap_context(rdpContext* context) @@ -1134,17 +1139,18 @@ CGContextRef mac_create_bitmap_context(rdpContext* context) return bitmap_context; } -void mac_begin_paint(rdpContext* context) +BOOL mac_begin_paint(rdpContext* context) { rdpGdi* gdi = context->gdi; if (!gdi) - return; + return FALSE; gdi->primary->hdc->hwnd->invalid->null = 1; + return TRUE; } -void mac_end_paint(rdpContext* context) +BOOL mac_end_paint(rdpContext* context) { rdpGdi* gdi; HGDI_RGN invalid; @@ -1156,7 +1162,7 @@ void mac_end_paint(rdpContext* context) gdi = context->gdi; if (!gdi) - return; + return FALSE; ww = mfc->client_width; wh = mfc->client_height; @@ -1164,10 +1170,10 @@ void mac_end_paint(rdpContext* context) dh = mfc->context.settings->DesktopHeight; if ((!context) || (!context->gdi)) - return; + return FALSE; if (context->gdi->primary->hdc->hwnd->invalid->null) - return; + return TRUE; invalid = gdi->primary->hdc->hwnd->invalid; @@ -1196,9 +1202,10 @@ void mac_end_paint(rdpContext* context) [view setNeedsDisplayInRect:newDrawRect]; gdi->primary->hdc->hwnd->ninvalid = 0; + return TRUE; } -void mac_desktop_resize(rdpContext* context) +BOOL mac_desktop_resize(rdpContext* context) { mfContext* mfc = (mfContext*) context; MRDPView* view = (MRDPView*) mfc->view; @@ -1220,6 +1227,9 @@ void mac_desktop_resize(rdpContext* context) gdi_resize(context->gdi, mfc->width, mfc->height); view->bitmap_context = mac_create_bitmap_context(context); + if (!view->bitmap_context) + return FALSE; + return TRUE; } static void update_activity_cb(freerdp* instance) diff --git a/client/Mac/mf_client.m b/client/Mac/mf_client.m index 9b5427792..41a9364dd 100644 --- a/client/Mac/mf_client.m +++ b/client/Mac/mf_client.m @@ -30,9 +30,10 @@ * Client Interface */ -void mfreerdp_client_global_init() +BOOL mfreerdp_client_global_init() { freerdp_handle_signals(); + return TRUE; } void mfreerdp_client_global_uninit() diff --git a/client/Sample/freerdp.c b/client/Sample/freerdp.c index 1cc8ae6f3..3aae29b25 100644 --- a/client/Sample/freerdp.c +++ b/client/Sample/freerdp.c @@ -60,18 +60,20 @@ static void tf_context_free(freerdp* instance, rdpContext* context) } } -static void tf_begin_paint(rdpContext* context) +static BOOL tf_begin_paint(rdpContext* context) { rdpGdi* gdi = context->gdi; gdi->primary->hdc->hwnd->invalid->null = 1; + return TRUE; } -static void tf_end_paint(rdpContext* context) +static BOOL tf_end_paint(rdpContext* context) { rdpGdi* gdi = context->gdi; if (gdi->primary->hdc->hwnd->invalid->null) - return; + return TRUE; + return TRUE; } static BOOL tf_pre_connect(freerdp* instance) diff --git a/client/Wayland/wlf_display.c b/client/Wayland/wlf_display.c index 183444759..4ab971284 100644 --- a/client/Wayland/wlf_display.c +++ b/client/Wayland/wlf_display.c @@ -81,9 +81,11 @@ wlfDisplay* wlf_CreateDisplay(void) return display; } -void wlf_RefreshDisplay(wlfDisplay* display) +BOOL wlf_RefreshDisplay(wlfDisplay* display) { - wl_display_dispatch(display->display); + if (wl_display_dispatch(display->display) == -1) + return FALSE; + return TRUE; } void wlf_DestroyDisplay(wlfContext* wlfc, wlfDisplay* display) diff --git a/client/Wayland/wlf_display.h b/client/Wayland/wlf_display.h index 9301eec77..d92d8991d 100644 --- a/client/Wayland/wlf_display.h +++ b/client/Wayland/wlf_display.h @@ -37,7 +37,7 @@ struct wlf_display }; wlfDisplay* wlf_CreateDisplay(void); -void wlf_RefreshDisplay(wlfDisplay* display); +BOOL wlf_RefreshDisplay(wlfDisplay* display); void wlf_DestroyDisplay(wlfContext* wlfc, wlfDisplay* display); #endif /* __WLF_DISPLAY_H */ diff --git a/client/Wayland/wlfreerdp.c b/client/Wayland/wlfreerdp.c index d08230624..e10982923 100644 --- a/client/Wayland/wlfreerdp.c +++ b/client/Wayland/wlfreerdp.c @@ -38,15 +38,16 @@ void wl_context_free(freerdp* instance, rdpContext* context) } -void wl_begin_paint(rdpContext* context) +BOOL wl_begin_paint(rdpContext* context) { rdpGdi* gdi; gdi = context->gdi; gdi->primary->hdc->hwnd->invalid->null = 1; + return TRUE; } -void wl_end_paint(rdpContext* context) +BOOL wl_end_paint(rdpContext* context) { rdpGdi* gdi; wlfDisplay* display; @@ -58,7 +59,7 @@ void wl_end_paint(rdpContext* context) gdi = context->gdi; if (gdi->primary->hdc->hwnd->invalid->null) - return; + return TRUE; x = gdi->primary->hdc->hwnd->invalid->x; y = gdi->primary->hdc->hwnd->invalid->y; @@ -74,7 +75,7 @@ void wl_end_paint(rdpContext* context) gdi->primary_buffer + ((i+y)*(gdi->width*4)) + x*4, w*4); - wlf_RefreshDisplay(display); + return wlf_RefreshDisplay(display); } BOOL wl_pre_connect(freerdp* instance) diff --git a/client/Windows/wf_client.c b/client/Windows/wf_client.c index 6c1f9a49c..0fc2f1c3b 100644 --- a/client/Windows/wf_client.c +++ b/client/Windows/wf_client.c @@ -69,14 +69,15 @@ int wf_create_console(void) return 0; } -void wf_sw_begin_paint(wfContext* wfc) +BOOL wf_sw_begin_paint(wfContext* wfc) { rdpGdi* gdi = ((rdpContext*) wfc)->gdi; gdi->primary->hdc->hwnd->invalid->null = 1; gdi->primary->hdc->hwnd->ninvalid = 0; + return TRUE; } -void wf_sw_end_paint(wfContext* wfc) +BOOL wf_sw_end_paint(wfContext* wfc) { int i; rdpGdi* gdi; @@ -94,7 +95,7 @@ void wf_sw_end_paint(wfContext* wfc) cinvalid = gdi->primary->hdc->hwnd->cinvalid; if (ninvalid < 1) - return; + return TRUE; region16_init(&invalidRegion); @@ -124,9 +125,10 @@ void wf_sw_end_paint(wfContext* wfc) } region16_uninit(&invalidRegion); + return TRUE; } -void wf_sw_desktop_resize(wfContext* wfc) +BOOL wf_sw_desktop_resize(wfContext* wfc) { rdpGdi* gdi; rdpContext* context; @@ -149,20 +151,22 @@ void wf_sw_desktop_resize(wfContext* wfc) gdi_init(instance, CLRCONV_ALPHA | CLRBUF_32BPP, wfc->primary->pdata); gdi = instance->context->gdi; wfc->hdc = gdi->primary->hdc; + return TRUE; } -void wf_hw_begin_paint(wfContext* wfc) +BOOL wf_hw_begin_paint(wfContext* wfc) { wfc->hdc->hwnd->invalid->null = 1; wfc->hdc->hwnd->ninvalid = 0; + return TRUE; } -void wf_hw_end_paint(wfContext* wfc) +BOOL wf_hw_end_paint(wfContext* wfc) { - + return TRUE; } -void wf_hw_desktop_resize(wfContext* wfc) +BOOL wf_hw_desktop_resize(wfContext* wfc) { BOOL same; RECT rect; @@ -196,6 +200,7 @@ void wf_hw_desktop_resize(wfContext* wfc) GetWindowRect(wfc->hwnd, &rect); InvalidateRect(wfc->hwnd, &rect, TRUE); } + return TRUE; } BOOL wf_pre_connect(freerdp* instance) @@ -972,7 +977,7 @@ void wf_size_scrollbars(wfContext* wfc, UINT32 client_width, UINT32 client_heigh wf_update_canvas_diff(wfc); } -void wfreerdp_client_global_init(void) +BOOL wfreerdp_client_global_init(void) { WSADATA wsaData; @@ -991,6 +996,7 @@ void wfreerdp_client_global_init(void) #endif freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0); + return TRUE; } void wfreerdp_client_global_uninit(void) diff --git a/client/Windows/wf_gdi.c b/client/Windows/wf_gdi.c index f38976105..c036acf3c 100644 --- a/client/Windows/wf_gdi.c +++ b/client/Windows/wf_gdi.c @@ -342,7 +342,7 @@ void wf_toggle_fullscreen(wfContext* wfc) } } -void wf_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) +BOOL wf_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) { HDC hdc; int status; @@ -366,6 +366,8 @@ void wf_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) wfContext* wfc = (wfContext*) context; hdc = CreateCompatibleDC(GetDC(NULL)); + if (!hdc) + return FALSE; for (index = 0; index < bitmapUpdate->number; index++) { @@ -395,7 +397,7 @@ void wf_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) wfc->bitmap_buffer = (BYTE*) _aligned_realloc(wfc->bitmap_buffer, wfc->bitmap_size, 16); if (!wfc->bitmap_buffer) - return; + return FALSE; } if (compressed) @@ -420,7 +422,7 @@ void wf_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) if (status < 0) { WLog_ERR(TAG, "bitmap decompression failure"); - return; + return FALSE; } pSrcData = wfc->bitmap_buffer; @@ -440,6 +442,7 @@ void wf_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) } ReleaseDC(NULL, hdc); + return TRUE; } void wf_gdi_palette_update(wfContext* wfc, PALETTE_UPDATE* palette) diff --git a/client/Windows/wf_gdi.h b/client/Windows/wf_gdi.h index 218e1a38b..238f3cfa8 100644 --- a/client/Windows/wf_gdi.h +++ b/client/Windows/wf_gdi.h @@ -31,7 +31,7 @@ void wf_update_offset(wfContext* wfc); void wf_resize_window(wfContext* wfc); void wf_toggle_fullscreen(wfContext* wfc); -void wf_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate); +BOOL wf_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate); void wf_gdi_register_update_callbacks(rdpUpdate* update); void wf_update_canvas_diff(wfContext* wfc); diff --git a/client/Windows/wf_rail.c b/client/Windows/wf_rail.c index c88d3557a..01c85fb81 100644 --- a/client/Windows/wf_rail.c +++ b/client/Windows/wf_rail.c @@ -420,7 +420,7 @@ LRESULT CALLBACK wf_RailWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPara WS_OVERLAPPED | WS_VSCROLL | WS_HSCROLL | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX) #define RAIL_DISABLED_EXTENDED_WINDOW_STYLES (WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE | WS_EX_WINDOWEDGE) -static void wf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* windowState) +static BOOL wf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* windowState) { wfRailWindow* railWindow = NULL; wfContext* wfc = (wfContext*) context; @@ -438,7 +438,7 @@ static void wf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderI railWindow = (wfRailWindow*) calloc(1, sizeof(wfRailWindow)); if (!railWindow) - return; + return FALSE; railWindow->wfc = wfc; @@ -509,7 +509,7 @@ static void wf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderI UpdateWindow(railWindow->hWnd); - return; + return TRUE; } else { @@ -518,7 +518,7 @@ static void wf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderI } if (!railWindow) - return; + return TRUE; if ((fieldFlags & WINDOW_ORDER_FIELD_WND_OFFSET) || (fieldFlags & WINDOW_ORDER_FIELD_WND_SIZE)) @@ -643,9 +643,10 @@ static void wf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderI } UpdateWindow(railWindow->hWnd); + return TRUE; } -static void wf_rail_window_delete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) +static BOOL wf_rail_window_delete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) { wfRailWindow* railWindow = NULL; wfContext* wfc = (wfContext*) context; @@ -657,16 +658,17 @@ static void wf_rail_window_delete(rdpContext* context, WINDOW_ORDER_INFO* orderI (void*) (UINT_PTR) orderInfo->windowId); if (!railWindow) - return; + return TRUE; HashTable_Remove(wfc->railWindows, (void*) (UINT_PTR) orderInfo->windowId); DestroyWindow(railWindow->hWnd); free(railWindow); + return TRUE; } -static void wf_rail_window_icon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_ICON_ORDER* windowIcon) +static BOOL wf_rail_window_icon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_ICON_ORDER* windowIcon) { HDC hDC; int bpp; @@ -689,7 +691,7 @@ static void wf_rail_window_icon(rdpContext* context, WINDOW_ORDER_INFO* orderInf (void*) (UINT_PTR) orderInfo->windowId); if (!railWindow) - return; + return TRUE; bigIcon = (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_ICON_BIG) ? TRUE : FALSE; @@ -747,11 +749,13 @@ static void wf_rail_window_icon(rdpContext* context, WINDOW_ORDER_INFO* orderInf { /* icon should be cached */ } + return TRUE; } -static void wf_rail_window_cached_icon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_CACHED_ICON_ORDER* windowCachedIcon) +static BOOL wf_rail_window_cached_icon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_CACHED_ICON_ORDER* windowCachedIcon) { WLog_DBG(TAG, "RailWindowCachedIcon"); + return TRUE; } static void wf_rail_notify_icon_common(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) @@ -789,7 +793,7 @@ static void wf_rail_notify_icon_common(rdpContext* context, WINDOW_ORDER_INFO* o } } -static void wf_rail_notify_icon_create(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) +static BOOL wf_rail_notify_icon_create(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) { wfContext* wfc = (wfContext*) context; RailClientContext* rail = wfc->rail; @@ -797,9 +801,10 @@ static void wf_rail_notify_icon_create(rdpContext* context, WINDOW_ORDER_INFO* o WLog_DBG(TAG, "RailNotifyIconCreate"); wf_rail_notify_icon_common(context, orderInfo, notifyIconState); + return TRUE; } -static void wf_rail_notify_icon_update(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) +static BOOL wf_rail_notify_icon_update(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) { wfContext* wfc = (wfContext*) context; RailClientContext* rail = wfc->rail; @@ -807,30 +812,34 @@ static void wf_rail_notify_icon_update(rdpContext* context, WINDOW_ORDER_INFO* o WLog_DBG(TAG, "RailNotifyIconUpdate"); wf_rail_notify_icon_common(context, orderInfo, notifyIconState); + return TRUE; } -static void wf_rail_notify_icon_delete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) +static BOOL wf_rail_notify_icon_delete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) { wfContext* wfc = (wfContext*) context; RailClientContext* rail = wfc->rail; WLog_DBG(TAG, "RailNotifyIconDelete"); + return TRUE; } -static void wf_rail_monitored_desktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, MONITORED_DESKTOP_ORDER* monitoredDesktop) +static BOOL wf_rail_monitored_desktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, MONITORED_DESKTOP_ORDER* monitoredDesktop) { wfContext* wfc = (wfContext*) context; RailClientContext* rail = wfc->rail; WLog_DBG(TAG, "RailMonitorDesktop"); + return TRUE; } -static void wf_rail_non_monitored_desktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) +static BOOL wf_rail_non_monitored_desktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) { wfContext* wfc = (wfContext*) context; RailClientContext* rail = wfc->rail; WLog_DBG(TAG, "RailNonMonitorDesktop"); + return TRUE; } void wf_rail_register_update_callbacks(rdpUpdate* update) diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index d581ef1f3..59e35de4a 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -267,14 +267,15 @@ static void xf_desktop_resize(rdpContext* context) } } -void xf_sw_begin_paint(rdpContext* context) +BOOL xf_sw_begin_paint(rdpContext* context) { rdpGdi* gdi = context->gdi; gdi->primary->hdc->hwnd->invalid->null = 1; gdi->primary->hdc->hwnd->ninvalid = 0; + return TRUE; } -void xf_sw_end_paint(rdpContext* context) +BOOL xf_sw_end_paint(rdpContext* context) { int i; INT32 x, y; @@ -297,7 +298,7 @@ void xf_sw_end_paint(rdpContext* context) if (!xfc->complex_regions) { if (gdi->primary->hdc->hwnd->invalid->null) - return; + return TRUE; xf_lock_x11(xfc, FALSE); @@ -310,7 +311,7 @@ void xf_sw_end_paint(rdpContext* context) else { if (gdi->primary->hdc->hwnd->ninvalid < 1) - return; + return TRUE; xf_lock_x11(xfc, FALSE); @@ -334,7 +335,7 @@ void xf_sw_end_paint(rdpContext* context) else { if (gdi->primary->hdc->hwnd->invalid->null) - return; + return TRUE; xf_lock_x11(xfc, FALSE); @@ -342,9 +343,10 @@ void xf_sw_end_paint(rdpContext* context) xf_unlock_x11(xfc, FALSE); } + return TRUE; } -void xf_sw_desktop_resize(rdpContext* context) +BOOL xf_sw_desktop_resize(rdpContext* context) { rdpGdi* gdi = context->gdi; xfContext* xfc = (xfContext*) context; @@ -368,16 +370,18 @@ void xf_sw_desktop_resize(rdpContext* context) xf_desktop_resize(context); xf_unlock_x11(xfc, TRUE); + return TRUE; } -void xf_hw_begin_paint(rdpContext* context) +BOOL xf_hw_begin_paint(rdpContext* context) { xfContext* xfc = (xfContext*) context; xfc->hdc->hwnd->invalid->null = 1; xfc->hdc->hwnd->ninvalid = 0; + return TRUE; } -void xf_hw_end_paint(rdpContext* context) +BOOL xf_hw_end_paint(rdpContext* context) { INT32 x, y; UINT32 w, h; @@ -388,7 +392,7 @@ void xf_hw_end_paint(rdpContext* context) if (!xfc->complex_regions) { if (xfc->hdc->hwnd->invalid->null) - return; + return TRUE; x = xfc->hdc->hwnd->invalid->x; y = xfc->hdc->hwnd->invalid->y; @@ -408,7 +412,7 @@ void xf_hw_end_paint(rdpContext* context) HGDI_RGN cinvalid; if (xfc->hdc->hwnd->ninvalid < 1) - return; + return TRUE; ninvalid = xfc->hdc->hwnd->ninvalid; cinvalid = xfc->hdc->hwnd->cinvalid; @@ -433,7 +437,7 @@ void xf_hw_end_paint(rdpContext* context) else { if (xfc->hdc->hwnd->invalid->null) - return; + return TRUE; x = xfc->hdc->hwnd->invalid->x; y = xfc->hdc->hwnd->invalid->y; @@ -446,9 +450,10 @@ void xf_hw_end_paint(rdpContext* context) xf_unlock_x11(xfc, FALSE); } + return TRUE; } -void xf_hw_desktop_resize(rdpContext* context) +BOOL xf_hw_desktop_resize(rdpContext* context) { xfContext* xfc = (xfContext*) context; rdpSettings* settings = xfc->settings; @@ -461,6 +466,7 @@ void xf_hw_desktop_resize(rdpContext* context) xf_desktop_resize(context); xf_unlock_x11(xfc, TRUE); + return TRUE; } BOOL xf_get_fds(freerdp* instance, void** rfds, int* rcount, void** wfds, int* wcount) @@ -879,10 +885,11 @@ int _xf_error_handler(Display* d, XErrorEvent* ev) return xf_error_handler(d, ev); } -static void xf_play_sound(rdpContext* context, PLAY_SOUND_UPDATE* play_sound) +static BOOL xf_play_sound(rdpContext* context, PLAY_SOUND_UPDATE* play_sound) { xfContext* xfc = (xfContext*) context; XkbBell(xfc->display, None, 100, 0); + return TRUE; } void xf_check_extensions(xfContext* context) @@ -1582,10 +1589,12 @@ static void xf_PanningChangeEventHandler(rdpContext* context, PanningChangeEvent * Client Interface */ -static void xfreerdp_client_global_init() +static BOOL xfreerdp_client_global_init() { setlocale(LC_ALL, ""); - freerdp_handle_signals(); + if (freerdp_handle_signals() != 0) + return FALSE; + return TRUE; } static void xfreerdp_client_global_uninit() diff --git a/client/X11/xf_gdi.c b/client/X11/xf_gdi.c index 131080fa2..fdb1004ec 100644 --- a/client/X11/xf_gdi.c +++ b/client/X11/xf_gdi.c @@ -325,7 +325,7 @@ Pixmap xf_mono_bitmap_new(xfContext* xfc, int width, int height, BYTE* data) return bitmap; } -void xf_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) +BOOL xf_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) { int status; int nXDst; @@ -375,7 +375,7 @@ void xf_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) xfc->bitmap_buffer = (BYTE*) _aligned_realloc(xfc->bitmap_buffer, xfc->bitmap_size, 16); if (!xfc->bitmap_buffer) - return; + return FALSE; } if (compressed) @@ -400,7 +400,7 @@ void xf_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) if (status < 0) { WLog_ERR(TAG, "bitmap decompression failure"); - return; + return FALSE; } pSrcData = xfc->bitmap_buffer; @@ -434,9 +434,10 @@ void xf_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) xf_unlock_x11(xfc, FALSE); } + return TRUE; } -void xf_gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette) +static BOOL xf_gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette) { int index; PALETTE_ENTRY* pe; @@ -454,9 +455,10 @@ void xf_gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette) } xf_unlock_x11(xfc, FALSE); + return TRUE; } -void xf_gdi_set_bounds(rdpContext* context, rdpBounds* bounds) +static BOOL xf_gdi_set_bounds(rdpContext* context, rdpBounds* bounds) { XRectangle clip; xfContext* xfc = (xfContext*) context; @@ -477,9 +479,10 @@ void xf_gdi_set_bounds(rdpContext* context, rdpBounds* bounds) } xf_unlock_x11(xfc, FALSE); + return TRUE; } -void xf_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) +static BOOL xf_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) { xfContext* xfc = (xfContext*) context; @@ -500,9 +503,10 @@ void xf_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) XSetFunction(xfc->display, xfc->gc, GXcopy); xf_unlock_x11(xfc, FALSE); + return TRUE; } -void xf_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) +static BOOL xf_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) { Pixmap pattern; rdpBrush* brush; @@ -587,9 +591,10 @@ void xf_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) XSetFunction(xfc->display, xfc->gc, GXcopy); xf_unlock_x11(xfc, FALSE); + return TRUE; } -void xf_gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) +static BOOL xf_gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) { xfContext* xfc = (xfContext*) context; @@ -608,9 +613,10 @@ void xf_gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) XSetFunction(xfc->display, xfc->gc, GXcopy); xf_unlock_x11(xfc, FALSE); + return TRUE; } -void xf_gdi_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect) +BOOL xf_gdi_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect) { UINT32 color; xfContext* xfc = (xfContext*) context; @@ -634,9 +640,10 @@ void xf_gdi_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect) } xf_unlock_x11(xfc, FALSE); + return TRUE; } -void xf_gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect) +BOOL xf_gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect) { int i; UINT32 color; @@ -666,6 +673,7 @@ void xf_gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* mult } xf_unlock_x11(xfc, FALSE); + return TRUE; } void xf_gdi_draw_nine_grid(rdpContext* context, DRAW_NINE_GRID_ORDER* draw_nine_grid) @@ -673,7 +681,7 @@ void xf_gdi_draw_nine_grid(rdpContext* context, DRAW_NINE_GRID_ORDER* draw_nine_ WLog_ERR(TAG, "DrawNineGrid"); } -void xf_gdi_line_to(rdpContext* context, LINE_TO_ORDER* line_to) +BOOL xf_gdi_line_to(rdpContext* context, LINE_TO_ORDER* line_to) { UINT32 color; xfContext* xfc = (xfContext*) context; @@ -705,6 +713,7 @@ void xf_gdi_line_to(rdpContext* context, LINE_TO_ORDER* line_to) XSetFunction(xfc->display, xfc->gc, GXcopy); xf_unlock_x11(xfc, FALSE); + return TRUE; } static void xf_gdi_invalidate_poly_region(xfContext* xfc, XPoint* points, int npoints, BOOL autoclose) @@ -746,7 +755,7 @@ static void xf_gdi_invalidate_poly_region(xfContext* xfc, XPoint* points, int np } } -void xf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) +BOOL xf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) { int i; int npoints; @@ -764,6 +773,11 @@ void xf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) npoints = polyline->numDeltaEntries + 1; points = malloc(sizeof(XPoint) * npoints); + if (!points) + { + xf_unlock_x11(xfc, FALSE); + return FALSE; + } points[0].x = polyline->xStart; points[0].y = polyline->yStart; @@ -785,9 +799,10 @@ void xf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) free(points); xf_unlock_x11(xfc, FALSE); + return TRUE; } -void xf_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) +BOOL xf_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) { xfBitmap* bitmap; xfContext* xfc = (xfContext*) context; @@ -809,9 +824,10 @@ void xf_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) XSetFunction(xfc->display, xfc->gc, GXcopy); xf_unlock_x11(xfc, FALSE); + return TRUE; } -void xf_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) +BOOL xf_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) { rdpBrush* brush; xfBitmap* bitmap; @@ -880,9 +896,10 @@ void xf_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) XSetFunction(xfc->display, xfc->gc, GXcopy); xf_unlock_x11(xfc, FALSE); + return TRUE; } -void xf_gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) +BOOL xf_gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) { int i, npoints; XPoint* points; @@ -896,6 +913,11 @@ void xf_gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) npoints = polygon_sc->numPoints + 1; points = malloc(sizeof(XPoint) * npoints); + if (!points) + { + xf_unlock_x11(xfc, FALSE); + return FALSE; + } points[0].x = polygon_sc->xStart; points[0].y = polygon_sc->yStart; @@ -936,9 +958,10 @@ void xf_gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) free(points); xf_unlock_x11(xfc, FALSE); + return TRUE; } -void xf_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) +BOOL xf_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) { int i, npoints; XPoint* points; @@ -957,6 +980,11 @@ void xf_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) npoints = polygon_cb->numPoints + 1; points = malloc(sizeof(XPoint) * npoints); + if (!points) + { + xf_unlock_x11(xfc, FALSE); + return FALSE; + } points[0].x = polygon_cb->xStart; points[0].y = polygon_cb->yStart; @@ -1029,23 +1057,27 @@ void xf_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) free(points); xf_unlock_x11(xfc, FALSE); + return TRUE; } -void xf_gdi_ellipse_sc(rdpContext* context, ELLIPSE_SC_ORDER* ellipse_sc) +BOOL xf_gdi_ellipse_sc(rdpContext* context, ELLIPSE_SC_ORDER* ellipse_sc) { - WLog_ERR(TAG, "EllipseSC"); + WLog_ERR(TAG, "Not implemented: EllipseSC"); + return TRUE; } -void xf_gdi_ellipse_cb(rdpContext* context, ELLIPSE_CB_ORDER* ellipse_cb) +BOOL xf_gdi_ellipse_cb(rdpContext* context, ELLIPSE_CB_ORDER* ellipse_cb) { - WLog_ERR(TAG, "EllipseCB"); + WLog_ERR(TAG, "Not implemented: EllipseCB"); + return TRUE; } -void xf_gdi_frame_marker(rdpContext* context, FRAME_MARKER_ORDER* frameMarker) +BOOL xf_gdi_frame_marker(rdpContext* context, FRAME_MARKER_ORDER* frameMarker) { + return TRUE; } -void xf_gdi_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surface_frame_marker) +BOOL xf_gdi_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surface_frame_marker) { rdpSettings* settings; xfContext* xfc = (xfContext*) context; @@ -1079,6 +1111,7 @@ void xf_gdi_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surf } xf_unlock_x11(xfc, FALSE); + return TRUE; } static void xf_gdi_surface_update_frame(xfContext* xfc, UINT16 tx, UINT16 ty, UINT16 width, UINT16 height) @@ -1113,7 +1146,7 @@ static void xf_gdi_surface_update_frame(xfContext* xfc, UINT16 tx, UINT16 ty, UI } } -void xf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* cmd) +BOOL xf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* cmd) { int i, tx, ty; XImage* image; @@ -1142,7 +1175,7 @@ void xf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* cmd) xfc->bitmap_buffer = (BYTE*) _aligned_realloc(xfc->bitmap_buffer, xfc->bitmap_size, 16); if (!xfc->bitmap_buffer) - return; + return FALSE; } /* Draw the tiles to primary surface, each is 64x64. */ @@ -1196,7 +1229,7 @@ void xf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* cmd) xfc->bitmap_buffer = (BYTE*) _aligned_realloc(xfc->bitmap_buffer, xfc->bitmap_size, 16); if (!xfc->bitmap_buffer) - return; + return FALSE; } pSrcData = xfc->codecs->nsc->BitmapData; @@ -1228,7 +1261,7 @@ void xf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* cmd) xfc->bitmap_buffer = (BYTE*) _aligned_realloc(xfc->bitmap_buffer, xfc->bitmap_size, 16); if (!xfc->bitmap_buffer) - return; + return FALSE; } pSrcData = cmd->bitmapData; @@ -1255,6 +1288,7 @@ void xf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* cmd) } xf_unlock_x11(xfc, FALSE); + return TRUE; } void xf_gdi_register_update_callbacks(rdpUpdate* update) diff --git a/client/X11/xf_gdi.h b/client/X11/xf_gdi.h index bd36d58e6..5467d89e0 100644 --- a/client/X11/xf_gdi.h +++ b/client/X11/xf_gdi.h @@ -26,7 +26,7 @@ #include "xfreerdp.h" void xf_gdi_register_update_callbacks(rdpUpdate* update); -void xf_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate); +BOOL xf_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate); UINT32 xf_convert_rdp_order_color(xfContext* xfc, UINT32 color); #endif /* __XF_GDI_H */ diff --git a/client/X11/xf_graphics.c b/client/X11/xf_graphics.c index bd16149b5..48ed75876 100644 --- a/client/X11/xf_graphics.c +++ b/client/X11/xf_graphics.c @@ -42,7 +42,7 @@ /* Bitmap Class */ -void xf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap) +BOOL xf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap) { int depth; BYTE* data; @@ -67,7 +67,7 @@ void xf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap) data = _aligned_malloc(bitmap->width * bitmap->height * 4, 16); if (!data) - return; + return FALSE; SrcFormat = gdi_get_pixel_format(bitmap->bpp, TRUE); @@ -91,6 +91,7 @@ void xf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap) ((xfBitmap*) bitmap)->pixmap = pixmap; xf_unlock_x11(xfc, FALSE); + return TRUE; } void xf_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap) @@ -105,7 +106,7 @@ void xf_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap) xf_unlock_x11(xfc, FALSE); } -void xf_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap) +BOOL xf_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap) { XImage* image; int width, height; @@ -129,9 +130,10 @@ void xf_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap) gdi_InvalidateRegion(xfc->hdc, bitmap->left, bitmap->top, width, height); xf_unlock_x11(xfc, FALSE); + return TRUE; } -void xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, +BOOL xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, BYTE* data, int width, int height, int bpp, int length, BOOL compressed, int codecId) { @@ -148,6 +150,8 @@ void xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, size = width * height * 4; bitmap->data = (BYTE*) _aligned_malloc(size, 16); + if (!bitmap->data) + return FALSE; pSrcData = data; SrcSize = (UINT32) length; @@ -173,7 +177,7 @@ void xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, if (status < 0) { WLog_ERR(TAG, "Bitmap Decompression Failed"); - return; + return FALSE; } } else @@ -187,9 +191,10 @@ void xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, bitmap->compressed = FALSE; bitmap->length = size; bitmap->bpp = (xfc->depth >= 24) ? 32 : xfc->depth; + return TRUE; } -void xf_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary) +BOOL xf_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary) { xfContext* xfc = (xfContext*) context; @@ -201,11 +206,12 @@ void xf_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary) xfc->drawing = ((xfBitmap*) bitmap)->pixmap; xf_unlock_x11(xfc, FALSE); + return TRUE; } /* Pointer Class */ -void xf_Pointer_New(rdpContext* context, rdpPointer* pointer) +BOOL xf_Pointer_New(rdpContext* context, rdpPointer* pointer) { #ifdef WITH_XCURSOR XcursorImage ci; @@ -224,7 +230,7 @@ void xf_Pointer_New(rdpContext* context, rdpPointer* pointer) ci.pixels = (XcursorPixel*) calloc(1, ci.width * ci.height * 4); if (!ci.pixels) - return; + return FALSE; if ((pointer->andMaskData != 0) && (pointer->xorMaskData != 0)) { @@ -239,6 +245,7 @@ void xf_Pointer_New(rdpContext* context, rdpPointer* pointer) xf_unlock_x11(xfc, FALSE); #endif + return TRUE; } void xf_Pointer_Free(rdpContext* context, rdpPointer* pointer) @@ -255,7 +262,7 @@ void xf_Pointer_Free(rdpContext* context, rdpPointer* pointer) #endif } -void xf_Pointer_Set(rdpContext* context, rdpPointer* pointer) +BOOL xf_Pointer_Set(rdpContext* context, rdpPointer* pointer) { #ifdef WITH_XCURSOR xfContext* xfc = (xfContext*) context; @@ -271,9 +278,10 @@ void xf_Pointer_Set(rdpContext* context, rdpPointer* pointer) xf_unlock_x11(xfc, FALSE); #endif + return TRUE; } -void xf_Pointer_SetNull(rdpContext* context) +BOOL xf_Pointer_SetNull(rdpContext* context) { #ifdef WITH_XCURSOR xfContext* xfc = (xfContext*) context; @@ -301,9 +309,10 @@ void xf_Pointer_SetNull(rdpContext* context) xf_unlock_x11(xfc, FALSE); #endif + return TRUE; } -void xf_Pointer_SetDefault(rdpContext* context) +BOOL xf_Pointer_SetDefault(rdpContext* context) { #ifdef WITH_XCURSOR xfContext* xfc = (xfContext*) context; @@ -317,16 +326,18 @@ void xf_Pointer_SetDefault(rdpContext* context) xf_unlock_x11(xfc, FALSE); #endif + return TRUE; } -void xf_Pointer_SetPosition(rdpContext* context, UINT32 x, UINT32 y) +BOOL xf_Pointer_SetPosition(rdpContext* context, UINT32 x, UINT32 y) { xfContext* xfc = (xfContext*) context; XWindowAttributes current; XSetWindowAttributes tmp; + BOOL ret = FALSE; if (!xfc->focused || !xfc->window) - return; + return TRUE; xf_lock_x11(xfc, FALSE); @@ -342,15 +353,16 @@ void xf_Pointer_SetPosition(rdpContext* context, UINT32 x, UINT32 y) tmp.event_mask = current.your_event_mask; XChangeWindowAttributes(xfc->display, xfc->window->handle, CWEventMask, &tmp); + ret = TRUE; out: - xf_unlock_x11(xfc, FALSE); - return; + xf_unlock_x11(xfc, FALSE); + return ret; } /* Glyph Class */ -void xf_Glyph_New(rdpContext* context, rdpGlyph* glyph) +BOOL xf_Glyph_New(rdpContext* context, rdpGlyph* glyph) { int scanline; XImage* image; @@ -376,6 +388,7 @@ void xf_Glyph_New(rdpContext* context, rdpGlyph* glyph) XFree(image); xf_unlock_x11(xfc, FALSE); + return TRUE; } void xf_Glyph_Free(rdpContext* context, rdpGlyph* glyph) @@ -390,7 +403,7 @@ void xf_Glyph_Free(rdpContext* context, rdpGlyph* glyph) xf_unlock_x11(xfc, FALSE); } -void xf_Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y) +BOOL xf_Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y) { xfGlyph* xf_glyph; xfContext* xfc = (xfContext*) context; @@ -405,9 +418,10 @@ void xf_Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y) XSetStipple(xfc->display, xfc->gc, xfc->bitmap_mono); xf_unlock_x11(xfc, FALSE); + return TRUE; } -void xf_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor, BOOL fOpRedundant) +BOOL xf_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor, BOOL fOpRedundant) { xfContext* xfc = (xfContext*) context; @@ -431,9 +445,10 @@ void xf_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height XSetFillStyle(xfc->display, xfc->gc, fOpRedundant ? FillOpaqueStippled : FillStippled); xf_unlock_x11(xfc, FALSE); + return TRUE; } -void xf_Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor) +BOOL xf_Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor) { xfContext* xfc = (xfContext*) context; @@ -445,6 +460,7 @@ void xf_Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, } xf_unlock_x11(xfc, FALSE); + return TRUE; } /* Graphics Module */ diff --git a/client/X11/xf_keyboard.c b/client/X11/xf_keyboard.c index 38b319f56..c538da6d1 100644 --- a/client/X11/xf_keyboard.c +++ b/client/X11/xf_keyboard.c @@ -550,11 +550,10 @@ BOOL xf_keyboard_handle_special_keys(xfContext* xfc, KeySym keysym) } #endif /* WITH_XRENDER defined */ #endif /* pinch/zoom/pan simulation */ - - return FALSE; + return TRUE; } -void xf_keyboard_set_indicators(rdpContext* context, UINT16 led_flags) +BOOL xf_keyboard_set_indicators(rdpContext* context, UINT16 led_flags) { xfContext* xfc = (xfContext*) context; @@ -562,4 +561,5 @@ void xf_keyboard_set_indicators(rdpContext* context, UINT16 led_flags) xf_keyboard_set_key_state(xfc, led_flags & KBD_SYNC_NUM_LOCK, XK_Num_Lock); xf_keyboard_set_key_state(xfc, led_flags & KBD_SYNC_CAPS_LOCK, XK_Caps_Lock); xf_keyboard_set_key_state(xfc, led_flags & KBD_SYNC_KANA_LOCK, XK_Kana_Lock); + return TRUE; } diff --git a/client/X11/xf_keyboard.h b/client/X11/xf_keyboard.h index 501aa7fc9..0261ed91a 100644 --- a/client/X11/xf_keyboard.h +++ b/client/X11/xf_keyboard.h @@ -57,6 +57,6 @@ BOOL xf_keyboard_get_key_state(xfContext* xfc, int state, int keysym); UINT32 xf_keyboard_get_toggle_keys_state(xfContext* xfc); void xf_keyboard_focus_in(xfContext* xfc); BOOL xf_keyboard_handle_special_keys(xfContext* xfc, KeySym keysym); -void xf_keyboard_set_indicators(rdpContext* context, UINT16 led_flags); +BOOL xf_keyboard_set_indicators(rdpContext* context, UINT16 led_flags); #endif /* __XF_KEYBOARD_H */ diff --git a/client/X11/xf_rail.c b/client/X11/xf_rail.c index 8a6330b9c..e23f8e173 100644 --- a/client/X11/xf_rail.c +++ b/client/X11/xf_rail.c @@ -272,7 +272,7 @@ void xf_rail_paint(xfContext* xfc, INT32 uleft, INT32 utop, UINT32 uright, UINT3 /* RemoteApp Core Protocol Extension */ -static void xf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* windowState) +static BOOL xf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* windowState) { xfAppWindow* appWindow = NULL; xfContext* xfc = (xfContext*) context; @@ -283,7 +283,7 @@ static void xf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderI appWindow = (xfAppWindow*) calloc(1, sizeof(xfAppWindow)); if (!appWindow) - return; + return FALSE; appWindow->xfc = xfc; @@ -317,7 +317,7 @@ static void xf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderI xf_AppWindowInit(xfc, appWindow); - return; + return TRUE; } else { @@ -326,7 +326,7 @@ static void xf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderI } if (!appWindow) - return; + return FALSE; /* Update Parameters */ @@ -421,7 +421,7 @@ static void xf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderI appWindow->windowRects = (RECTANGLE_16*) calloc(appWindow->numWindowRects, sizeof(RECTANGLE_16)); if (!appWindow->windowRects) - return; + return FALSE; CopyMemory(appWindow->windowRects, windowState->windowRects, appWindow->numWindowRects * sizeof(RECTANGLE_16)); @@ -449,7 +449,7 @@ static void xf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderI appWindow->visibilityRects = (RECTANGLE_16*) calloc(appWindow->numVisibilityRects, sizeof(RECTANGLE_16)); if (!appWindow->visibilityRects) - return; + return FALSE; CopyMemory(appWindow->visibilityRects, windowState->visibilityRects, appWindow->numVisibilityRects * sizeof(RECTANGLE_16)); @@ -482,7 +482,7 @@ static void xf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderI * update our local window when that rail window state is minimized */ if (appWindow->rail_state == WINDOW_SHOW_MINIMIZED) - return; + return TRUE; /* Do nothing if window is already in the correct position */ if (appWindow->x == (appWindow->windowOffsetX - appWindow->localWindowOffsetCorrX) && @@ -491,7 +491,7 @@ static void xf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderI appWindow->height == appWindow->windowHeight) { xf_UpdateWindowArea(xfc, appWindow, 0, 0, appWindow->windowWidth, appWindow->windowHeight); - return; + return TRUE; } xf_MoveWindow(xfc, appWindow, appWindow->windowOffsetX - appWindow->localWindowOffsetCorrX, appWindow->windowOffsetY - appWindow->localWindowOffsetCorrY, @@ -507,9 +507,10 @@ static void xf_rail_window_common(rdpContext* context, WINDOW_ORDER_INFO* orderI { xf_SetWindowVisibilityRects(xfc, appWindow, appWindow->visibilityRects, appWindow->numVisibilityRects); } + return TRUE; } -static void xf_rail_window_delete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) +static BOOL xf_rail_window_delete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) { xfAppWindow* appWindow = NULL; xfContext* xfc = (xfContext*) context; @@ -518,14 +519,15 @@ static void xf_rail_window_delete(rdpContext* context, WINDOW_ORDER_INFO* orderI (void*) (UINT_PTR) orderInfo->windowId); if (!appWindow) - return; + return TRUE; HashTable_Remove(xfc->railWindows, (void*) (UINT_PTR) orderInfo->windowId); xf_DestroyWindow(xfc, appWindow); + return TRUE; } -static void xf_rail_window_icon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_ICON_ORDER* windowIcon) +static BOOL xf_rail_window_icon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_ICON_ORDER* windowIcon) { BOOL bigIcon; xfAppWindow* railWindow; @@ -535,17 +537,19 @@ static void xf_rail_window_icon(rdpContext* context, WINDOW_ORDER_INFO* orderInf (void*) (UINT_PTR) orderInfo->windowId); if (!railWindow) - return; + return FALSE; bigIcon = (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_ICON_BIG) ? TRUE : FALSE; + + return TRUE; } -static void xf_rail_window_cached_icon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_CACHED_ICON_ORDER* windowCachedIcon) +static BOOL xf_rail_window_cached_icon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_CACHED_ICON_ORDER* windowCachedIcon) { - + return TRUE; } -static void xf_rail_notify_icon_common(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) +static BOOL xf_rail_notify_icon_common(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) { if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_NOTIFY_VERSION) { @@ -576,32 +580,34 @@ static void xf_rail_notify_icon_common(rdpContext* context, WINDOW_ORDER_INFO* o { } + return TRUE; } -static void xf_rail_notify_icon_create(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) +static BOOL xf_rail_notify_icon_create(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) { - xf_rail_notify_icon_common(context, orderInfo, notifyIconState); + return xf_rail_notify_icon_common(context, orderInfo, notifyIconState); } -static void xf_rail_notify_icon_update(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) +static BOOL xf_rail_notify_icon_update(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) { - xf_rail_notify_icon_common(context, orderInfo, notifyIconState); + return xf_rail_notify_icon_common(context, orderInfo, notifyIconState); } -static void xf_rail_notify_icon_delete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) +static BOOL xf_rail_notify_icon_delete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) { - + return TRUE; } -static void xf_rail_monitored_desktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, MONITORED_DESKTOP_ORDER* monitoredDesktop) +static BOOL xf_rail_monitored_desktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, MONITORED_DESKTOP_ORDER* monitoredDesktop) { - + return TRUE; } -static void xf_rail_non_monitored_desktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) +static BOOL xf_rail_non_monitored_desktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) { xfContext* xfc = (xfContext*) context; xf_rail_disable_remoteapp_mode(xfc); + return TRUE; } void xf_rail_register_update_callbacks(rdpUpdate* update) diff --git a/client/iOS/FreeRDP/ios_freerdp_ui.h b/client/iOS/FreeRDP/ios_freerdp_ui.h index 7753d1ae5..9da8748e6 100644 --- a/client/iOS/FreeRDP/ios_freerdp_ui.h +++ b/client/iOS/FreeRDP/ios_freerdp_ui.h @@ -9,9 +9,9 @@ #import "ios_freerdp.h" -void ios_ui_begin_paint(rdpContext * context); -void ios_ui_end_paint(rdpContext * context); -void ios_ui_resize_window(rdpContext * context); +BOOL ios_ui_begin_paint(rdpContext * context); +BOOL ios_ui_end_paint(rdpContext * context); +BOOL ios_ui_resize_window(rdpContext * context); BOOL ios_ui_authenticate(freerdp * instance, char** username, char** password, char** domain); BOOL ios_ui_check_certificate(freerdp * instance, char * subject, char * issuer, char * fingerprint); diff --git a/client/iOS/FreeRDP/ios_freerdp_ui.m b/client/iOS/FreeRDP/ios_freerdp_ui.m index bc58ba217..2ecdbbf8b 100644 --- a/client/iOS/FreeRDP/ios_freerdp_ui.m +++ b/client/iOS/FreeRDP/ios_freerdp_ui.m @@ -94,13 +94,14 @@ BOOL ios_ui_check_changed_certificate(freerdp * instance, char * subject, char * #pragma mark - #pragma mark Graphics updates -void ios_ui_begin_paint(rdpContext * context) +BOOL ios_ui_begin_paint(rdpContext * context) { rdpGdi *gdi = context->gdi; gdi->primary->hdc->hwnd->invalid->null = 1; + return TRUE; } -void ios_ui_end_paint(rdpContext * context) +BOOL ios_ui_end_paint(rdpContext * context) { mfInfo* mfi = MFI_FROM_INSTANCE(context->instance); rdpGdi *gdi = context->gdi; @@ -108,12 +109,14 @@ void ios_ui_end_paint(rdpContext * context) if (gdi->primary->hdc->hwnd->invalid->null == 0) [mfi->session performSelectorOnMainThread:@selector(setNeedsDisplayInRectAsValue:) withObject:[NSValue valueWithCGRect:dirty_rect] waitUntilDone:NO]; + return TRUE; } -void ios_ui_resize_window(rdpContext * context) +BOOL ios_ui_resize_window(rdpContext * context) { ios_resize_display_buffer(MFI_FROM_INSTANCE(context->instance)); + return TRUE; } diff --git a/include/freerdp/altsec.h b/include/freerdp/altsec.h index 91aa20665..84c71d880 100644 --- a/include/freerdp/altsec.h +++ b/include/freerdp/altsec.h @@ -165,18 +165,18 @@ struct _DRAW_GDIPLUS_CACHE_END_ORDER }; typedef struct _DRAW_GDIPLUS_CACHE_END_ORDER DRAW_GDIPLUS_CACHE_END_ORDER; -typedef void (*pCreateOffscreenBitmap)(rdpContext* context, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap); -typedef void (*pSwitchSurface)(rdpContext* context, SWITCH_SURFACE_ORDER* switch_surface); -typedef void (*pCreateNineGridBitmap)(rdpContext* context, CREATE_NINE_GRID_BITMAP_ORDER* create_nine_grid_bitmap); -typedef void (*pFrameMarker)(rdpContext* context, FRAME_MARKER_ORDER* frame_marker); -typedef void (*pStreamBitmapFirst)(rdpContext* context, STREAM_BITMAP_FIRST_ORDER* stream_bitmap_first); -typedef void (*pStreamBitmapNext)(rdpContext* context, STREAM_BITMAP_NEXT_ORDER* stream_bitmap_next); -typedef void (*pDrawGdiPlusFirst)(rdpContext* context, DRAW_GDIPLUS_FIRST_ORDER* draw_gdiplus_first); -typedef void (*pDrawGdiPlusNext)(rdpContext* context, DRAW_GDIPLUS_NEXT_ORDER* draw_gdiplus_next); -typedef void (*pDrawGdiPlusEnd)(rdpContext* context, DRAW_GDIPLUS_END_ORDER* draw_gdiplus_end); -typedef void (*pDrawGdiPlusCacheFirst)(rdpContext* context, DRAW_GDIPLUS_CACHE_FIRST_ORDER* draw_gdiplus_cache_first); -typedef void (*pDrawGdiPlusCacheNext)(rdpContext* context, DRAW_GDIPLUS_CACHE_NEXT_ORDER* draw_gdiplus_cache_next); -typedef void (*pDrawGdiPlusCacheEnd)(rdpContext* context, DRAW_GDIPLUS_CACHE_END_ORDER* draw_gdiplus_cache_end); +typedef BOOL (*pCreateOffscreenBitmap)(rdpContext* context, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap); +typedef BOOL (*pSwitchSurface)(rdpContext* context, SWITCH_SURFACE_ORDER* switch_surface); +typedef BOOL (*pCreateNineGridBitmap)(rdpContext* context, CREATE_NINE_GRID_BITMAP_ORDER* create_nine_grid_bitmap); +typedef BOOL (*pFrameMarker)(rdpContext* context, FRAME_MARKER_ORDER* frame_marker); +typedef BOOL (*pStreamBitmapFirst)(rdpContext* context, STREAM_BITMAP_FIRST_ORDER* stream_bitmap_first); +typedef BOOL (*pStreamBitmapNext)(rdpContext* context, STREAM_BITMAP_NEXT_ORDER* stream_bitmap_next); +typedef BOOL (*pDrawGdiPlusFirst)(rdpContext* context, DRAW_GDIPLUS_FIRST_ORDER* draw_gdiplus_first); +typedef BOOL (*pDrawGdiPlusNext)(rdpContext* context, DRAW_GDIPLUS_NEXT_ORDER* draw_gdiplus_next); +typedef BOOL (*pDrawGdiPlusEnd)(rdpContext* context, DRAW_GDIPLUS_END_ORDER* draw_gdiplus_end); +typedef BOOL (*pDrawGdiPlusCacheFirst)(rdpContext* context, DRAW_GDIPLUS_CACHE_FIRST_ORDER* draw_gdiplus_cache_first); +typedef BOOL (*pDrawGdiPlusCacheNext)(rdpContext* context, DRAW_GDIPLUS_CACHE_NEXT_ORDER* draw_gdiplus_cache_next); +typedef BOOL (*pDrawGdiPlusCacheEnd)(rdpContext* context, DRAW_GDIPLUS_CACHE_END_ORDER* draw_gdiplus_cache_end); struct rdp_altsec_update { diff --git a/include/freerdp/api.h b/include/freerdp/api.h index de25d8d39..24a2ee35e 100644 --- a/include/freerdp/api.h +++ b/include/freerdp/api.h @@ -66,5 +66,6 @@ #define IFCALL(_cb, ...) do { if (_cb != NULL) { _cb( __VA_ARGS__ ); } } while (0) #define IFCALLRET(_cb, _ret, ...) do { if (_cb != NULL) { _ret = _cb( __VA_ARGS__ ); } } while (0) +#define IFCALLRETURN(_default_return, _cb, ...) do { if (_cb != NULL) { return _cb( __VA_ARGS__ ); } else { return _default_return;} } while (0) #endif /* FREERDP_API */ diff --git a/include/freerdp/client.h b/include/freerdp/client.h index 714a4a7d0..cedc29239 100644 --- a/include/freerdp/client.h +++ b/include/freerdp/client.h @@ -31,7 +31,7 @@ extern "C" { * Client Entry Points */ -typedef void (*pRdpGlobalInit)(void); +typedef BOOL (*pRdpGlobalInit)(void); typedef void (*pRdpGlobalUninit)(void); typedef int (*pRdpClientNew)(freerdp* instance, rdpContext* context); diff --git a/include/freerdp/graphics.h b/include/freerdp/graphics.h index 5553d5c5a..90c22e1c4 100644 --- a/include/freerdp/graphics.h +++ b/include/freerdp/graphics.h @@ -35,13 +35,13 @@ extern "C" { /* Bitmap Class */ -typedef void (*pBitmap_New)(rdpContext* context, rdpBitmap* bitmap); +typedef BOOL (*pBitmap_New)(rdpContext* context, rdpBitmap* bitmap); typedef void (*pBitmap_Free)(rdpContext* context, rdpBitmap* bitmap); -typedef void (*pBitmap_Paint)(rdpContext* context, rdpBitmap* bitmap); -typedef void (*pBitmap_Decompress)(rdpContext* context, rdpBitmap* bitmap, +typedef BOOL (*pBitmap_Paint)(rdpContext* context, rdpBitmap* bitmap); +typedef BOOL (*pBitmap_Decompress)(rdpContext* context, rdpBitmap* bitmap, BYTE* data, int width, int height, int bpp, int length, BOOL compressed, int codec_id); -typedef void (*pBitmap_SetSurface)(rdpContext* context, rdpBitmap* bitmap, BOOL primary); +typedef BOOL (*pBitmap_SetSurface)(rdpContext* context, rdpBitmap* bitmap, BOOL primary); struct rdp_bitmap { @@ -71,24 +71,24 @@ struct rdp_bitmap }; FREERDP_API rdpBitmap* Bitmap_Alloc(rdpContext* context); -FREERDP_API void Bitmap_New(rdpContext* context, rdpBitmap* bitmap); +FREERDP_API BOOL Bitmap_New(rdpContext* context, rdpBitmap* bitmap); FREERDP_API void Bitmap_Free(rdpContext* context, rdpBitmap* bitmap); -FREERDP_API void Bitmap_Register(rdpContext* context, rdpBitmap* bitmap); -FREERDP_API void Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, +FREERDP_API BOOL Bitmap_Register(rdpContext* context, rdpBitmap* bitmap); +FREERDP_API BOOL Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, BYTE* data, int width, int height, int bpp, int length, BOOL compressed); FREERDP_API void Bitmap_SetRectangle(rdpContext* context, rdpBitmap* bitmap, UINT16 left, UINT16 top, UINT16 right, UINT16 bottom); FREERDP_API void Bitmap_SetDimensions(rdpContext* context, rdpBitmap* bitmap, UINT16 width, UINT16 height); -FREERDP_API void Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary); +FREERDP_API BOOL Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary); /* Pointer Class */ -typedef void (*pPointer_New)(rdpContext* context, rdpPointer* pointer); +typedef BOOL (*pPointer_New)(rdpContext* context, rdpPointer* pointer); typedef void (*pPointer_Free)(rdpContext* context, rdpPointer* pointer); -typedef void (*pPointer_Set)(rdpContext* context, rdpPointer* pointer); -typedef void (*pPointer_SetNull)(rdpContext* context); -typedef void (*pPointer_SetDefault)(rdpContext* context); -typedef void (*pPointer_SetPosition)(rdpContext* context, UINT32 x, UINT32 y); +typedef BOOL (*pPointer_Set)(rdpContext* context, rdpPointer* pointer); +typedef BOOL (*pPointer_SetNull)(rdpContext* context); +typedef BOOL (*pPointer_SetDefault)(rdpContext* context); +typedef BOOL (*pPointer_SetPosition)(rdpContext* context, UINT32 x, UINT32 y); struct rdp_pointer { @@ -114,20 +114,20 @@ struct rdp_pointer }; FREERDP_API rdpPointer* Pointer_Alloc(rdpContext* context); -FREERDP_API void Pointer_New(rdpContext* context, rdpPointer* pointer); +FREERDP_API BOOL Pointer_New(rdpContext* context, rdpPointer* pointer); FREERDP_API void Pointer_Free(rdpContext* context, rdpPointer* pointer); -FREERDP_API void Pointer_Set(rdpContext* context, rdpPointer* pointer); -FREERDP_API void Pointer_SetNull(rdpContext* context); -FREERDP_API void Pointer_SetDefault(rdpContext* context); -FREERDP_API void Pointer_SetPosition(rdpContext* context, UINT32 x, UINT32 y); +FREERDP_API BOOL Pointer_Set(rdpContext* context, rdpPointer* pointer); +FREERDP_API BOOL Pointer_SetNull(rdpContext* context); +FREERDP_API BOOL Pointer_SetDefault(rdpContext* context); +FREERDP_API BOOL Pointer_SetPosition(rdpContext* context, UINT32 x, UINT32 y); /* Glyph Class */ -typedef void (*pGlyph_New)(rdpContext* context, rdpGlyph* glyph); +typedef BOOL (*pGlyph_New)(rdpContext* context, rdpGlyph* glyph); typedef void (*pGlyph_Free)(rdpContext* context, rdpGlyph* glyph); -typedef void (*pGlyph_Draw)(rdpContext* context, rdpGlyph* glyph, int x, int y); -typedef void (*pGlyph_BeginDraw)(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor, BOOL fOpRedundant); -typedef void (*pGlyph_EndDraw)(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor); +typedef BOOL (*pGlyph_Draw)(rdpContext* context, rdpGlyph* glyph, int x, int y); +typedef BOOL (*pGlyph_BeginDraw)(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor, BOOL fOpRedundant); +typedef BOOL (*pGlyph_EndDraw)(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor); struct rdp_glyph { @@ -149,11 +149,11 @@ struct rdp_glyph }; FREERDP_API rdpGlyph* Glyph_Alloc(rdpContext* context); -FREERDP_API void Glyph_New(rdpContext* context, rdpGlyph* glyph); +FREERDP_API BOOL Glyph_New(rdpContext* context, rdpGlyph* glyph); FREERDP_API void Glyph_Free(rdpContext* context, rdpGlyph* glyph); -FREERDP_API void Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y); -FREERDP_API void Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor, BOOL fOpRedundant); -FREERDP_API void Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor); +FREERDP_API BOOL Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y); +FREERDP_API BOOL Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor, BOOL fOpRedundant); +FREERDP_API BOOL Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor); /* Graphics Module */ diff --git a/include/freerdp/input.h b/include/freerdp/input.h index 5f5ffe838..57047129a 100644 --- a/include/freerdp/input.h +++ b/include/freerdp/input.h @@ -62,13 +62,13 @@ typedef struct rdp_input_proxy rdpInputProxy; /* Input Interface */ -typedef void (*pSynchronizeEvent)(rdpInput* input, UINT32 flags); -typedef void (*pKeyboardEvent)(rdpInput* input, UINT16 flags, UINT16 code); -typedef void (*pUnicodeKeyboardEvent)(rdpInput* input, UINT16 flags, UINT16 code); -typedef void (*pMouseEvent)(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); -typedef void (*pExtendedMouseEvent)(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); -typedef void (*pFocusInEvent)(rdpInput* input, UINT16 toggleStates); -typedef void (*pKeyboardPauseEvent)(rdpInput* input); +typedef BOOL (*pSynchronizeEvent)(rdpInput* input, UINT32 flags); +typedef BOOL (*pKeyboardEvent)(rdpInput* input, UINT16 flags, UINT16 code); +typedef BOOL (*pUnicodeKeyboardEvent)(rdpInput* input, UINT16 flags, UINT16 code); +typedef BOOL (*pMouseEvent)(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); +typedef BOOL (*pExtendedMouseEvent)(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); +typedef BOOL (*pFocusInEvent)(rdpInput* input, UINT16 toggleStates); +typedef BOOL (*pKeyboardPauseEvent)(rdpInput* input); struct rdp_input { @@ -97,14 +97,14 @@ struct rdp_input extern "C" { #endif -FREERDP_API void freerdp_input_send_synchronize_event(rdpInput* input, UINT32 flags); -FREERDP_API void freerdp_input_send_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code); -FREERDP_API void freerdp_input_send_keyboard_event_ex(rdpInput* input, BOOL down, UINT32 rdp_scancode); -FREERDP_API void freerdp_input_send_keyboard_pause_event(rdpInput* input); -FREERDP_API void freerdp_input_send_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code); -FREERDP_API void freerdp_input_send_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); -FREERDP_API void freerdp_input_send_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); -FREERDP_API void freerdp_input_send_focus_in_event(rdpInput* input, UINT16 toggleStates); +FREERDP_API BOOL freerdp_input_send_synchronize_event(rdpInput* input, UINT32 flags); +FREERDP_API BOOL freerdp_input_send_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code); +FREERDP_API BOOL freerdp_input_send_keyboard_event_ex(rdpInput* input, BOOL down, UINT32 rdp_scancode); +FREERDP_API BOOL freerdp_input_send_keyboard_pause_event(rdpInput* input); +FREERDP_API BOOL freerdp_input_send_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code); +FREERDP_API BOOL freerdp_input_send_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); +FREERDP_API BOOL freerdp_input_send_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); +FREERDP_API BOOL freerdp_input_send_focus_in_event(rdpInput* input, UINT16 toggleStates); #ifdef __cplusplus } diff --git a/include/freerdp/pointer.h b/include/freerdp/pointer.h index 65181f74f..65759b4e9 100644 --- a/include/freerdp/pointer.h +++ b/include/freerdp/pointer.h @@ -71,11 +71,11 @@ struct _POINTER_CACHED_UPDATE }; typedef struct _POINTER_CACHED_UPDATE POINTER_CACHED_UPDATE; -typedef void (*pPointerPosition)(rdpContext* context, POINTER_POSITION_UPDATE* pointer_position); -typedef void (*pPointerSystem)(rdpContext* context, POINTER_SYSTEM_UPDATE* pointer_system); -typedef void (*pPointerColor)(rdpContext* context, POINTER_COLOR_UPDATE* pointer_color); -typedef void (*pPointerNew)(rdpContext* context, POINTER_NEW_UPDATE* pointer_new); -typedef void (*pPointerCached)(rdpContext* context, POINTER_CACHED_UPDATE* pointer_cached); +typedef BOOL (*pPointerPosition)(rdpContext* context, POINTER_POSITION_UPDATE* pointer_position); +typedef BOOL (*pPointerSystem)(rdpContext* context, POINTER_SYSTEM_UPDATE* pointer_system); +typedef BOOL (*pPointerColor)(rdpContext* context, POINTER_COLOR_UPDATE* pointer_color); +typedef BOOL (*pPointerNew)(rdpContext* context, POINTER_NEW_UPDATE* pointer_new); +typedef BOOL (*pPointerCached)(rdpContext* context, POINTER_CACHED_UPDATE* pointer_cached); struct rdp_pointer_update { diff --git a/include/freerdp/primary.h b/include/freerdp/primary.h index 48d9af005..2897a4d22 100644 --- a/include/freerdp/primary.h +++ b/include/freerdp/primary.h @@ -438,28 +438,28 @@ struct _ELLIPSE_CB_ORDER }; typedef struct _ELLIPSE_CB_ORDER ELLIPSE_CB_ORDER; -typedef void (*pDstBlt)(rdpContext* context, DSTBLT_ORDER* dstblt); -typedef void (*pPatBlt)(rdpContext* context, PATBLT_ORDER* patblt); -typedef void (*pScrBlt)(rdpContext* context, SCRBLT_ORDER* scrblt); -typedef void (*pOpaqueRect)(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect); -typedef void (*pDrawNineGrid)(rdpContext* context, DRAW_NINE_GRID_ORDER* draw_nine_grid); -typedef void (*pMultiDstBlt)(rdpContext* context, MULTI_DSTBLT_ORDER* multi_dstblt); -typedef void (*pMultiPatBlt)(rdpContext* context, MULTI_PATBLT_ORDER* multi_patblt); -typedef void (*pMultiScrBlt)(rdpContext* context, MULTI_SCRBLT_ORDER* multi_scrblt); -typedef void (*pMultiOpaqueRect)(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect); -typedef void (*pMultiDrawNineGrid)(rdpContext* context, MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid); -typedef void (*pLineTo)(rdpContext* context, LINE_TO_ORDER* line_to); -typedef void (*pPolyline)(rdpContext* context, POLYLINE_ORDER* polyline); -typedef void (*pMemBlt)(rdpContext* context, MEMBLT_ORDER* memblt); -typedef void (*pMem3Blt)(rdpContext* context, MEM3BLT_ORDER* memblt); -typedef void (*pSaveBitmap)(rdpContext* context, SAVE_BITMAP_ORDER* save_bitmap); -typedef void (*pGlyphIndex)(rdpContext* context, GLYPH_INDEX_ORDER* glyph_index); -typedef void (*pFastIndex)(rdpContext* context, FAST_INDEX_ORDER* fast_index); -typedef void (*pFastGlyph)(rdpContext* context, FAST_GLYPH_ORDER* fast_glyph); -typedef void (*pPolygonSC)(rdpContext* context, POLYGON_SC_ORDER* polygon_sc); -typedef void (*pPolygonCB)(rdpContext* context, POLYGON_CB_ORDER* polygon_cb); -typedef void (*pEllipseSC)(rdpContext* context, ELLIPSE_SC_ORDER* ellipse_sc); -typedef void (*pEllipseCB)(rdpContext* context, ELLIPSE_CB_ORDER* ellipse_cb); +typedef BOOL (*pDstBlt)(rdpContext* context, DSTBLT_ORDER* dstblt); +typedef BOOL (*pPatBlt)(rdpContext* context, PATBLT_ORDER* patblt); +typedef BOOL (*pScrBlt)(rdpContext* context, SCRBLT_ORDER* scrblt); +typedef BOOL (*pOpaqueRect)(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect); +typedef BOOL (*pDrawNineGrid)(rdpContext* context, DRAW_NINE_GRID_ORDER* draw_nine_grid); +typedef BOOL (*pMultiDstBlt)(rdpContext* context, MULTI_DSTBLT_ORDER* multi_dstblt); +typedef BOOL (*pMultiPatBlt)(rdpContext* context, MULTI_PATBLT_ORDER* multi_patblt); +typedef BOOL (*pMultiScrBlt)(rdpContext* context, MULTI_SCRBLT_ORDER* multi_scrblt); +typedef BOOL (*pMultiOpaqueRect)(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect); +typedef BOOL (*pMultiDrawNineGrid)(rdpContext* context, MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid); +typedef BOOL (*pLineTo)(rdpContext* context, LINE_TO_ORDER* line_to); +typedef BOOL (*pPolyline)(rdpContext* context, POLYLINE_ORDER* polyline); +typedef BOOL (*pMemBlt)(rdpContext* context, MEMBLT_ORDER* memblt); +typedef BOOL (*pMem3Blt)(rdpContext* context, MEM3BLT_ORDER* memblt); +typedef BOOL (*pSaveBitmap)(rdpContext* context, SAVE_BITMAP_ORDER* save_bitmap); +typedef BOOL (*pGlyphIndex)(rdpContext* context, GLYPH_INDEX_ORDER* glyph_index); +typedef BOOL (*pFastIndex)(rdpContext* context, FAST_INDEX_ORDER* fast_index); +typedef BOOL (*pFastGlyph)(rdpContext* context, FAST_GLYPH_ORDER* fast_glyph); +typedef BOOL (*pPolygonSC)(rdpContext* context, POLYGON_SC_ORDER* polygon_sc); +typedef BOOL (*pPolygonCB)(rdpContext* context, POLYGON_CB_ORDER* polygon_cb); +typedef BOOL (*pEllipseSC)(rdpContext* context, ELLIPSE_SC_ORDER* ellipse_sc); +typedef BOOL (*pEllipseCB)(rdpContext* context, ELLIPSE_CB_ORDER* ellipse_cb); struct rdp_primary_update { diff --git a/include/freerdp/secondary.h b/include/freerdp/secondary.h index 842ba3882..f42b21792 100644 --- a/include/freerdp/secondary.h +++ b/include/freerdp/secondary.h @@ -163,13 +163,13 @@ struct _CACHE_BRUSH_ORDER }; typedef struct _CACHE_BRUSH_ORDER CACHE_BRUSH_ORDER; -typedef void (*pCacheBitmap)(rdpContext* context, CACHE_BITMAP_ORDER* cache_bitmap_order); -typedef void (*pCacheBitmapV2)(rdpContext* context, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2_order); -typedef void (*pCacheBitmapV3)(rdpContext* context, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3_order); -typedef void (*pCacheColorTable)(rdpContext* context, CACHE_COLOR_TABLE_ORDER* cache_color_table_order); -typedef void (*pCacheGlyph)(rdpContext* context, CACHE_GLYPH_ORDER* cache_glyph_order); -typedef void (*pCacheGlyphV2)(rdpContext* context, CACHE_GLYPH_V2_ORDER* cache_glyph_v2_order); -typedef void (*pCacheBrush)(rdpContext* context, CACHE_BRUSH_ORDER* cache_brush_order); +typedef BOOL (*pCacheBitmap)(rdpContext* context, CACHE_BITMAP_ORDER* cache_bitmap_order); +typedef BOOL (*pCacheBitmapV2)(rdpContext* context, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2_order); +typedef BOOL (*pCacheBitmapV3)(rdpContext* context, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3_order); +typedef BOOL (*pCacheColorTable)(rdpContext* context, CACHE_COLOR_TABLE_ORDER* cache_color_table_order); +typedef BOOL (*pCacheGlyph)(rdpContext* context, CACHE_GLYPH_ORDER* cache_glyph_order); +typedef BOOL (*pCacheGlyphV2)(rdpContext* context, CACHE_GLYPH_V2_ORDER* cache_glyph_v2_order); +typedef BOOL (*pCacheBrush)(rdpContext* context, CACHE_BRUSH_ORDER* cache_brush_order); struct rdp_secondary_update { diff --git a/include/freerdp/update.h b/include/freerdp/update.h index 8ebb9c06e..527d29196 100644 --- a/include/freerdp/update.h +++ b/include/freerdp/update.h @@ -135,25 +135,25 @@ typedef struct rdp_update_proxy rdpUpdateProxy; /* Update Interface */ -typedef void (*pBeginPaint)(rdpContext* context); -typedef void (*pEndPaint)(rdpContext* context); -typedef void (*pSetBounds)(rdpContext* context, rdpBounds* bounds); +typedef BOOL (*pBeginPaint)(rdpContext* context); +typedef BOOL (*pEndPaint)(rdpContext* context); +typedef BOOL (*pSetBounds)(rdpContext* context, rdpBounds* bounds); -typedef void (*pSynchronize)(rdpContext* context); -typedef void (*pDesktopResize)(rdpContext* context); -typedef void (*pBitmapUpdate)(rdpContext* context, BITMAP_UPDATE* bitmap); -typedef void (*pPalette)(rdpContext* context, PALETTE_UPDATE* palette); -typedef void (*pPlaySound)(rdpContext* context, PLAY_SOUND_UPDATE* play_sound); -typedef void (*pSetKeyboardIndicators)(rdpContext* context, UINT16 led_flags); +typedef BOOL (*pSynchronize)(rdpContext* context); +typedef BOOL (*pDesktopResize)(rdpContext* context); +typedef BOOL (*pBitmapUpdate)(rdpContext* context, BITMAP_UPDATE* bitmap); +typedef BOOL (*pPalette)(rdpContext* context, PALETTE_UPDATE* palette); +typedef BOOL (*pPlaySound)(rdpContext* context, PLAY_SOUND_UPDATE* play_sound); +typedef BOOL (*pSetKeyboardIndicators)(rdpContext* context, UINT16 led_flags); -typedef void (*pRefreshRect)(rdpContext* context, BYTE count, RECTANGLE_16* areas); -typedef void (*pSuppressOutput)(rdpContext* context, BYTE allow, RECTANGLE_16* area); +typedef BOOL (*pRefreshRect)(rdpContext* context, BYTE count, RECTANGLE_16* areas); +typedef BOOL (*pSuppressOutput)(rdpContext* context, BYTE allow, RECTANGLE_16* area); -typedef void (*pSurfaceCommand)(rdpContext* context, wStream* s); -typedef void (*pSurfaceBits)(rdpContext* context, SURFACE_BITS_COMMAND* surfaceBitsCommand); -typedef void (*pSurfaceFrameMarker)(rdpContext* context, SURFACE_FRAME_MARKER* surfaceFrameMarker); -typedef void (*pSurfaceFrameBits)(rdpContext* context, SURFACE_BITS_COMMAND* cmd, BOOL first, BOOL last, UINT32 frameId); -typedef void (*pSurfaceFrameAcknowledge)(rdpContext* context, UINT32 frameId); +typedef BOOL (*pSurfaceCommand)(rdpContext* context, wStream* s); +typedef BOOL (*pSurfaceBits)(rdpContext* context, SURFACE_BITS_COMMAND* surfaceBitsCommand); +typedef BOOL (*pSurfaceFrameMarker)(rdpContext* context, SURFACE_FRAME_MARKER* surfaceFrameMarker); +typedef BOOL (*pSurfaceFrameBits)(rdpContext* context, SURFACE_BITS_COMMAND* cmd, BOOL first, BOOL last, UINT32 frameId); +typedef BOOL (*pSurfaceFrameAcknowledge)(rdpContext* context, UINT32 frameId); struct rdp_update { diff --git a/include/freerdp/window.h b/include/freerdp/window.h index 3357d89bd..c52c35c72 100644 --- a/include/freerdp/window.h +++ b/include/freerdp/window.h @@ -226,16 +226,16 @@ struct _MONITORED_DESKTOP_ORDER }; typedef struct _MONITORED_DESKTOP_ORDER MONITORED_DESKTOP_ORDER; -typedef void (*pWindowCreate)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state); -typedef void (*pWindowUpdate)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state); -typedef void (*pWindowIcon)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_ICON_ORDER* window_icon); -typedef void (*pWindowCachedIcon)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_CACHED_ICON_ORDER* window_cached_icon); -typedef void (*pWindowDelete)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo); -typedef void (*pNotifyIconCreate)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notify_icon_state); -typedef void (*pNotifyIconUpdate)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notify_icon_state); -typedef void (*pNotifyIconDelete)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo); -typedef void (*pMonitoredDesktop)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, MONITORED_DESKTOP_ORDER* monitored_desktop); -typedef void (*pNonMonitoredDesktop)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo); +typedef BOOL (*pWindowCreate)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state); +typedef BOOL (*pWindowUpdate)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state); +typedef BOOL (*pWindowIcon)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_ICON_ORDER* window_icon); +typedef BOOL (*pWindowCachedIcon)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_CACHED_ICON_ORDER* window_cached_icon); +typedef BOOL (*pWindowDelete)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo); +typedef BOOL (*pNotifyIconCreate)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notify_icon_state); +typedef BOOL (*pNotifyIconUpdate)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notify_icon_state); +typedef BOOL (*pNotifyIconDelete)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo); +typedef BOOL (*pMonitoredDesktop)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, MONITORED_DESKTOP_ORDER* monitored_desktop); +typedef BOOL (*pNonMonitoredDesktop)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo); struct rdp_window_update { diff --git a/libfreerdp/cache/bitmap.c b/libfreerdp/cache/bitmap.c index b31d71898..b29149764 100644 --- a/libfreerdp/cache/bitmap.c +++ b/libfreerdp/cache/bitmap.c @@ -34,7 +34,7 @@ #define TAG FREERDP_TAG("cache.bitmap") -void update_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) +BOOL update_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) { rdpBitmap* bitmap; rdpCache* cache = context->cache; @@ -44,18 +44,20 @@ void update_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) else bitmap = bitmap_cache_get(cache->bitmap, (BYTE) memblt->cacheId, memblt->cacheIndex); /* XP-SP2 servers sometimes ask for cached bitmaps they've never defined. */ - if (bitmap == NULL) return; + if (bitmap == NULL) + return TRUE; memblt->bitmap = bitmap; - IFCALL(cache->bitmap->MemBlt, context, memblt); + IFCALLRETURN(TRUE, cache->bitmap->MemBlt, context, memblt); } -void update_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) +BOOL update_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) { BYTE style; rdpBitmap* bitmap; rdpCache* cache = context->cache; rdpBrush* brush = &mem3blt->brush; + BOOL ret = TRUE; if (mem3blt->cacheId == 0xFF) bitmap = offscreen_cache_get(cache->offscreen, mem3blt->cacheIndex); @@ -64,35 +66,45 @@ void update_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) /* XP-SP2 servers sometimes ask for cached bitmaps they've never defined. */ if (!bitmap) - return; + return TRUE; style = brush->style; if (brush->style & CACHED_BRUSH) { brush->data = brush_cache_get(cache->brush, brush->index, &brush->bpp); + if (!brush->data) + return FALSE; brush->style = 0x03; } mem3blt->bitmap = bitmap; - IFCALL(cache->bitmap->Mem3Blt, context, mem3blt); + IFCALLRET(cache->bitmap->Mem3Blt, ret, context, mem3blt); brush->style = style; + return ret; } -void update_gdi_cache_bitmap(rdpContext* context, CACHE_BITMAP_ORDER* cacheBitmap) +BOOL update_gdi_cache_bitmap(rdpContext* context, CACHE_BITMAP_ORDER* cacheBitmap) { rdpBitmap* bitmap; rdpBitmap* prevBitmap; rdpCache* cache = context->cache; bitmap = Bitmap_Alloc(context); + if (!bitmap) + return FALSE; + Bitmap_SetDimensions(context, bitmap, cacheBitmap->bitmapWidth, cacheBitmap->bitmapHeight); - bitmap->Decompress(context, bitmap, + if (!bitmap->Decompress(context, bitmap, cacheBitmap->bitmapDataStream, cacheBitmap->bitmapWidth, cacheBitmap->bitmapHeight, cacheBitmap->bitmapBpp, cacheBitmap->bitmapLength, - cacheBitmap->compressed, RDP_CODEC_ID_NONE); + cacheBitmap->compressed, RDP_CODEC_ID_NONE)) + { + Bitmap_Free(context, bitmap); + return FALSE; + } bitmap->New(context, bitmap); @@ -102,9 +114,11 @@ void update_gdi_cache_bitmap(rdpContext* context, CACHE_BITMAP_ORDER* cacheBitma Bitmap_Free(context, prevBitmap); bitmap_cache_put(cache->bitmap, cacheBitmap->cacheId, cacheBitmap->cacheIndex, bitmap); + return TRUE; } -void update_gdi_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cacheBitmapV2) +BOOL update_gdi_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cacheBitmapV2) + { rdpBitmap* bitmap; rdpBitmap* prevBitmap; @@ -112,6 +126,8 @@ void update_gdi_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cach rdpSettings* settings = context->settings; bitmap = Bitmap_Alloc(context); + if (!bitmap) + return FALSE; Bitmap_SetDimensions(context, bitmap, cacheBitmapV2->bitmapWidth, cacheBitmapV2->bitmapHeight); @@ -121,10 +137,14 @@ void update_gdi_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cach if ((settings->ColorDepth == 15) && (cacheBitmapV2->bitmapBpp == 16)) cacheBitmapV2->bitmapBpp = settings->ColorDepth; - bitmap->Decompress(context, bitmap, + if (!bitmap->Decompress(context, bitmap, cacheBitmapV2->bitmapDataStream, cacheBitmapV2->bitmapWidth, cacheBitmapV2->bitmapHeight, cacheBitmapV2->bitmapBpp, cacheBitmapV2->bitmapLength, - cacheBitmapV2->compressed, RDP_CODEC_ID_NONE); + cacheBitmapV2->compressed, RDP_CODEC_ID_NONE)) + { + Bitmap_Free(context, bitmap); + return FALSE; + } bitmap->New(context, bitmap); @@ -134,9 +154,10 @@ void update_gdi_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cach Bitmap_Free(context, prevBitmap); bitmap_cache_put(cache->bitmap, cacheBitmapV2->cacheId, cacheBitmapV2->cacheIndex, bitmap); + return TRUE; } -void update_gdi_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cacheBitmapV3) +BOOL update_gdi_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cacheBitmapV3) { rdpBitmap* bitmap; rdpBitmap* prevBitmap; @@ -146,6 +167,8 @@ void update_gdi_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cach BITMAP_DATA_EX* bitmapData = &cacheBitmapV3->bitmapData; bitmap = Bitmap_Alloc(context); + if (!bitmap) + return FALSE; Bitmap_SetDimensions(context, bitmap, bitmapData->width, bitmapData->height); @@ -167,9 +190,10 @@ void update_gdi_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cach Bitmap_Free(context, prevBitmap); bitmap_cache_put(cache->bitmap, cacheBitmapV3->cacheId, cacheBitmapV3->cacheIndex, bitmap); + return TRUE; } -void update_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) +BOOL update_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) { int i; BOOL reused = TRUE; @@ -214,6 +238,7 @@ void update_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) bitmap->Paint(context, bitmap); } + return TRUE; } rdpBitmap* bitmap_cache_get(rdpBitmapCache* bitmapCache, UINT32 id, UINT32 index) diff --git a/libfreerdp/cache/brush.c b/libfreerdp/cache/brush.c index 6ede3085e..81da01407 100644 --- a/libfreerdp/cache/brush.c +++ b/libfreerdp/cache/brush.c @@ -34,9 +34,10 @@ #define TAG FREERDP_TAG("cache.brush") -void update_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) +BOOL update_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) { BYTE style; + BOOL ret = TRUE; rdpBrush* brush = &patblt->brush; rdpCache* cache = context->cache; @@ -48,21 +49,23 @@ void update_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) brush->style = 0x03; } - IFCALL(cache->brush->PatBlt, context, patblt); + IFCALLRET(cache->brush->PatBlt, ret, context, patblt); brush->style = style; + return ret; } -void update_gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) +BOOL update_gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) { rdpCache* cache = context->cache; - IFCALL(cache->brush->PolygonSC, context, polygon_sc); + IFCALLRETURN(TRUE, cache->brush->PolygonSC, context, polygon_sc); } -void update_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) +BOOL update_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) { BYTE style; rdpBrush* brush = &polygon_cb->brush; rdpCache* cache = context->cache; + BOOL ret = TRUE; style = brush->style; @@ -72,11 +75,12 @@ void update_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) brush->style = 0x03; } - IFCALL(cache->brush->PolygonCB, context, polygon_cb); + IFCALLRET(cache->brush->PolygonCB, ret, context, polygon_cb); brush->style = style; + return ret; } -static void update_gdi_cache_brush(rdpContext* context, CACHE_BRUSH_ORDER* cacheBrush) +static BOOL update_gdi_cache_brush(rdpContext* context, CACHE_BRUSH_ORDER* cacheBrush) { int length; void* data = NULL; @@ -85,9 +89,12 @@ static void update_gdi_cache_brush(rdpContext* context, CACHE_BRUSH_ORDER* cache length = cacheBrush->bpp * 64 / 8; data = malloc(length); + if (!data) + return FALSE; CopyMemory(data, cacheBrush->data, length); brush_cache_put(cache->brush, cacheBrush->index, data, cacheBrush->bpp); + return TRUE; } void* brush_cache_get(rdpBrushCache* brushCache, UINT32 index, UINT32* bpp) diff --git a/libfreerdp/cache/glyph.c b/libfreerdp/cache/glyph.c index 9faa98cfa..c8cf1524d 100644 --- a/libfreerdp/cache/glyph.c +++ b/libfreerdp/cache/glyph.c @@ -199,7 +199,7 @@ void update_process_glyph_fragments(rdpContext* context, BYTE* data, UINT32 leng Glyph_EndDraw(context, bkX, bkY, bkWidth, bkHeight, bgcolor, fgcolor); } -void update_gdi_glyph_index(rdpContext* context, GLYPH_INDEX_ORDER* glyphIndex) +BOOL update_gdi_glyph_index(rdpContext* context, GLYPH_INDEX_ORDER* glyphIndex) { rdpGlyphCache* glyph_cache; int bkWidth, bkHeight, opWidth, opHeight; @@ -217,9 +217,11 @@ void update_gdi_glyph_index(rdpContext* context, GLYPH_INDEX_ORDER* glyphIndex) glyphIndex->bkLeft, glyphIndex->bkTop, bkWidth, bkHeight, glyphIndex->opLeft, glyphIndex->opTop, opWidth, opHeight, glyphIndex->fOpRedundant); + + return TRUE; } -void update_gdi_fast_index(rdpContext* context, FAST_INDEX_ORDER* fastIndex) +BOOL update_gdi_fast_index(rdpContext* context, FAST_INDEX_ORDER* fastIndex) { INT32 x, y; INT32 opLeft, opTop; @@ -269,9 +271,10 @@ void update_gdi_fast_index(rdpContext* context, FAST_INDEX_ORDER* fastIndex) opLeft, opTop, opRight - opLeft, opBottom - opTop, FALSE); + return TRUE; } -void update_gdi_fast_glyph(rdpContext* context, FAST_GLYPH_ORDER* fastGlyph) +BOOL update_gdi_fast_glyph(rdpContext* context, FAST_GLYPH_ORDER* fastGlyph) { INT32 x, y; rdpGlyph* glyph; @@ -343,9 +346,10 @@ void update_gdi_fast_glyph(rdpContext* context, FAST_GLYPH_ORDER* fastGlyph) opLeft, opTop, opRight - opLeft, opBottom - opTop, FALSE); + return TRUE; } -void update_gdi_cache_glyph(rdpContext* context, CACHE_GLYPH_ORDER* cacheGlyph) +BOOL update_gdi_cache_glyph(rdpContext* context, CACHE_GLYPH_ORDER* cacheGlyph) { int i; rdpGlyph* glyph; @@ -357,6 +361,11 @@ void update_gdi_cache_glyph(rdpContext* context, CACHE_GLYPH_ORDER* cacheGlyph) glyph_data = &cacheGlyph->glyphData[i]; glyph = Glyph_Alloc(context); + if (!glyph) + { + /* TODO: cleanup previously allocated memory */ + return FALSE; + } glyph->x = glyph_data->x; glyph->y = glyph_data->y; @@ -368,9 +377,10 @@ void update_gdi_cache_glyph(rdpContext* context, CACHE_GLYPH_ORDER* cacheGlyph) glyph_cache_put(cache->glyph, cacheGlyph->cacheId, glyph_data->cacheIndex, glyph); } + return TRUE; } -void update_gdi_cache_glyph_v2(rdpContext* context, CACHE_GLYPH_V2_ORDER* cacheGlyphV2) +BOOL update_gdi_cache_glyph_v2(rdpContext* context, CACHE_GLYPH_V2_ORDER* cacheGlyphV2) { int i; rdpGlyph* glyph; @@ -382,6 +392,11 @@ void update_gdi_cache_glyph_v2(rdpContext* context, CACHE_GLYPH_V2_ORDER* cacheG glyphData = &cacheGlyphV2->glyphData[i]; glyph = Glyph_Alloc(context); + if (!glyph) + { + /* TODO: cleanup perviosly allocated glyph memory in error case */ + return FALSE; + } glyph->x = glyphData->x; glyph->y = glyphData->y; @@ -393,6 +408,7 @@ void update_gdi_cache_glyph_v2(rdpContext* context, CACHE_GLYPH_V2_ORDER* cacheG glyph_cache_put(cache->glyph, cacheGlyphV2->cacheId, glyphData->cacheIndex, glyph); } + return TRUE; } rdpGlyph* glyph_cache_get(rdpGlyphCache* glyphCache, UINT32 id, UINT32 index) diff --git a/libfreerdp/cache/nine_grid.c b/libfreerdp/cache/nine_grid.c index a52cf15b9..09d63fdca 100644 --- a/libfreerdp/cache/nine_grid.c +++ b/libfreerdp/cache/nine_grid.c @@ -35,16 +35,16 @@ #define TAG FREERDP_TAG("cache.nine_grid") -void update_gdi_draw_nine_grid(rdpContext* context, DRAW_NINE_GRID_ORDER* draw_nine_grid) +BOOL update_gdi_draw_nine_grid(rdpContext* context, DRAW_NINE_GRID_ORDER* draw_nine_grid) { rdpCache* cache = context->cache; - IFCALL(cache->nine_grid->DrawNineGrid, context, draw_nine_grid); + IFCALLRETURN(TRUE, cache->nine_grid->DrawNineGrid, context, draw_nine_grid); } -void update_gdi_multi_draw_nine_grid(rdpContext* context, MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid) +BOOL update_gdi_multi_draw_nine_grid(rdpContext* context, MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid) { rdpCache* cache = context->cache; - IFCALL(cache->nine_grid->MultiDrawNineGrid, context, multi_draw_nine_grid); + IFCALLRETURN(TRUE, cache->nine_grid->MultiDrawNineGrid, context, multi_draw_nine_grid); } void nine_grid_cache_register_callbacks(rdpUpdate* update) diff --git a/libfreerdp/cache/offscreen.c b/libfreerdp/cache/offscreen.c index 0dbbcdd96..00d0429d6 100644 --- a/libfreerdp/cache/offscreen.c +++ b/libfreerdp/cache/offscreen.c @@ -32,7 +32,7 @@ #define TAG FREERDP_TAG("cache.offscreen") -void update_gdi_create_offscreen_bitmap(rdpContext* context, CREATE_OFFSCREEN_BITMAP_ORDER* createOffscreenBitmap) +BOOL update_gdi_create_offscreen_bitmap(rdpContext* context, CREATE_OFFSCREEN_BITMAP_ORDER* createOffscreenBitmap) { int i; UINT16 index; @@ -40,11 +40,17 @@ void update_gdi_create_offscreen_bitmap(rdpContext* context, CREATE_OFFSCREEN_BI rdpCache* cache = context->cache; bitmap = Bitmap_Alloc(context); + if (!bitmap) + return FALSE; bitmap->width = createOffscreenBitmap->cx; bitmap->height = createOffscreenBitmap->cy; - bitmap->New(context, bitmap); + if (!bitmap->New(context, bitmap)) + { + free(bitmap); + return FALSE; + } offscreen_cache_delete(cache->offscreen, createOffscreenBitmap->id); offscreen_cache_put(cache->offscreen, createOffscreenBitmap->id, bitmap); @@ -57,9 +63,10 @@ void update_gdi_create_offscreen_bitmap(rdpContext* context, CREATE_OFFSCREEN_BI index = createOffscreenBitmap->deleteList.indices[i]; offscreen_cache_delete(cache->offscreen, index); } + return TRUE; } -void update_gdi_switch_surface(rdpContext* context, SWITCH_SURFACE_ORDER* switchSurface) +BOOL update_gdi_switch_surface(rdpContext* context, SWITCH_SURFACE_ORDER* switchSurface) { rdpCache* cache = context->cache; @@ -75,6 +82,7 @@ void update_gdi_switch_surface(rdpContext* context, SWITCH_SURFACE_ORDER* switch } cache->offscreen->currentSurface = switchSurface->bitmapId; + return TRUE; } rdpBitmap* offscreen_cache_get(rdpOffscreenCache* offscreenCache, UINT32 index) diff --git a/libfreerdp/cache/palette.c b/libfreerdp/cache/palette.c index dc515835b..0bfe28050 100644 --- a/libfreerdp/cache/palette.c +++ b/libfreerdp/cache/palette.c @@ -30,15 +30,18 @@ #define TAG FREERDP_TAG("cache.palette") -static void update_gdi_cache_color_table(rdpContext* context, CACHE_COLOR_TABLE_ORDER* cacheColorTable) +static BOOL update_gdi_cache_color_table(rdpContext* context, CACHE_COLOR_TABLE_ORDER* cacheColorTable) { UINT32* colorTable; rdpCache* cache = context->cache; colorTable = (UINT32*) malloc(sizeof(UINT32) * 256); + if (!colorTable) + return FALSE; CopyMemory(colorTable, cacheColorTable->colorTable, sizeof(UINT32) * 256); palette_cache_put(cache->palette, cacheColorTable->cacheIndex, (void*) colorTable); + return TRUE; } void* palette_cache_get(rdpPaletteCache* paletteCache, UINT32 index) diff --git a/libfreerdp/cache/pointer.c b/libfreerdp/cache/pointer.c index 950dd7063..a36d92a95 100644 --- a/libfreerdp/cache/pointer.c +++ b/libfreerdp/cache/pointer.c @@ -33,12 +33,12 @@ #define TAG FREERDP_TAG("cache.pointer") -void update_pointer_position(rdpContext* context, POINTER_POSITION_UPDATE* pointer_position) +BOOL update_pointer_position(rdpContext* context, POINTER_POSITION_UPDATE* pointer_position) { - Pointer_SetPosition(context, pointer_position->xPos, pointer_position->yPos); + return Pointer_SetPosition(context, pointer_position->xPos, pointer_position->yPos); } -void update_pointer_system(rdpContext* context, POINTER_SYSTEM_UPDATE* pointer_system) +BOOL update_pointer_system(rdpContext* context, POINTER_SYSTEM_UPDATE* pointer_system) { switch (pointer_system->type) { @@ -52,11 +52,11 @@ void update_pointer_system(rdpContext* context, POINTER_SYSTEM_UPDATE* pointer_s default: WLog_ERR(TAG, "Unknown system pointer type (0x%08X)", pointer_system->type); - break; } + return TRUE; } -void update_pointer_color(rdpContext* context, POINTER_COLOR_UPDATE* pointer_color) +BOOL update_pointer_color(rdpContext* context, POINTER_COLOR_UPDATE* pointer_color) { rdpPointer* pointer; rdpCache* cache = context->cache; @@ -76,21 +76,34 @@ void update_pointer_color(rdpContext* context, POINTER_COLOR_UPDATE* pointer_col if (pointer->lengthAndMask && pointer_color->xorMaskData) { pointer->andMaskData = (BYTE*) malloc(pointer->lengthAndMask); + if (!pointer->andMaskData) + goto out_fail; + CopyMemory(pointer->andMaskData, pointer_color->andMaskData, pointer->lengthAndMask); } if (pointer->lengthXorMask && pointer_color->xorMaskData) { pointer->xorMaskData = (BYTE*) malloc(pointer->lengthXorMask); + if (!pointer->xorMaskData) + goto out_fail; CopyMemory(pointer->xorMaskData, pointer_color->xorMaskData, pointer->lengthXorMask); } pointer->New(context, pointer); pointer_cache_put(cache->pointer, pointer_color->cacheIndex, pointer); Pointer_Set(context, pointer); + return TRUE; } + return FALSE; + +out_fail: + free(pointer->andMaskData); + free(pointer->xorMaskData); + free(pointer); + return FALSE; } -void update_pointer_new(rdpContext* context, POINTER_NEW_UPDATE* pointer_new) +BOOL update_pointer_new(rdpContext* context, POINTER_NEW_UPDATE* pointer_new) { rdpPointer* pointer; rdpCache* cache = context->cache; @@ -112,6 +125,8 @@ void update_pointer_new(rdpContext* context, POINTER_NEW_UPDATE* pointer_new) if (pointer->lengthAndMask) { pointer->andMaskData = (BYTE*) malloc(pointer->lengthAndMask); + if (!pointer->andMaskData) + goto out_fail; CopyMemory(pointer->andMaskData, pointer_new->colorPtrAttr.andMaskData, pointer->lengthAndMask); } @@ -124,10 +139,18 @@ void update_pointer_new(rdpContext* context, POINTER_NEW_UPDATE* pointer_new) pointer->New(context, pointer); pointer_cache_put(cache->pointer, pointer_new->colorPtrAttr.cacheIndex, pointer); Pointer_Set(context, pointer); + return TRUE; } + return FALSE; + +out_fail: + free(pointer->andMaskData); + free(pointer->xorMaskData); + free(pointer); + return FALSE; } -void update_pointer_cached(rdpContext* context, POINTER_CACHED_UPDATE* pointer_cached) +BOOL update_pointer_cached(rdpContext* context, POINTER_CACHED_UPDATE* pointer_cached) { rdpPointer* pointer; rdpCache* cache = context->cache; @@ -135,7 +158,11 @@ void update_pointer_cached(rdpContext* context, POINTER_CACHED_UPDATE* pointer_c pointer = pointer_cache_get(cache->pointer, pointer_cached->cacheIndex); if (pointer != NULL) + { Pointer_Set(context, pointer); + return TRUE; + } + return FALSE; } rdpPointer* pointer_cache_get(rdpPointerCache* pointer_cache, UINT32 index) diff --git a/libfreerdp/codec/color.c b/libfreerdp/codec/color.c index 01ea26ad0..aa43b49dc 100644 --- a/libfreerdp/codec/color.c +++ b/libfreerdp/codec/color.c @@ -27,11 +27,9 @@ #include -#include #include #include #include -#include #define TAG FREERDP_TAG("color") diff --git a/libfreerdp/core/fastpath.c b/libfreerdp/core/fastpath.c index 76bcbb06c..a3d9b572d 100644 --- a/libfreerdp/core/fastpath.c +++ b/libfreerdp/core/fastpath.c @@ -869,9 +869,7 @@ BOOL fastpath_send_input_pdu(rdpFastPath* fastpath, wStream* s) wStream* fastpath_update_pdu_init(rdpFastPath* fastpath) { - wStream* s; - s = transport_send_stream_init(fastpath->rdp->transport, FASTPATH_MAX_PACKET_SIZE); - return s; + return transport_send_stream_init(fastpath->rdp->transport, FASTPATH_MAX_PACKET_SIZE); } wStream* fastpath_update_pdu_init_new(rdpFastPath* fastpath) diff --git a/libfreerdp/core/graphics.c b/libfreerdp/core/graphics.c index 5988abbcd..57a5cc23e 100644 --- a/libfreerdp/core/graphics.c +++ b/libfreerdp/core/graphics.c @@ -44,9 +44,9 @@ rdpBitmap* Bitmap_Alloc(rdpContext* context) return bitmap; } -void Bitmap_New(rdpContext* context, rdpBitmap* bitmap) +BOOL Bitmap_New(rdpContext* context, rdpBitmap* bitmap) { - + return TRUE; } void Bitmap_Free(rdpContext* context, rdpBitmap* bitmap) @@ -77,9 +77,9 @@ void Bitmap_SetDimensions(rdpContext* context, rdpBitmap* bitmap, UINT16 width, } /* static method */ -void Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary) +BOOL Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary) { - context->graphics->Bitmap_Prototype->SetSurface(context, bitmap, primary); + return context->graphics->Bitmap_Prototype->SetSurface(context, bitmap, primary); } void graphics_register_bitmap(rdpGraphics* graphics, rdpBitmap* bitmap) @@ -105,9 +105,9 @@ rdpPointer* Pointer_Alloc(rdpContext* context) return pointer; } -void Pointer_New(rdpContext* context, rdpPointer* pointer) +BOOL Pointer_New(rdpContext* context, rdpPointer* pointer) { - + return TRUE; } void Pointer_Free(rdpContext* context, rdpPointer* pointer) @@ -133,24 +133,24 @@ void Pointer_Free(rdpContext* context, rdpPointer* pointer) } /* static method */ -void Pointer_Set(rdpContext* context, rdpPointer* pointer) +BOOL Pointer_Set(rdpContext* context, rdpPointer* pointer) { - context->graphics->Pointer_Prototype->Set(context, pointer); + return context->graphics->Pointer_Prototype->Set(context, pointer); } -void Pointer_SetNull(rdpContext* context) +BOOL Pointer_SetNull(rdpContext* context) { - context->graphics->Pointer_Prototype->SetNull(context); + return context->graphics->Pointer_Prototype->SetNull(context); } -void Pointer_SetDefault(rdpContext* context) +BOOL Pointer_SetDefault(rdpContext* context) { - context->graphics->Pointer_Prototype->SetDefault(context); + return context->graphics->Pointer_Prototype->SetDefault(context); } -void Pointer_SetPosition(rdpContext* context, UINT32 x, UINT32 y) +BOOL Pointer_SetPosition(rdpContext* context, UINT32 x, UINT32 y) { - IFCALL(context->graphics->Pointer_Prototype->SetPosition, context, x, y); + IFCALLRETURN(TRUE, context->graphics->Pointer_Prototype->SetPosition, context, x, y); } void graphics_register_pointer(rdpGraphics* graphics, rdpPointer* pointer) @@ -176,9 +176,9 @@ rdpGlyph* Glyph_Alloc(rdpContext* context) return glyph; } -void Glyph_New(rdpContext* context, rdpGlyph* glyph) +BOOL Glyph_New(rdpContext* context, rdpGlyph* glyph) { - context->graphics->Glyph_Prototype->New(context, glyph); + return context->graphics->Glyph_Prototype->New(context, glyph); } void Glyph_Free(rdpContext* context, rdpGlyph* glyph) @@ -186,19 +186,19 @@ void Glyph_Free(rdpContext* context, rdpGlyph* glyph) context->graphics->Glyph_Prototype->Free(context, glyph); } -void Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y) +BOOL Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y) { - context->graphics->Glyph_Prototype->Draw(context, glyph, x, y); + return context->graphics->Glyph_Prototype->Draw(context, glyph, x, y); } -void Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor, BOOL fOpRedundant) +BOOL Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor, BOOL fOpRedundant) { - context->graphics->Glyph_Prototype->BeginDraw(context, x, y, width, height, bgcolor, fgcolor, fOpRedundant); + return context->graphics->Glyph_Prototype->BeginDraw(context, x, y, width, height, bgcolor, fgcolor, fOpRedundant); } -void Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor) +BOOL Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor) { - context->graphics->Glyph_Prototype->EndDraw(context, x, y, width, height, bgcolor, fgcolor); + return context->graphics->Glyph_Prototype->EndDraw(context, x, y, width, height, bgcolor, fgcolor); } void graphics_register_glyph(rdpGraphics* graphics, rdpGlyph* glyph) diff --git a/libfreerdp/core/input.c b/libfreerdp/core/input.c index f7979fc26..153b09976 100644 --- a/libfreerdp/core/input.c +++ b/libfreerdp/core/input.c @@ -32,13 +32,13 @@ #define TAG FREERDP_TAG("core") -void rdp_write_client_input_pdu_header(wStream* s, UINT16 number) +static void rdp_write_client_input_pdu_header(wStream* s, UINT16 number) { Stream_Write_UINT16(s, 1); /* numberEvents (2 bytes) */ Stream_Write_UINT16(s, 0); /* pad2Octets (2 bytes) */ } -void rdp_write_input_event_header(wStream* s, UINT32 time, UINT16 type) +static void rdp_write_input_event_header(wStream* s, UINT32 time, UINT16 type) { Stream_Write_UINT32(s, time); /* eventTime (4 bytes) */ Stream_Write_UINT16(s, type); /* messageType (2 bytes) */ @@ -48,57 +48,63 @@ wStream* rdp_client_input_pdu_init(rdpRdp* rdp, UINT16 type) { wStream* s; s = rdp_data_pdu_init(rdp); + if (!s) + return NULL; rdp_write_client_input_pdu_header(s, 1); rdp_write_input_event_header(s, 0, type); return s; } -void rdp_send_client_input_pdu(rdpRdp* rdp, wStream* s) +BOOL rdp_send_client_input_pdu(rdpRdp* rdp, wStream* s) { - rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_INPUT, rdp->mcs->userId); + return rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_INPUT, rdp->mcs->userId); } -void input_write_synchronize_event(wStream* s, UINT32 flags) +static void input_write_synchronize_event(wStream* s, UINT32 flags) { Stream_Write_UINT16(s, 0); /* pad2Octets (2 bytes) */ Stream_Write_UINT32(s, flags); /* toggleFlags (4 bytes) */ } -void input_send_synchronize_event(rdpInput* input, UINT32 flags) +BOOL input_send_synchronize_event(rdpInput* input, UINT32 flags) { wStream* s; rdpRdp* rdp = input->context->rdp; s = rdp_client_input_pdu_init(rdp, INPUT_EVENT_SYNC); + if (!s) + return FALSE; input_write_synchronize_event(s, flags); - rdp_send_client_input_pdu(rdp, s); + return rdp_send_client_input_pdu(rdp, s); } -void input_write_keyboard_event(wStream* s, UINT16 flags, UINT16 code) +static void input_write_keyboard_event(wStream* s, UINT16 flags, UINT16 code) { Stream_Write_UINT16(s, flags); /* keyboardFlags (2 bytes) */ Stream_Write_UINT16(s, code); /* keyCode (2 bytes) */ Stream_Write_UINT16(s, 0); /* pad2Octets (2 bytes) */ } -void input_send_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) +BOOL input_send_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) { wStream* s; rdpRdp* rdp = input->context->rdp; s = rdp_client_input_pdu_init(rdp, INPUT_EVENT_SCANCODE); + if (!s) + return FALSE; input_write_keyboard_event(s, flags, code); - rdp_send_client_input_pdu(rdp, s); + return rdp_send_client_input_pdu(rdp, s); } -void input_write_unicode_keyboard_event(wStream* s, UINT16 flags, UINT16 code) +static void input_write_unicode_keyboard_event(wStream* s, UINT16 flags, UINT16 code) { Stream_Write_UINT16(s, flags); /* keyboardFlags (2 bytes) */ Stream_Write_UINT16(s, code); /* unicodeCode (2 bytes) */ Stream_Write_UINT16(s, 0); /* pad2Octets (2 bytes) */ } -void input_send_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) +BOOL input_send_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) { wStream* s; UINT16 keyboardFlags = 0; @@ -116,8 +122,10 @@ void input_send_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 cod keyboardFlags |= (flags & KBD_FLAGS_RELEASE) ? KBD_FLAGS_RELEASE : 0; s = rdp_client_input_pdu_init(rdp, INPUT_EVENT_UNICODE); + if (!s) + return FALSE; input_write_unicode_keyboard_event(s, flags, code); - rdp_send_client_input_pdu(rdp, s); + return rdp_send_client_input_pdu(rdp, s); } void input_write_mouse_event(wStream* s, UINT16 flags, UINT16 x, UINT16 y) @@ -127,46 +135,52 @@ void input_write_mouse_event(wStream* s, UINT16 flags, UINT16 x, UINT16 y) Stream_Write_UINT16(s, y); /* yPos (2 bytes) */ } -void input_send_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) +BOOL input_send_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) { wStream* s; rdpRdp* rdp = input->context->rdp; s = rdp_client_input_pdu_init(rdp, INPUT_EVENT_MOUSE); + if (!s) + return FALSE; input_write_mouse_event(s, flags, x, y); - rdp_send_client_input_pdu(rdp, s); + return rdp_send_client_input_pdu(rdp, s); } -void input_write_extended_mouse_event(wStream* s, UINT16 flags, UINT16 x, UINT16 y) +static void input_write_extended_mouse_event(wStream* s, UINT16 flags, UINT16 x, UINT16 y) { Stream_Write_UINT16(s, flags); /* pointerFlags (2 bytes) */ Stream_Write_UINT16(s, x); /* xPos (2 bytes) */ Stream_Write_UINT16(s, y); /* yPos (2 bytes) */ } -void input_send_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) +BOOL input_send_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) { wStream* s; rdpRdp* rdp = input->context->rdp; s = rdp_client_input_pdu_init(rdp, INPUT_EVENT_MOUSEX); + if (!s) + return FALSE; input_write_extended_mouse_event(s, flags, x, y); - rdp_send_client_input_pdu(rdp, s); + return rdp_send_client_input_pdu(rdp, s); } -void input_send_focus_in_event(rdpInput* input, UINT16 toggleStates) +BOOL input_send_focus_in_event(rdpInput* input, UINT16 toggleStates) { /* send a tab up like mstsc.exe */ - input_send_keyboard_event(input, KBD_FLAGS_RELEASE, 0x0f); + if (!input_send_keyboard_event(input, KBD_FLAGS_RELEASE, 0x0f)) + return FALSE; /* send the toggle key states */ - input_send_synchronize_event(input, (toggleStates & 0x1F)); + if (!input_send_synchronize_event(input, (toggleStates & 0x1F))) + return FALSE; /* send another tab up like mstsc.exe */ - input_send_keyboard_event(input, KBD_FLAGS_RELEASE, 0x0f); + return input_send_keyboard_event(input, KBD_FLAGS_RELEASE, 0x0f); } -static void input_send_keyboard_pause_event(rdpInput* input) +BOOL input_send_keyboard_pause_event(rdpInput* input) { /* In ancient days, pause-down without control sent E1 1D 45 E1 9D C5, * and pause-up sent nothing. However, reverse engineering mstsc shows @@ -174,30 +188,38 @@ static void input_send_keyboard_pause_event(rdpInput* input) */ /* Control down (0x1D) */ - input_send_keyboard_event(input, 0, - RDP_SCANCODE_CODE(RDP_SCANCODE_LCONTROL)); + if (!input_send_keyboard_event(input, 0, + RDP_SCANCODE_CODE(RDP_SCANCODE_LCONTROL))) + return FALSE; + /* Numlock down (0x45) */ - input_send_keyboard_event(input, 0, - RDP_SCANCODE_CODE(RDP_SCANCODE_NUMLOCK)); + if (!input_send_keyboard_event(input, 0, + RDP_SCANCODE_CODE(RDP_SCANCODE_NUMLOCK))) + return FALSE; + /* Control up (0x1D) */ - input_send_keyboard_event(input, KBD_FLAGS_RELEASE, - RDP_SCANCODE_CODE(RDP_SCANCODE_LCONTROL)); + if (!input_send_keyboard_event(input, KBD_FLAGS_RELEASE, + RDP_SCANCODE_CODE(RDP_SCANCODE_LCONTROL))) + return FALSE; + /* Numlock up (0x45) */ - input_send_keyboard_event(input, KBD_FLAGS_RELEASE, + return input_send_keyboard_event(input, KBD_FLAGS_RELEASE, RDP_SCANCODE_CODE(RDP_SCANCODE_NUMLOCK)); } -void input_send_fastpath_synchronize_event(rdpInput* input, UINT32 flags) +BOOL input_send_fastpath_synchronize_event(rdpInput* input, UINT32 flags) { wStream* s; rdpRdp* rdp = input->context->rdp; /* The FastPath Synchronization eventFlags has identical values as SlowPath */ s = fastpath_input_pdu_init(rdp->fastpath, (BYTE) flags, FASTPATH_INPUT_EVENT_SYNC); - fastpath_send_input_pdu(rdp->fastpath, s); + if (!s) + return FALSE; + return fastpath_send_input_pdu(rdp->fastpath, s); } -void input_send_fastpath_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) +BOOL input_send_fastpath_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) { wStream* s; BYTE eventFlags = 0; @@ -206,11 +228,13 @@ void input_send_fastpath_keyboard_event(rdpInput* input, UINT16 flags, UINT16 co eventFlags |= (flags & KBD_FLAGS_RELEASE) ? FASTPATH_INPUT_KBDFLAGS_RELEASE : 0; eventFlags |= (flags & KBD_FLAGS_EXTENDED) ? FASTPATH_INPUT_KBDFLAGS_EXTENDED : 0; s = fastpath_input_pdu_init(rdp->fastpath, eventFlags, FASTPATH_INPUT_EVENT_SCANCODE); + if (!s) + return FALSE; Stream_Write_UINT8(s, code); /* keyCode (1 byte) */ - fastpath_send_input_pdu(rdp->fastpath, s); + return fastpath_send_input_pdu(rdp->fastpath, s); } -void input_send_fastpath_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) +BOOL input_send_fastpath_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) { wStream* s; BYTE eventFlags = 0; @@ -218,37 +242,45 @@ void input_send_fastpath_unicode_keyboard_event(rdpInput* input, UINT16 flags, U eventFlags |= (flags & KBD_FLAGS_RELEASE) ? FASTPATH_INPUT_KBDFLAGS_RELEASE : 0; s = fastpath_input_pdu_init(rdp->fastpath, eventFlags, FASTPATH_INPUT_EVENT_UNICODE); + if (!s) + return FALSE; Stream_Write_UINT16(s, code); /* unicodeCode (2 bytes) */ - fastpath_send_input_pdu(rdp->fastpath, s); + return fastpath_send_input_pdu(rdp->fastpath, s); } -void input_send_fastpath_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) +BOOL input_send_fastpath_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) { wStream* s; rdpRdp* rdp = input->context->rdp; s = fastpath_input_pdu_init(rdp->fastpath, 0, FASTPATH_INPUT_EVENT_MOUSE); + if (!s) + return FALSE; input_write_mouse_event(s, flags, x, y); - fastpath_send_input_pdu(rdp->fastpath, s); + return fastpath_send_input_pdu(rdp->fastpath, s); } -void input_send_fastpath_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) +BOOL input_send_fastpath_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) { wStream* s; rdpRdp* rdp = input->context->rdp; s = fastpath_input_pdu_init(rdp->fastpath, 0, FASTPATH_INPUT_EVENT_MOUSEX); + if (!s) + return FALSE; input_write_extended_mouse_event(s, flags, x, y); - fastpath_send_input_pdu(rdp->fastpath, s); + return fastpath_send_input_pdu(rdp->fastpath, s); } -void input_send_fastpath_focus_in_event(rdpInput* input, UINT16 toggleStates) +BOOL input_send_fastpath_focus_in_event(rdpInput* input, UINT16 toggleStates) { wStream* s; rdpRdp* rdp = input->context->rdp; BYTE eventFlags = 0; s = fastpath_input_pdu_init_header(rdp->fastpath); + if (!s) + return FALSE; /* send a tab up like mstsc.exe */ eventFlags = FASTPATH_INPUT_KBDFLAGS_RELEASE | FASTPATH_INPUT_EVENT_SCANCODE << 5; Stream_Write_UINT8(s, eventFlags); /* Key Release event (1 byte) */ @@ -263,10 +295,10 @@ void input_send_fastpath_focus_in_event(rdpInput* input, UINT16 toggleStates) Stream_Write_UINT8(s, eventFlags); /* Key Release event (1 byte) */ Stream_Write_UINT8(s, 0x0f); /* keyCode (1 byte) */ - fastpath_send_multiple_input_pdu(rdp->fastpath, s, 3); + return fastpath_send_multiple_input_pdu(rdp->fastpath, s, 3); } -static void input_send_fastpath_keyboard_pause_event(rdpInput* input) +BOOL input_send_fastpath_keyboard_pause_event(rdpInput* input) { /* In ancient days, pause-down without control sent E1 1D 45 E1 9D C5, * and pause-up sent nothing. However, reverse engineering mstsc shows @@ -279,6 +311,8 @@ static void input_send_fastpath_keyboard_pause_event(rdpInput* input) | FASTPATH_INPUT_KBDFLAGS_RELEASE; s = fastpath_input_pdu_init_header(rdp->fastpath); + if (!s) + return FALSE; /* Control down (0x1D) */ Stream_Write_UINT8(s, keyDownEvent | FASTPATH_INPUT_KBDFLAGS_PREFIX_E1); @@ -296,7 +330,7 @@ static void input_send_fastpath_keyboard_pause_event(rdpInput* input) Stream_Write_UINT8(s, keyUpEvent); Stream_Write_UINT8(s, RDP_SCANCODE_CODE(RDP_SCANCODE_NUMLOCK)); - fastpath_send_multiple_input_pdu(rdp->fastpath, s, 4); + return fastpath_send_multiple_input_pdu(rdp->fastpath, s, 4); } static BOOL input_recv_sync_event(rdpInput* input, wStream* s) @@ -309,9 +343,7 @@ static BOOL input_recv_sync_event(rdpInput* input, wStream* s) Stream_Seek(s, 2); /* pad2Octets (2 bytes) */ Stream_Read_UINT32(s, toggleFlags); /* toggleFlags (4 bytes) */ - IFCALL(input->SynchronizeEvent, input, toggleFlags); - - return TRUE; + IFCALLRETURN(TRUE, input->SynchronizeEvent, input, toggleFlags); } static BOOL input_recv_keyboard_event(rdpInput* input, wStream* s) @@ -344,9 +376,7 @@ static BOOL input_recv_keyboard_event(rdpInput* input, wStream* s) else keyboardFlags |= KBD_FLAGS_DOWN; - IFCALL(input->KeyboardEvent, input, keyboardFlags, keyCode); - - return TRUE; + IFCALLRETURN(TRUE, input->KeyboardEvent, input, keyboardFlags, keyCode); } static BOOL input_recv_unicode_keyboard_event(rdpInput* input, wStream* s) @@ -367,9 +397,7 @@ static BOOL input_recv_unicode_keyboard_event(rdpInput* input, wStream* s) else keyboardFlags |= KBD_FLAGS_DOWN; - IFCALL(input->UnicodeKeyboardEvent, input, keyboardFlags, unicodeCode); - - return TRUE; + IFCALLRETURN(TRUE, input->UnicodeKeyboardEvent, input, keyboardFlags, unicodeCode); } static BOOL input_recv_mouse_event(rdpInput* input, wStream* s) @@ -383,9 +411,7 @@ static BOOL input_recv_mouse_event(rdpInput* input, wStream* s) Stream_Read_UINT16(s, xPos); /* xPos (2 bytes) */ Stream_Read_UINT16(s, yPos); /* yPos (2 bytes) */ - IFCALL(input->MouseEvent, input, pointerFlags, xPos, yPos); - - return TRUE; + IFCALLRETURN(TRUE, input->MouseEvent, input, pointerFlags, xPos, yPos); } static BOOL input_recv_extended_mouse_event(rdpInput* input, wStream* s) @@ -399,9 +425,7 @@ static BOOL input_recv_extended_mouse_event(rdpInput* input, wStream* s) Stream_Read_UINT16(s, xPos); /* xPos (2 bytes) */ Stream_Read_UINT16(s, yPos); /* yPos (2 bytes) */ - IFCALL(input->ExtendedMouseEvent, input, pointerFlags, xPos, yPos); - - return TRUE; + IFCALLRETURN(TRUE, input->ExtendedMouseEvent, input, pointerFlags, xPos, yPos); } static BOOL input_recv_event(rdpInput* input, wStream* s) @@ -507,47 +531,47 @@ void input_register_client_callbacks(rdpInput* input) } } -void freerdp_input_send_synchronize_event(rdpInput* input, UINT32 flags) +BOOL freerdp_input_send_synchronize_event(rdpInput* input, UINT32 flags) { - IFCALL(input->SynchronizeEvent, input, flags); + IFCALLRETURN(TRUE, input->SynchronizeEvent, input, flags); } -void freerdp_input_send_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) +BOOL freerdp_input_send_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) { - IFCALL(input->KeyboardEvent, input, flags, code); + IFCALLRETURN(TRUE, input->KeyboardEvent, input, flags, code); } -void freerdp_input_send_keyboard_event_ex(rdpInput* input, BOOL down, UINT32 rdp_scancode) +BOOL freerdp_input_send_keyboard_event_ex(rdpInput* input, BOOL down, UINT32 rdp_scancode) { - freerdp_input_send_keyboard_event(input, + return freerdp_input_send_keyboard_event(input, (RDP_SCANCODE_EXTENDED(rdp_scancode) ? KBD_FLAGS_EXTENDED : 0) | ((down) ? KBD_FLAGS_DOWN : KBD_FLAGS_RELEASE), RDP_SCANCODE_CODE(rdp_scancode)); } -void freerdp_input_send_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) +BOOL freerdp_input_send_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) { - IFCALL(input->UnicodeKeyboardEvent, input, flags, code); + IFCALLRETURN(TRUE, input->UnicodeKeyboardEvent, input, flags, code); } -void freerdp_input_send_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) +BOOL freerdp_input_send_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) { - IFCALL(input->MouseEvent, input, flags, x, y); + IFCALLRETURN(TRUE, input->MouseEvent, input, flags, x, y); } -void freerdp_input_send_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) +BOOL freerdp_input_send_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) { - IFCALL(input->ExtendedMouseEvent, input, flags, x, y); + IFCALLRETURN(TRUE, input->ExtendedMouseEvent, input, flags, x, y); } -void freerdp_input_send_focus_in_event(rdpInput* input, UINT16 toggleStates) +BOOL freerdp_input_send_focus_in_event(rdpInput* input, UINT16 toggleStates) { - IFCALL(input->FocusInEvent, input, toggleStates); + IFCALLRETURN(TRUE, input->FocusInEvent, input, toggleStates); } -void freerdp_input_send_keyboard_pause_event(rdpInput* input) +BOOL freerdp_input_send_keyboard_pause_event(rdpInput* input) { - IFCALL(input->KeyboardPauseEvent, input); + IFCALLRETURN(TRUE, input->KeyboardPauseEvent, input); } int input_process_events(rdpInput* input) diff --git a/libfreerdp/core/input.h b/libfreerdp/core/input.h index 22f8501c9..415f2be8d 100644 --- a/libfreerdp/core/input.h +++ b/libfreerdp/core/input.h @@ -38,17 +38,17 @@ #define RDP_CLIENT_INPUT_PDU_HEADER_LENGTH 4 -void input_send_synchronize_event(rdpInput* input, UINT32 flags); -void input_send_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code); -void input_send_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code); -void input_send_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); -void input_send_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); +BOOL input_send_synchronize_event(rdpInput* input, UINT32 flags); +BOOL input_send_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code); +BOOL input_send_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code); +BOOL input_send_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); +BOOL input_send_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); -void input_send_fastpath_synchronize_event(rdpInput* input, UINT32 flags); -void input_send_fastpath_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code); -void input_send_fastpath_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code); -void input_send_fastpath_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); -void input_send_fastpath_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); +BOOL input_send_fastpath_synchronize_event(rdpInput* input, UINT32 flags); +BOOL input_send_fastpath_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code); +BOOL input_send_fastpath_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code); +BOOL input_send_fastpath_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); +BOOL input_send_fastpath_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); BOOL input_recv(rdpInput* input, wStream* s); diff --git a/libfreerdp/core/message.c b/libfreerdp/core/message.c index 0480eb861..aa336ca6e 100644 --- a/libfreerdp/core/message.c +++ b/libfreerdp/core/message.c @@ -39,55 +39,70 @@ /* Update */ -static void update_message_BeginPaint(rdpContext* context) +static BOOL update_message_BeginPaint(rdpContext* context) { MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(Update, BeginPaint), NULL, NULL); + + return TRUE; } -static void update_message_EndPaint(rdpContext* context) +static BOOL update_message_EndPaint(rdpContext* context) { MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(Update, EndPaint), NULL, NULL); + return TRUE; } -static void update_message_SetBounds(rdpContext* context, rdpBounds* bounds) +static BOOL update_message_SetBounds(rdpContext* context, rdpBounds* bounds) { rdpBounds* wParam = NULL; if (bounds) { wParam = (rdpBounds*) malloc(sizeof(rdpBounds)); + if (!wParam) + return FALSE; CopyMemory(wParam, bounds, sizeof(rdpBounds)); } MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(Update, SetBounds), (void*) wParam, NULL); + return TRUE; } -static void update_message_Synchronize(rdpContext* context) +static BOOL update_message_Synchronize(rdpContext* context) { MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(Update, Synchronize), NULL, NULL); + return TRUE; } -static void update_message_DesktopResize(rdpContext* context) +static BOOL update_message_DesktopResize(rdpContext* context) { MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(Update, DesktopResize), NULL, NULL); + return TRUE; } -static void update_message_BitmapUpdate(rdpContext* context, BITMAP_UPDATE* bitmap) +static BOOL update_message_BitmapUpdate(rdpContext* context, BITMAP_UPDATE* bitmap) { UINT32 index; BITMAP_UPDATE* wParam; wParam = (BITMAP_UPDATE*) malloc(sizeof(BITMAP_UPDATE)); + if (!wParam) + return FALSE; wParam->number = bitmap->number; wParam->count = wParam->number; wParam->rectangles = (BITMAP_DATA*) malloc(sizeof(BITMAP_DATA) * wParam->number); + if (!wParam->rectangles) + { + free(wParam); + return FALSE; + } CopyMemory(wParam->rectangles, bitmap->rectangles, sizeof(BITMAP_DATA) * wParam->number); for (index = 0; index < wParam->number; index++) @@ -96,329 +111,441 @@ static void update_message_BitmapUpdate(rdpContext* context, BITMAP_UPDATE* bitm StreamPool_AddRef(context->rdp->transport->ReceivePool, bitmap->rectangles[index].bitmapDataStream); #else wParam->rectangles[index].bitmapDataStream = (BYTE*) malloc(wParam->rectangles[index].bitmapLength); + if (!wParam->rectangles[index].bitmapDataStream) + { + for (index -= 1; index >= 0; --index) + { + free(wParam->rectangles[index].bitmapDataStream); + } + free(wParam->rectangles); + free(wParam); + return FALSE; + } CopyMemory(wParam->rectangles[index].bitmapDataStream, bitmap->rectangles[index].bitmapDataStream, wParam->rectangles[index].bitmapLength); #endif } - MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(Update, BitmapUpdate), (void*) wParam, NULL); + + return TRUE; } -static void update_message_Palette(rdpContext* context, PALETTE_UPDATE* palette) +static BOOL update_message_Palette(rdpContext* context, PALETTE_UPDATE* palette) { PALETTE_UPDATE* wParam; wParam = (PALETTE_UPDATE*) malloc(sizeof(PALETTE_UPDATE)); + if (!wParam) + return FALSE; CopyMemory(wParam, palette, sizeof(PALETTE_UPDATE)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(Update, Palette), (void*) wParam, NULL); + return TRUE; } -static void update_message_PlaySound(rdpContext* context, PLAY_SOUND_UPDATE* playSound) +static BOOL update_message_PlaySound(rdpContext* context, PLAY_SOUND_UPDATE* playSound) { PLAY_SOUND_UPDATE* wParam; wParam = (PLAY_SOUND_UPDATE*) malloc(sizeof(PLAY_SOUND_UPDATE)); + if (!wParam) + return FALSE; CopyMemory(wParam, playSound, sizeof(PLAY_SOUND_UPDATE)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(Update, PlaySound), (void*) wParam, NULL); + return TRUE; } -static void update_message_SetKeyboardIndicators(rdpContext* context, UINT16 led_flags) +static BOOL update_message_SetKeyboardIndicators(rdpContext* context, UINT16 led_flags) { MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(Update, SetKeyboardIndicators), (void*)(size_t)led_flags, NULL); + return TRUE; } -static void update_message_RefreshRect(rdpContext* context, BYTE count, RECTANGLE_16* areas) +static BOOL update_message_RefreshRect(rdpContext* context, BYTE count, RECTANGLE_16* areas) { RECTANGLE_16* lParam; lParam = (RECTANGLE_16*) malloc(sizeof(RECTANGLE_16) * count); + if (!lParam) + return FALSE; CopyMemory(lParam, areas, sizeof(RECTANGLE_16) * count); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(Update, RefreshRect), (void*) (size_t) count, (void*) lParam); + return TRUE; } -static void update_message_SuppressOutput(rdpContext* context, BYTE allow, RECTANGLE_16* area) +static BOOL update_message_SuppressOutput(rdpContext* context, BYTE allow, RECTANGLE_16* area) { RECTANGLE_16* lParam = NULL; if (area) { lParam = (RECTANGLE_16*) malloc(sizeof(RECTANGLE_16)); + if (!lParam) + return FALSE; CopyMemory(lParam, area, sizeof(RECTANGLE_16)); } MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(Update, SuppressOutput), (void*) (size_t) allow, (void*) lParam); + return TRUE; } -static void update_message_SurfaceCommand(rdpContext* context, wStream* s) +static BOOL update_message_SurfaceCommand(rdpContext* context, wStream* s) { wStream* wParam; wParam = (wStream*) malloc(sizeof(wStream)); + if (!wParam) + return FALSE; wParam->capacity = Stream_Capacity(s); wParam->buffer = (BYTE*) malloc(wParam->capacity); + if (!wParam->buffer) + { + free(wParam); + return FALSE; + } + wParam->pointer = wParam->buffer; MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(Update, SurfaceCommand), (void*) wParam, NULL); + return TRUE; } -static void update_message_SurfaceBits(rdpContext* context, SURFACE_BITS_COMMAND* surfaceBitsCommand) +static BOOL update_message_SurfaceBits(rdpContext* context, SURFACE_BITS_COMMAND* surfaceBitsCommand) { SURFACE_BITS_COMMAND* wParam; wParam = (SURFACE_BITS_COMMAND*) malloc(sizeof(SURFACE_BITS_COMMAND)); + if (!wParam) + return FALSE; CopyMemory(wParam, surfaceBitsCommand, sizeof(SURFACE_BITS_COMMAND)); #ifdef WITH_STREAM_POOL StreamPool_AddRef(context->rdp->transport->ReceivePool, surfaceBitsCommand->bitmapData); #else wParam->bitmapData = (BYTE*) malloc(wParam->bitmapDataLength); + if (!wParam->bitmapData) + { + free(wParam); + return FALSE; + } CopyMemory(wParam->bitmapData, surfaceBitsCommand->bitmapData, wParam->bitmapDataLength); #endif MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(Update, SurfaceBits), (void*) wParam, NULL); + return TRUE; } -static void update_message_SurfaceFrameMarker(rdpContext* context, SURFACE_FRAME_MARKER* surfaceFrameMarker) +static BOOL update_message_SurfaceFrameMarker(rdpContext* context, SURFACE_FRAME_MARKER* surfaceFrameMarker) { SURFACE_FRAME_MARKER* wParam; wParam = (SURFACE_FRAME_MARKER*) malloc(sizeof(SURFACE_FRAME_MARKER)); + if (!wParam) + return FALSE; CopyMemory(wParam, surfaceFrameMarker, sizeof(SURFACE_FRAME_MARKER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(Update, SurfaceFrameMarker), (void*) wParam, NULL); + + return TRUE; } -static void update_message_SurfaceFrameAcknowledge(rdpContext* context, UINT32 frameId) +static BOOL update_message_SurfaceFrameAcknowledge(rdpContext* context, UINT32 frameId) { MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(Update, SurfaceFrameAcknowledge), (void*) (size_t) frameId, NULL); + + return TRUE; } /* Primary Update */ -static void update_message_DstBlt(rdpContext* context, DSTBLT_ORDER* dstBlt) +static BOOL update_message_DstBlt(rdpContext* context, DSTBLT_ORDER* dstBlt) { DSTBLT_ORDER* wParam; wParam = (DSTBLT_ORDER*) malloc(sizeof(DSTBLT_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, dstBlt, sizeof(DSTBLT_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, DstBlt), (void*) wParam, NULL); + return TRUE; } -static void update_message_PatBlt(rdpContext* context, PATBLT_ORDER* patBlt) +static BOOL update_message_PatBlt(rdpContext* context, PATBLT_ORDER* patBlt) { PATBLT_ORDER* wParam; wParam = (PATBLT_ORDER*) malloc(sizeof(PATBLT_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, patBlt, sizeof(PATBLT_ORDER)); wParam->brush.data = (BYTE*) wParam->brush.p8x8; MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, PatBlt), (void*) wParam, NULL); + return TRUE; } -static void update_message_ScrBlt(rdpContext* context, SCRBLT_ORDER* scrBlt) +static BOOL update_message_ScrBlt(rdpContext* context, SCRBLT_ORDER* scrBlt) { SCRBLT_ORDER* wParam; wParam = (SCRBLT_ORDER*) malloc(sizeof(SCRBLT_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, scrBlt, sizeof(SCRBLT_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, ScrBlt), (void*) wParam, NULL); + + return TRUE; } -static void update_message_OpaqueRect(rdpContext* context, OPAQUE_RECT_ORDER* opaqueRect) +static BOOL update_message_OpaqueRect(rdpContext* context, OPAQUE_RECT_ORDER* opaqueRect) { OPAQUE_RECT_ORDER* wParam; wParam = (OPAQUE_RECT_ORDER*) malloc(sizeof(OPAQUE_RECT_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, opaqueRect, sizeof(OPAQUE_RECT_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, OpaqueRect), (void*) wParam, NULL); + return TRUE; } -static void update_message_DrawNineGrid(rdpContext* context, DRAW_NINE_GRID_ORDER* drawNineGrid) +static BOOL update_message_DrawNineGrid(rdpContext* context, DRAW_NINE_GRID_ORDER* drawNineGrid) { DRAW_NINE_GRID_ORDER* wParam; wParam = (DRAW_NINE_GRID_ORDER*) malloc(sizeof(DRAW_NINE_GRID_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, drawNineGrid, sizeof(DRAW_NINE_GRID_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, DrawNineGrid), (void*) wParam, NULL); + return TRUE; } -static void update_message_MultiDstBlt(rdpContext* context, MULTI_DSTBLT_ORDER* multiDstBlt) +static BOOL update_message_MultiDstBlt(rdpContext* context, MULTI_DSTBLT_ORDER* multiDstBlt) { MULTI_DSTBLT_ORDER* wParam; wParam = (MULTI_DSTBLT_ORDER*) malloc(sizeof(MULTI_DSTBLT_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, multiDstBlt, sizeof(MULTI_DSTBLT_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, MultiDstBlt), (void*) wParam, NULL); + return TRUE; } -static void update_message_MultiPatBlt(rdpContext* context, MULTI_PATBLT_ORDER* multiPatBlt) +static BOOL update_message_MultiPatBlt(rdpContext* context, MULTI_PATBLT_ORDER* multiPatBlt) { MULTI_PATBLT_ORDER* wParam; wParam = (MULTI_PATBLT_ORDER*) malloc(sizeof(MULTI_PATBLT_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, multiPatBlt, sizeof(MULTI_PATBLT_ORDER)); wParam->brush.data = (BYTE*) wParam->brush.p8x8; MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, MultiPatBlt), (void*) wParam, NULL); + return TRUE; } -static void update_message_MultiScrBlt(rdpContext* context, MULTI_SCRBLT_ORDER* multiScrBlt) +static BOOL update_message_MultiScrBlt(rdpContext* context, MULTI_SCRBLT_ORDER* multiScrBlt) { MULTI_SCRBLT_ORDER* wParam; wParam = (MULTI_SCRBLT_ORDER*) malloc(sizeof(MULTI_SCRBLT_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, multiScrBlt, sizeof(MULTI_SCRBLT_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, MultiScrBlt), (void*) wParam, NULL); + return TRUE; } -static void update_message_MultiOpaqueRect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multiOpaqueRect) +static BOOL update_message_MultiOpaqueRect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multiOpaqueRect) { MULTI_OPAQUE_RECT_ORDER* wParam; wParam = (MULTI_OPAQUE_RECT_ORDER*) malloc(sizeof(MULTI_OPAQUE_RECT_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, multiOpaqueRect, sizeof(MULTI_OPAQUE_RECT_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, MultiOpaqueRect), (void*) wParam, NULL); + return TRUE; } -static void update_message_MultiDrawNineGrid(rdpContext* context, MULTI_DRAW_NINE_GRID_ORDER* multiDrawNineGrid) +static BOOL update_message_MultiDrawNineGrid(rdpContext* context, MULTI_DRAW_NINE_GRID_ORDER* multiDrawNineGrid) { MULTI_DRAW_NINE_GRID_ORDER* wParam; wParam = (MULTI_DRAW_NINE_GRID_ORDER*) malloc(sizeof(MULTI_DRAW_NINE_GRID_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, multiDrawNineGrid, sizeof(MULTI_DRAW_NINE_GRID_ORDER)); /* TODO: complete copy */ MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, MultiDrawNineGrid), (void*) wParam, NULL); + return TRUE; } -static void update_message_LineTo(rdpContext* context, LINE_TO_ORDER* lineTo) +static BOOL update_message_LineTo(rdpContext* context, LINE_TO_ORDER* lineTo) { LINE_TO_ORDER* wParam; wParam = (LINE_TO_ORDER*) malloc(sizeof(LINE_TO_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, lineTo, sizeof(LINE_TO_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, LineTo), (void*) wParam, NULL); + return TRUE; } -static void update_message_Polyline(rdpContext* context, POLYLINE_ORDER* polyline) +static BOOL update_message_Polyline(rdpContext* context, POLYLINE_ORDER* polyline) { POLYLINE_ORDER* wParam; wParam = (POLYLINE_ORDER*) malloc(sizeof(POLYLINE_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, polyline, sizeof(POLYLINE_ORDER)); wParam->points = (DELTA_POINT*) malloc(sizeof(DELTA_POINT) * wParam->numDeltaEntries); + if (!wParam->points) + { + free(wParam); + return FALSE; + } CopyMemory(wParam->points, polyline->points, sizeof(DELTA_POINT) * wParam->numDeltaEntries); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, Polyline), (void*) wParam, NULL); + return TRUE; } -static void update_message_MemBlt(rdpContext* context, MEMBLT_ORDER* memBlt) +static BOOL update_message_MemBlt(rdpContext* context, MEMBLT_ORDER* memBlt) { MEMBLT_ORDER* wParam; wParam = (MEMBLT_ORDER*) malloc(sizeof(MEMBLT_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, memBlt, sizeof(MEMBLT_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, MemBlt), (void*) wParam, NULL); + + return TRUE; } -static void update_message_Mem3Blt(rdpContext* context, MEM3BLT_ORDER* mem3Blt) +static BOOL update_message_Mem3Blt(rdpContext* context, MEM3BLT_ORDER* mem3Blt) { MEM3BLT_ORDER* wParam; wParam = (MEM3BLT_ORDER*) malloc(sizeof(MEM3BLT_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, mem3Blt, sizeof(MEM3BLT_ORDER)); wParam->brush.data = (BYTE*) wParam->brush.p8x8; MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, Mem3Blt), (void*) wParam, NULL); + return TRUE; } -static void update_message_SaveBitmap(rdpContext* context, SAVE_BITMAP_ORDER* saveBitmap) +static BOOL update_message_SaveBitmap(rdpContext* context, SAVE_BITMAP_ORDER* saveBitmap) { SAVE_BITMAP_ORDER* wParam; wParam = (SAVE_BITMAP_ORDER*) malloc(sizeof(SAVE_BITMAP_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, saveBitmap, sizeof(SAVE_BITMAP_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, SaveBitmap), (void*) wParam, NULL); + return TRUE; } -static void update_message_GlyphIndex(rdpContext* context, GLYPH_INDEX_ORDER* glyphIndex) +static BOOL update_message_GlyphIndex(rdpContext* context, GLYPH_INDEX_ORDER* glyphIndex) { GLYPH_INDEX_ORDER* wParam; wParam = (GLYPH_INDEX_ORDER*) malloc(sizeof(GLYPH_INDEX_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, glyphIndex, sizeof(GLYPH_INDEX_ORDER)); wParam->brush.data = (BYTE*) wParam->brush.p8x8; MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, GlyphIndex), (void*) wParam, NULL); + return TRUE; } -static void update_message_FastIndex(rdpContext* context, FAST_INDEX_ORDER* fastIndex) +static BOOL update_message_FastIndex(rdpContext* context, FAST_INDEX_ORDER* fastIndex) { FAST_INDEX_ORDER* wParam; wParam = (FAST_INDEX_ORDER*) malloc(sizeof(FAST_INDEX_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, fastIndex, sizeof(FAST_INDEX_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, FastIndex), (void*) wParam, NULL); + return TRUE; } -static void update_message_FastGlyph(rdpContext* context, FAST_GLYPH_ORDER* fastGlyph) +static BOOL update_message_FastGlyph(rdpContext* context, FAST_GLYPH_ORDER* fastGlyph) { FAST_GLYPH_ORDER* wParam; wParam = (FAST_GLYPH_ORDER*) malloc(sizeof(FAST_GLYPH_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, fastGlyph, sizeof(FAST_GLYPH_ORDER)); if (wParam->cbData > 1) { wParam->glyphData.aj = (BYTE*) malloc(fastGlyph->glyphData.cb); + if (!wParam->glyphData.aj) + { + free(wParam); + return FALSE; + } CopyMemory(wParam->glyphData.aj, fastGlyph->glyphData.aj, fastGlyph->glyphData.cb); } else @@ -428,346 +555,469 @@ static void update_message_FastGlyph(rdpContext* context, FAST_GLYPH_ORDER* fast MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, FastGlyph), (void*) wParam, NULL); + return TRUE; } -static void update_message_PolygonSC(rdpContext* context, POLYGON_SC_ORDER* polygonSC) +static BOOL update_message_PolygonSC(rdpContext* context, POLYGON_SC_ORDER* polygonSC) { POLYGON_SC_ORDER* wParam; wParam = (POLYGON_SC_ORDER*) malloc(sizeof(POLYGON_SC_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, polygonSC, sizeof(POLYGON_SC_ORDER)); wParam->points = (DELTA_POINT*) malloc(sizeof(DELTA_POINT) * wParam->numPoints); + if (!wParam->points) + { + free(wParam); + return FALSE; + } CopyMemory(wParam->points, polygonSC, sizeof(DELTA_POINT) * wParam->numPoints); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, PolygonSC), (void*) wParam, NULL); + return TRUE; } -static void update_message_PolygonCB(rdpContext* context, POLYGON_CB_ORDER* polygonCB) +static BOOL update_message_PolygonCB(rdpContext* context, POLYGON_CB_ORDER* polygonCB) { POLYGON_CB_ORDER* wParam; wParam = (POLYGON_CB_ORDER*) malloc(sizeof(POLYGON_CB_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, polygonCB, sizeof(POLYGON_CB_ORDER)); wParam->points = (DELTA_POINT*) malloc(sizeof(DELTA_POINT) * wParam->numPoints); + if (!wParam->points) + { + free(wParam); + return FALSE; + } CopyMemory(wParam->points, polygonCB, sizeof(DELTA_POINT) * wParam->numPoints); wParam->brush.data = (BYTE*) wParam->brush.p8x8; MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, PolygonCB), (void*) wParam, NULL); + return TRUE; } -static void update_message_EllipseSC(rdpContext* context, ELLIPSE_SC_ORDER* ellipseSC) +static BOOL update_message_EllipseSC(rdpContext* context, ELLIPSE_SC_ORDER* ellipseSC) { ELLIPSE_SC_ORDER* wParam; wParam = (ELLIPSE_SC_ORDER*) malloc(sizeof(ELLIPSE_SC_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, ellipseSC, sizeof(ELLIPSE_SC_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, EllipseSC), (void*) wParam, NULL); + return TRUE; } -static void update_message_EllipseCB(rdpContext* context, ELLIPSE_CB_ORDER* ellipseCB) +static BOOL update_message_EllipseCB(rdpContext* context, ELLIPSE_CB_ORDER* ellipseCB) { ELLIPSE_CB_ORDER* wParam; wParam = (ELLIPSE_CB_ORDER*) malloc(sizeof(ELLIPSE_CB_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, ellipseCB, sizeof(ELLIPSE_CB_ORDER)); wParam->brush.data = (BYTE*) wParam->brush.p8x8; MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PrimaryUpdate, EllipseCB), (void*) wParam, NULL); + return TRUE; } /* Secondary Update */ -static void update_message_CacheBitmap(rdpContext* context, CACHE_BITMAP_ORDER* cacheBitmapOrder) +static BOOL update_message_CacheBitmap(rdpContext* context, CACHE_BITMAP_ORDER* cacheBitmapOrder) { CACHE_BITMAP_ORDER* wParam; wParam = (CACHE_BITMAP_ORDER*) malloc(sizeof(CACHE_BITMAP_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, cacheBitmapOrder, sizeof(CACHE_BITMAP_ORDER)); wParam->bitmapDataStream = (BYTE*) malloc(wParam->bitmapLength); + if (!wParam->bitmapDataStream) + { + free(wParam); + return FALSE; + } CopyMemory(wParam->bitmapDataStream, cacheBitmapOrder, wParam->bitmapLength); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(SecondaryUpdate, CacheBitmap), (void*) wParam, NULL); + return TRUE; } -static void update_message_CacheBitmapV2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cacheBitmapV2Order) +static BOOL update_message_CacheBitmapV2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cacheBitmapV2Order) { CACHE_BITMAP_V2_ORDER* wParam; wParam = (CACHE_BITMAP_V2_ORDER*) malloc(sizeof(CACHE_BITMAP_V2_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, cacheBitmapV2Order, sizeof(CACHE_BITMAP_V2_ORDER)); wParam->bitmapDataStream = (BYTE*) malloc(wParam->bitmapLength); + if (!wParam->bitmapDataStream) + { + free(wParam); + return FALSE; + } CopyMemory(wParam->bitmapDataStream, cacheBitmapV2Order->bitmapDataStream, wParam->bitmapLength); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(SecondaryUpdate, CacheBitmapV2), (void*) wParam, NULL); + return TRUE; } -static void update_message_CacheBitmapV3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cacheBitmapV3Order) +static BOOL update_message_CacheBitmapV3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cacheBitmapV3Order) { CACHE_BITMAP_V3_ORDER* wParam; wParam = (CACHE_BITMAP_V3_ORDER*) malloc(sizeof(CACHE_BITMAP_V3_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, cacheBitmapV3Order, sizeof(CACHE_BITMAP_V3_ORDER)); wParam->bitmapData.data = (BYTE*) malloc(wParam->bitmapData.length); + if (!wParam->bitmapData.data) + { + free(wParam); + return FALSE; + } CopyMemory(wParam->bitmapData.data, cacheBitmapV3Order->bitmapData.data, wParam->bitmapData.length); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(SecondaryUpdate, CacheBitmapV3), (void*) wParam, NULL); + return TRUE; } -static void update_message_CacheColorTable(rdpContext* context, CACHE_COLOR_TABLE_ORDER* cacheColorTableOrder) +static BOOL update_message_CacheColorTable(rdpContext* context, CACHE_COLOR_TABLE_ORDER* cacheColorTableOrder) { CACHE_COLOR_TABLE_ORDER* wParam; wParam = (CACHE_COLOR_TABLE_ORDER*) malloc(sizeof(CACHE_COLOR_TABLE_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, cacheColorTableOrder, sizeof(CACHE_COLOR_TABLE_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(SecondaryUpdate, CacheColorTable), (void*) wParam, NULL); + return TRUE; } -static void update_message_CacheGlyph(rdpContext* context, CACHE_GLYPH_ORDER* cacheGlyphOrder) +static BOOL update_message_CacheGlyph(rdpContext* context, CACHE_GLYPH_ORDER* cacheGlyphOrder) { CACHE_GLYPH_ORDER* wParam; wParam = (CACHE_GLYPH_ORDER*) malloc(sizeof(CACHE_GLYPH_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, cacheGlyphOrder, sizeof(CACHE_GLYPH_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(SecondaryUpdate, CacheGlyph), (void*) wParam, NULL); + return TRUE; } -static void update_message_CacheGlyphV2(rdpContext* context, CACHE_GLYPH_V2_ORDER* cacheGlyphV2Order) +static BOOL update_message_CacheGlyphV2(rdpContext* context, CACHE_GLYPH_V2_ORDER* cacheGlyphV2Order) { CACHE_GLYPH_V2_ORDER* wParam; wParam = (CACHE_GLYPH_V2_ORDER*) malloc(sizeof(CACHE_GLYPH_V2_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, cacheGlyphV2Order, sizeof(CACHE_GLYPH_V2_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(SecondaryUpdate, CacheGlyphV2), (void*) wParam, NULL); + return TRUE; } -static void update_message_CacheBrush(rdpContext* context, CACHE_BRUSH_ORDER* cacheBrushOrder) +static BOOL update_message_CacheBrush(rdpContext* context, CACHE_BRUSH_ORDER* cacheBrushOrder) { CACHE_BRUSH_ORDER* wParam; wParam = (CACHE_BRUSH_ORDER*) malloc(sizeof(CACHE_BRUSH_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, cacheBrushOrder, sizeof(CACHE_BRUSH_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(SecondaryUpdate, CacheBrush), (void*) wParam, NULL); + return TRUE; } /* Alternate Secondary Update */ -static void update_message_CreateOffscreenBitmap(rdpContext* context, CREATE_OFFSCREEN_BITMAP_ORDER* createOffscreenBitmap) +static BOOL update_message_CreateOffscreenBitmap(rdpContext* context, CREATE_OFFSCREEN_BITMAP_ORDER* createOffscreenBitmap) { CREATE_OFFSCREEN_BITMAP_ORDER* wParam; wParam = (CREATE_OFFSCREEN_BITMAP_ORDER*) malloc(sizeof(CREATE_OFFSCREEN_BITMAP_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, createOffscreenBitmap, sizeof(CREATE_OFFSCREEN_BITMAP_ORDER)); wParam->deleteList.cIndices = createOffscreenBitmap->deleteList.cIndices; wParam->deleteList.sIndices = wParam->deleteList.cIndices; wParam->deleteList.indices = (UINT16*) malloc(sizeof(UINT16) * wParam->deleteList.cIndices); + if (!wParam->deleteList.indices) + { + free(wParam); + return FALSE; + } CopyMemory(wParam->deleteList.indices, createOffscreenBitmap->deleteList.indices, wParam->deleteList.cIndices); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(AltSecUpdate, CreateOffscreenBitmap), (void*) wParam, NULL); + return TRUE; } -static void update_message_SwitchSurface(rdpContext* context, SWITCH_SURFACE_ORDER* switchSurface) +static BOOL update_message_SwitchSurface(rdpContext* context, SWITCH_SURFACE_ORDER* switchSurface) { SWITCH_SURFACE_ORDER* wParam; wParam = (SWITCH_SURFACE_ORDER*) malloc(sizeof(SWITCH_SURFACE_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, switchSurface, sizeof(SWITCH_SURFACE_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(AltSecUpdate, SwitchSurface), (void*) wParam, NULL); + return TRUE; } -static void update_message_CreateNineGridBitmap(rdpContext* context, CREATE_NINE_GRID_BITMAP_ORDER* createNineGridBitmap) +static BOOL update_message_CreateNineGridBitmap(rdpContext* context, CREATE_NINE_GRID_BITMAP_ORDER* createNineGridBitmap) { CREATE_NINE_GRID_BITMAP_ORDER* wParam; wParam = (CREATE_NINE_GRID_BITMAP_ORDER*) malloc(sizeof(CREATE_NINE_GRID_BITMAP_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, createNineGridBitmap, sizeof(CREATE_NINE_GRID_BITMAP_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(AltSecUpdate, CreateNineGridBitmap), (void*) wParam, NULL); + return TRUE; } -static void update_message_FrameMarker(rdpContext* context, FRAME_MARKER_ORDER* frameMarker) +static BOOL update_message_FrameMarker(rdpContext* context, FRAME_MARKER_ORDER* frameMarker) { FRAME_MARKER_ORDER* wParam; wParam = (FRAME_MARKER_ORDER*) malloc(sizeof(FRAME_MARKER_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, frameMarker, sizeof(FRAME_MARKER_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(AltSecUpdate, FrameMarker), (void*) wParam, NULL); + return TRUE; } -static void update_message_StreamBitmapFirst(rdpContext* context, STREAM_BITMAP_FIRST_ORDER* streamBitmapFirst) +static BOOL update_message_StreamBitmapFirst(rdpContext* context, STREAM_BITMAP_FIRST_ORDER* streamBitmapFirst) { STREAM_BITMAP_FIRST_ORDER* wParam; wParam = (STREAM_BITMAP_FIRST_ORDER*) malloc(sizeof(STREAM_BITMAP_FIRST_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, streamBitmapFirst, sizeof(STREAM_BITMAP_FIRST_ORDER)); /* TODO: complete copy */ MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(AltSecUpdate, StreamBitmapFirst), (void*) wParam, NULL); + return TRUE; } -static void update_message_StreamBitmapNext(rdpContext* context, STREAM_BITMAP_NEXT_ORDER* streamBitmapNext) +static BOOL update_message_StreamBitmapNext(rdpContext* context, STREAM_BITMAP_NEXT_ORDER* streamBitmapNext) { STREAM_BITMAP_NEXT_ORDER* wParam; wParam = (STREAM_BITMAP_NEXT_ORDER*) malloc(sizeof(STREAM_BITMAP_NEXT_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, streamBitmapNext, sizeof(STREAM_BITMAP_NEXT_ORDER)); /* TODO: complete copy */ MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(AltSecUpdate, StreamBitmapNext), (void*) wParam, NULL); + return TRUE; } -static void update_message_DrawGdiPlusFirst(rdpContext* context, DRAW_GDIPLUS_FIRST_ORDER* drawGdiPlusFirst) +static BOOL update_message_DrawGdiPlusFirst(rdpContext* context, DRAW_GDIPLUS_FIRST_ORDER* drawGdiPlusFirst) { DRAW_GDIPLUS_FIRST_ORDER* wParam; wParam = (DRAW_GDIPLUS_FIRST_ORDER*) malloc(sizeof(DRAW_GDIPLUS_FIRST_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, drawGdiPlusFirst, sizeof(DRAW_GDIPLUS_FIRST_ORDER)); /* TODO: complete copy */ MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(AltSecUpdate, DrawGdiPlusFirst), (void*) wParam, NULL); + return TRUE; } -static void update_message_DrawGdiPlusNext(rdpContext* context, DRAW_GDIPLUS_NEXT_ORDER* drawGdiPlusNext) +static BOOL update_message_DrawGdiPlusNext(rdpContext* context, DRAW_GDIPLUS_NEXT_ORDER* drawGdiPlusNext) { DRAW_GDIPLUS_NEXT_ORDER* wParam; wParam = (DRAW_GDIPLUS_NEXT_ORDER*) malloc(sizeof(DRAW_GDIPLUS_NEXT_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, drawGdiPlusNext, sizeof(DRAW_GDIPLUS_NEXT_ORDER)); /* TODO: complete copy */ MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(AltSecUpdate, DrawGdiPlusNext), (void*) wParam, NULL); + return TRUE; } -static void update_message_DrawGdiPlusEnd(rdpContext* context, DRAW_GDIPLUS_END_ORDER* drawGdiPlusEnd) +static BOOL update_message_DrawGdiPlusEnd(rdpContext* context, DRAW_GDIPLUS_END_ORDER* drawGdiPlusEnd) { DRAW_GDIPLUS_END_ORDER* wParam; wParam = (DRAW_GDIPLUS_END_ORDER*) malloc(sizeof(DRAW_GDIPLUS_END_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, drawGdiPlusEnd, sizeof(DRAW_GDIPLUS_END_ORDER)); /* TODO: complete copy */ MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(AltSecUpdate, DrawGdiPlusEnd), (void*) wParam, NULL); + return TRUE; } -static void update_message_DrawGdiPlusCacheFirst(rdpContext* context, DRAW_GDIPLUS_CACHE_FIRST_ORDER* drawGdiPlusCacheFirst) +static BOOL update_message_DrawGdiPlusCacheFirst(rdpContext* context, DRAW_GDIPLUS_CACHE_FIRST_ORDER* drawGdiPlusCacheFirst) { DRAW_GDIPLUS_CACHE_FIRST_ORDER* wParam; wParam = (DRAW_GDIPLUS_CACHE_FIRST_ORDER*) malloc(sizeof(DRAW_GDIPLUS_CACHE_FIRST_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, drawGdiPlusCacheFirst, sizeof(DRAW_GDIPLUS_CACHE_FIRST_ORDER)); /* TODO: complete copy */ MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(AltSecUpdate, DrawGdiPlusCacheFirst), (void*) wParam, NULL); + return TRUE; } -static void update_message_DrawGdiPlusCacheNext(rdpContext* context, DRAW_GDIPLUS_CACHE_NEXT_ORDER* drawGdiPlusCacheNext) +static BOOL update_message_DrawGdiPlusCacheNext(rdpContext* context, DRAW_GDIPLUS_CACHE_NEXT_ORDER* drawGdiPlusCacheNext) { DRAW_GDIPLUS_CACHE_NEXT_ORDER* wParam; wParam = (DRAW_GDIPLUS_CACHE_NEXT_ORDER*) malloc(sizeof(DRAW_GDIPLUS_CACHE_NEXT_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, drawGdiPlusCacheNext, sizeof(DRAW_GDIPLUS_CACHE_NEXT_ORDER)); /* TODO: complete copy */ MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(AltSecUpdate, DrawGdiPlusCacheNext), (void*) wParam, NULL); + return TRUE; } -static void update_message_DrawGdiPlusCacheEnd(rdpContext* context, DRAW_GDIPLUS_CACHE_END_ORDER* drawGdiPlusCacheEnd) +static BOOL update_message_DrawGdiPlusCacheEnd(rdpContext* context, DRAW_GDIPLUS_CACHE_END_ORDER* drawGdiPlusCacheEnd) { DRAW_GDIPLUS_CACHE_END_ORDER* wParam; wParam = (DRAW_GDIPLUS_CACHE_END_ORDER*) malloc(sizeof(DRAW_GDIPLUS_CACHE_END_ORDER)); + if (!wParam) + return FALSE; CopyMemory(wParam, drawGdiPlusCacheEnd, sizeof(DRAW_GDIPLUS_CACHE_END_ORDER)); /* TODO: complete copy */ MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(AltSecUpdate, DrawGdiPlusCacheEnd), (void*) wParam, NULL); + return TRUE; } /* Window Update */ -static void update_message_WindowCreate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* windowState) +static BOOL update_message_WindowCreate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* windowState) { WINDOW_ORDER_INFO* wParam; WINDOW_STATE_ORDER* lParam; wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO)); + if (!wParam) + return FALSE; CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO)); lParam = (WINDOW_STATE_ORDER*) malloc(sizeof(WINDOW_STATE_ORDER)); + if (!lParam) + { + free(wParam); + return FALSE; + } CopyMemory(lParam, windowState, sizeof(WINDOW_STATE_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(WindowUpdate, WindowCreate), (void*) wParam, (void*) lParam); + return TRUE; } -static void update_message_WindowUpdate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* windowState) +static BOOL update_message_WindowUpdate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* windowState) { WINDOW_ORDER_INFO* wParam; WINDOW_STATE_ORDER* lParam; wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO)); + if (!wParam) + return FALSE; CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO)); lParam = (WINDOW_STATE_ORDER*) malloc(sizeof(WINDOW_STATE_ORDER)); + if (!lParam) + { + free(wParam); + return FALSE; + } CopyMemory(lParam, windowState, sizeof(WINDOW_STATE_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(WindowUpdate, WindowUpdate), (void*) wParam, (void*) lParam); + return TRUE; } -static void update_message_WindowIcon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_ICON_ORDER* windowIcon) +static BOOL update_message_WindowIcon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_ICON_ORDER* windowIcon) { WINDOW_ORDER_INFO* wParam; WINDOW_ICON_ORDER* lParam; wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO)); + if (!wParam) + return FALSE; CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO)); - lParam = (WINDOW_ICON_ORDER*) malloc(sizeof(WINDOW_ICON_ORDER)); + lParam = (WINDOW_ICON_ORDER*) calloc(1, sizeof(WINDOW_ICON_ORDER)); + if (!lParam) + { + free(wParam); + return FALSE; + } CopyMemory(lParam, windowIcon, sizeof(WINDOW_ICON_ORDER)); WLog_VRB(TAG, "update_message_WindowIcon"); @@ -775,101 +1025,154 @@ static void update_message_WindowIcon(rdpContext* context, WINDOW_ORDER_INFO* or if (windowIcon->iconInfo->cbBitsColor > 0) { lParam->iconInfo->bitsColor = (BYTE*) malloc(windowIcon->iconInfo->cbBitsColor); + if (!lParam->iconInfo->bitsColor) + goto out_fail; CopyMemory(lParam->iconInfo->bitsColor, windowIcon->iconInfo->bitsColor, windowIcon->iconInfo->cbBitsColor); } if (windowIcon->iconInfo->cbBitsMask > 0) { lParam->iconInfo->bitsMask = (BYTE*) malloc(windowIcon->iconInfo->cbBitsMask); + if (!lParam->iconInfo->bitsMask) + goto out_fail; CopyMemory(lParam->iconInfo->bitsMask, windowIcon->iconInfo->bitsMask, windowIcon->iconInfo->cbBitsMask); } if (windowIcon->iconInfo->cbColorTable > 0) { lParam->iconInfo->colorTable = (BYTE*) malloc(windowIcon->iconInfo->cbColorTable); + if (!lParam->iconInfo->colorTable) + goto out_fail; CopyMemory(lParam->iconInfo->colorTable, windowIcon->iconInfo->colorTable, windowIcon->iconInfo->cbColorTable); } MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(WindowUpdate, WindowIcon), (void*) wParam, (void*) lParam); + return TRUE; + +out_fail: + free(lParam->iconInfo->bitsColor); + free(lParam->iconInfo->bitsMask); + free(lParam->iconInfo->colorTable); + free(lParam); + free(wParam); + return FALSE; + } -static void update_message_WindowCachedIcon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_CACHED_ICON_ORDER* windowCachedIcon) +static BOOL update_message_WindowCachedIcon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_CACHED_ICON_ORDER* windowCachedIcon) { WINDOW_ORDER_INFO* wParam; WINDOW_CACHED_ICON_ORDER* lParam; wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO)); + if (!wParam) + return FALSE; CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO)); lParam = (WINDOW_CACHED_ICON_ORDER*) malloc(sizeof(WINDOW_CACHED_ICON_ORDER)); + if (!lParam) + { + free(wParam); + return FALSE; + } CopyMemory(lParam, windowCachedIcon, sizeof(WINDOW_CACHED_ICON_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(WindowUpdate, WindowCachedIcon), (void*) wParam, (void*) lParam); + return TRUE; } -static void update_message_WindowDelete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) +static BOOL update_message_WindowDelete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) { WINDOW_ORDER_INFO* wParam; wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO)); + if (!wParam) + return FALSE; CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(WindowUpdate, WindowDelete), (void*) wParam, NULL); + return TRUE; } -static void update_message_NotifyIconCreate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) +static BOOL update_message_NotifyIconCreate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) { WINDOW_ORDER_INFO* wParam; NOTIFY_ICON_STATE_ORDER* lParam; wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO)); + if (!wParam) + return FALSE; CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO)); lParam = (NOTIFY_ICON_STATE_ORDER*) malloc(sizeof(NOTIFY_ICON_STATE_ORDER)); + if (!lParam) + { + free(wParam); + return FALSE; + } CopyMemory(lParam, notifyIconState, sizeof(NOTIFY_ICON_STATE_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(WindowUpdate, NotifyIconCreate), (void*) wParam, (void*) lParam); + return TRUE; } -static void update_message_NotifyIconUpdate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) +static BOOL update_message_NotifyIconUpdate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState) { WINDOW_ORDER_INFO* wParam; NOTIFY_ICON_STATE_ORDER* lParam; wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO)); + if (!wParam) + return FALSE; CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO)); lParam = (NOTIFY_ICON_STATE_ORDER*) malloc(sizeof(NOTIFY_ICON_STATE_ORDER)); + if (!lParam) + { + free(wParam); + return FALSE; + } CopyMemory(lParam, notifyIconState, sizeof(NOTIFY_ICON_STATE_ORDER)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(WindowUpdate, NotifyIconUpdate), (void*) wParam, (void*) lParam); + return TRUE; } -static void update_message_NotifyIconDelete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) +static BOOL update_message_NotifyIconDelete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) { WINDOW_ORDER_INFO* wParam; wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO)); + if (!wParam) + return FALSE; CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(WindowUpdate, NotifyIconDelete), (void*) wParam, NULL); + return TRUE; } -static void update_message_MonitoredDesktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, MONITORED_DESKTOP_ORDER* monitoredDesktop) +static BOOL update_message_MonitoredDesktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, MONITORED_DESKTOP_ORDER* monitoredDesktop) { WINDOW_ORDER_INFO* wParam; MONITORED_DESKTOP_ORDER* lParam; wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO)); + if (!wParam) + return FALSE; CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO)); lParam = (MONITORED_DESKTOP_ORDER*) malloc(sizeof(MONITORED_DESKTOP_ORDER)); + if (!lParam) + { + free(wParam); + return FALSE; + } CopyMemory(lParam, monitoredDesktop, sizeof(MONITORED_DESKTOP_ORDER)); lParam->windowIds = NULL; @@ -882,48 +1185,60 @@ static void update_message_MonitoredDesktop(rdpContext* context, WINDOW_ORDER_IN MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(WindowUpdate, MonitoredDesktop), (void*) wParam, (void*) lParam); + return TRUE; } -static void update_message_NonMonitoredDesktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) +static BOOL update_message_NonMonitoredDesktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo) { WINDOW_ORDER_INFO* wParam; wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO)); + if (!wParam) + return FALSE; CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(WindowUpdate, NonMonitoredDesktop), (void*) wParam, NULL); + return TRUE; } /* Pointer Update */ -static void update_message_PointerPosition(rdpContext* context, POINTER_POSITION_UPDATE* pointerPosition) +static BOOL update_message_PointerPosition(rdpContext* context, POINTER_POSITION_UPDATE* pointerPosition) { POINTER_POSITION_UPDATE* wParam; wParam = (POINTER_POSITION_UPDATE*) malloc(sizeof(POINTER_POSITION_UPDATE)); + if (!wParam) + return FALSE; CopyMemory(wParam, pointerPosition, sizeof(POINTER_POSITION_UPDATE)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PointerUpdate, PointerPosition), (void*) wParam, NULL); + return TRUE; } -static void update_message_PointerSystem(rdpContext* context, POINTER_SYSTEM_UPDATE* pointerSystem) +static BOOL update_message_PointerSystem(rdpContext* context, POINTER_SYSTEM_UPDATE* pointerSystem) { POINTER_SYSTEM_UPDATE* wParam; wParam = (POINTER_SYSTEM_UPDATE*) malloc(sizeof(POINTER_SYSTEM_UPDATE)); + if (!wParam) + return FALSE; CopyMemory(wParam, pointerSystem, sizeof(POINTER_SYSTEM_UPDATE)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PointerUpdate, PointerSystem), (void*) wParam, NULL); + return TRUE; } -static void update_message_PointerColor(rdpContext* context, POINTER_COLOR_UPDATE* pointerColor) +static BOOL update_message_PointerColor(rdpContext* context, POINTER_COLOR_UPDATE* pointerColor) { POINTER_COLOR_UPDATE* wParam; wParam = (POINTER_COLOR_UPDATE*) malloc(sizeof(POINTER_COLOR_UPDATE)); + if (!wParam) + return FALSE; CopyMemory(wParam, pointerColor, sizeof(POINTER_COLOR_UPDATE)); wParam->andMaskData = wParam->xorMaskData = NULL; @@ -931,24 +1246,37 @@ static void update_message_PointerColor(rdpContext* context, POINTER_COLOR_UPDAT if (wParam->lengthAndMask) { wParam->andMaskData = (BYTE*) malloc(wParam->lengthAndMask); + if (!wParam->andMaskData) + goto out_fail; CopyMemory(wParam->andMaskData, pointerColor->andMaskData, wParam->lengthAndMask); } if (wParam->lengthXorMask) { wParam->xorMaskData = (BYTE*) malloc(wParam->lengthXorMask); + if (!wParam->xorMaskData) + goto out_fail; CopyMemory(wParam->xorMaskData, pointerColor->xorMaskData, wParam->lengthXorMask); } MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PointerUpdate, PointerColor), (void*) wParam, NULL); + return TRUE; + +out_fail: + free(wParam->andMaskData); + free(wParam->xorMaskData); + free(wParam); + return FALSE; } -static void update_message_PointerNew(rdpContext* context, POINTER_NEW_UPDATE* pointerNew) +static BOOL update_message_PointerNew(rdpContext* context, POINTER_NEW_UPDATE* pointerNew) { POINTER_NEW_UPDATE* wParam; wParam = (POINTER_NEW_UPDATE*) malloc(sizeof(POINTER_NEW_UPDATE)); + if (!wParam) + return FALSE; CopyMemory(wParam, pointerNew, sizeof(POINTER_NEW_UPDATE)); wParam->colorPtrAttr.andMaskData = wParam->colorPtrAttr.xorMaskData = NULL; @@ -956,28 +1284,42 @@ static void update_message_PointerNew(rdpContext* context, POINTER_NEW_UPDATE* p if (wParam->colorPtrAttr.lengthAndMask) { wParam->colorPtrAttr.andMaskData = (BYTE*) malloc(wParam->colorPtrAttr.lengthAndMask); + if (!wParam->colorPtrAttr.andMaskData) + goto out_fail; CopyMemory(wParam->colorPtrAttr.andMaskData, pointerNew->colorPtrAttr.andMaskData, wParam->colorPtrAttr.lengthAndMask); } if (wParam->colorPtrAttr.lengthXorMask) { wParam->colorPtrAttr.xorMaskData = (BYTE*) malloc(wParam->colorPtrAttr.lengthXorMask); + if (!wParam->colorPtrAttr.xorMaskData) + goto out_fail; CopyMemory(wParam->colorPtrAttr.xorMaskData, pointerNew->colorPtrAttr.xorMaskData, wParam->colorPtrAttr.lengthXorMask); } MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PointerUpdate, PointerNew), (void*) wParam, NULL); + return TRUE; + +out_fail: + free(wParam->colorPtrAttr.andMaskData); + free(wParam->colorPtrAttr.xorMaskData); + free(wParam); + return FALSE; } -static void update_message_PointerCached(rdpContext* context, POINTER_CACHED_UPDATE* pointerCached) +static BOOL update_message_PointerCached(rdpContext* context, POINTER_CACHED_UPDATE* pointerCached) { POINTER_CACHED_UPDATE* wParam; wParam = (POINTER_CACHED_UPDATE*) malloc(sizeof(POINTER_CACHED_UPDATE)); + if (!wParam) + return FALSE; CopyMemory(wParam, pointerCached, sizeof(POINTER_CACHED_UPDATE)); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(PointerUpdate, PointerCached), (void*) wParam, NULL); + return TRUE; } /* Message Queue */ @@ -2231,50 +2573,57 @@ void update_message_proxy_free(rdpUpdateProxy* message) /* Input */ -static void input_message_SynchronizeEvent(rdpInput* input, UINT32 flags) +static BOOL input_message_SynchronizeEvent(rdpInput* input, UINT32 flags) { MessageQueue_Post(input->queue, (void*) input, MakeMessageId(Input, SynchronizeEvent), (void*) (size_t) flags, NULL); + return TRUE; } -static void input_message_KeyboardEvent(rdpInput* input, UINT16 flags, UINT16 code) +static BOOL input_message_KeyboardEvent(rdpInput* input, UINT16 flags, UINT16 code) { MessageQueue_Post(input->queue, (void*) input, MakeMessageId(Input, KeyboardEvent), (void*) (size_t) flags, (void*) (size_t) code); + return TRUE; } -static void input_message_UnicodeKeyboardEvent(rdpInput* input, UINT16 flags, UINT16 code) +static BOOL input_message_UnicodeKeyboardEvent(rdpInput* input, UINT16 flags, UINT16 code) { MessageQueue_Post(input->queue, (void*) input, MakeMessageId(Input, UnicodeKeyboardEvent), (void*) (size_t) flags, (void*) (size_t) code); + return TRUE; } -static void input_message_MouseEvent(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) +static BOOL input_message_MouseEvent(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) { UINT32 pos = (x << 16) | y; MessageQueue_Post(input->queue, (void*) input, MakeMessageId(Input, MouseEvent), (void*) (size_t) flags, (void*) (size_t) pos); + return TRUE; } -static void input_message_ExtendedMouseEvent(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) +static BOOL input_message_ExtendedMouseEvent(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) { UINT32 pos = (x << 16) | y; MessageQueue_Post(input->queue, (void*) input, MakeMessageId(Input, ExtendedMouseEvent), (void*) (size_t) flags, (void*) (size_t) pos); + return TRUE; } -static void input_message_FocusInEvent(rdpInput* input, UINT16 toggleStates) +static BOOL input_message_FocusInEvent(rdpInput* input, UINT16 toggleStates) { MessageQueue_Post(input->queue, (void*) input, MakeMessageId(Input, FocusInEvent), (void*) (size_t) toggleStates, NULL); + return TRUE; } -static void input_message_KeyboardPauseEvent(rdpInput* input) +static BOOL input_message_KeyboardPauseEvent(rdpInput* input) { MessageQueue_Post(input->queue, (void*) input, MakeMessageId(Input, KeyboardPauseEvent), NULL, NULL); + return TRUE; } /* Event Queue */ diff --git a/libfreerdp/core/rdp.c b/libfreerdp/core/rdp.c index 572bbadd1..6fcff23f1 100644 --- a/libfreerdp/core/rdp.c +++ b/libfreerdp/core/rdp.c @@ -239,6 +239,8 @@ wStream* rdp_data_pdu_init(rdpRdp* rdp) { wStream* s; s = transport_send_stream_init(rdp->transport, 2048); + if (!s) + return NULL; rdp_init_stream_data_pdu(rdp, s); return s; } diff --git a/libfreerdp/core/surface.c b/libfreerdp/core/surface.c index f1997c3d0..8a9fb7eba 100644 --- a/libfreerdp/core/surface.c +++ b/libfreerdp/core/surface.c @@ -136,9 +136,10 @@ int update_recv_surfcmds(rdpUpdate* update, UINT32 size, wStream* s) return 0; } -void update_write_surfcmd_surface_bits_header(wStream* s, SURFACE_BITS_COMMAND* cmd) +BOOL update_write_surfcmd_surface_bits_header(wStream* s, SURFACE_BITS_COMMAND* cmd) { - Stream_EnsureRemainingCapacity(s, SURFCMD_SURFACE_BITS_HEADER_LENGTH); + if (!Stream_EnsureRemainingCapacity(s, SURFCMD_SURFACE_BITS_HEADER_LENGTH)) + return FALSE; Stream_Write_UINT16(s, CMDTYPE_STREAM_SURFACE_BITS); @@ -152,14 +153,18 @@ void update_write_surfcmd_surface_bits_header(wStream* s, SURFACE_BITS_COMMAND* Stream_Write_UINT16(s, cmd->width); Stream_Write_UINT16(s, cmd->height); Stream_Write_UINT32(s, cmd->bitmapDataLength); + + return TRUE; } -void update_write_surfcmd_frame_marker(wStream* s, UINT16 frameAction, UINT32 frameId) +BOOL update_write_surfcmd_frame_marker(wStream* s, UINT16 frameAction, UINT32 frameId) { - Stream_EnsureRemainingCapacity(s, SURFCMD_FRAME_MARKER_LENGTH); + if (!Stream_EnsureRemainingCapacity(s, SURFCMD_FRAME_MARKER_LENGTH)) + return FALSE; Stream_Write_UINT16(s, CMDTYPE_FRAME_MARKER); Stream_Write_UINT16(s, frameAction); Stream_Write_UINT32(s, frameId); + return TRUE; } diff --git a/libfreerdp/core/surface.h b/libfreerdp/core/surface.h index f415a9d7b..610b6a4ff 100644 --- a/libfreerdp/core/surface.h +++ b/libfreerdp/core/surface.h @@ -36,8 +36,8 @@ enum SURFCMD_CMDTYPE int update_recv_surfcmds(rdpUpdate* update, UINT32 size, wStream* s); -void update_write_surfcmd_surface_bits_header(wStream* s, SURFACE_BITS_COMMAND* cmd); -void update_write_surfcmd_frame_marker(wStream* s, UINT16 frameAction, UINT32 frameId); +BOOL update_write_surfcmd_surface_bits_header(wStream* s, SURFACE_BITS_COMMAND* cmd); +BOOL update_write_surfcmd_frame_marker(wStream* s, UINT16 frameAction, UINT32 frameId); #endif /* __SURFACE */ diff --git a/libfreerdp/core/update.c b/libfreerdp/core/update.c index 38c230267..56d17d06c 100644 --- a/libfreerdp/core/update.c +++ b/libfreerdp/core/update.c @@ -593,7 +593,7 @@ void update_post_disconnect(rdpUpdate* update) update_message_proxy_free(update->proxy); } -static void update_begin_paint(rdpContext* context) +static BOOL update_begin_paint(rdpContext* context) { wStream* s; rdpUpdate* update = context->update; @@ -602,22 +602,25 @@ static void update_begin_paint(rdpContext* context) update->EndPaint(context); s = fastpath_update_pdu_init_new(context->rdp->fastpath); + if (!s) + return FALSE; Stream_SealLength(s); Stream_Seek(s, 2); /* numberOrders (2 bytes) */ update->combineUpdates = TRUE; update->numberOrders = 0; update->us = s; + return TRUE; } -static void update_end_paint(rdpContext* context) +static BOOL update_end_paint(rdpContext* context) { wStream* s; int headerLength; rdpUpdate* update = context->update; if (!update->us) - return; + return FALSE; s = update->us; headerLength = Stream_Length(s); @@ -638,6 +641,7 @@ static void update_end_paint(rdpContext* context) update->us = NULL; Stream_Free(s, TRUE); + return TRUE; } static void update_flush(rdpContext* context) @@ -684,7 +688,7 @@ static BOOL update_check_flush(rdpContext* context, int size) return FALSE; } -static void update_set_bounds(rdpContext* context, rdpBounds* bounds) +static BOOL update_set_bounds(rdpContext* context, rdpBounds* bounds) { rdpUpdate* update = context->update; @@ -694,6 +698,7 @@ static void update_set_bounds(rdpContext* context, rdpBounds* bounds) ZeroMemory(&update->currentBounds, sizeof(rdpBounds)); else CopyMemory(&update->currentBounds, bounds, sizeof(rdpBounds)); + return TRUE; } BOOL update_bounds_is_null(rdpBounds* bounds) @@ -824,19 +829,24 @@ static void update_write_refresh_rect(wStream* s, BYTE count, RECTANGLE_16* area } } -static void update_send_refresh_rect(rdpContext* context, BYTE count, RECTANGLE_16* areas) +static BOOL update_send_refresh_rect(rdpContext* context, BYTE count, RECTANGLE_16* areas) { wStream* s; rdpRdp* rdp = context->rdp; if (rdp->settings->RefreshRect) { + BOOL ret; s = rdp_data_pdu_init(rdp); + if (!s) + return FALSE; update_write_refresh_rect(s, count, areas); - rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_REFRESH_RECT, rdp->mcs->userId); + ret = rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_REFRESH_RECT, rdp->mcs->userId); Stream_Release(s); + return ret; } + return TRUE; } static void update_write_suppress_output(wStream* s, BYTE allow, RECTANGLE_16* area) @@ -854,160 +864,228 @@ static void update_write_suppress_output(wStream* s, BYTE allow, RECTANGLE_16* a } } -static void update_send_suppress_output(rdpContext* context, BYTE allow, RECTANGLE_16* area) +static BOOL update_send_suppress_output(rdpContext* context, BYTE allow, RECTANGLE_16* area) { wStream* s; rdpRdp* rdp = context->rdp; if (rdp->settings->SuppressOutput) { + BOOL ret; s = rdp_data_pdu_init(rdp); + if (!s) + return FALSE; update_write_suppress_output(s, allow, area); - rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_SUPPRESS_OUTPUT, rdp->mcs->userId); + ret = rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_SUPPRESS_OUTPUT, rdp->mcs->userId); Stream_Release(s); + return ret; } + return TRUE; } -static void update_send_surface_command(rdpContext* context, wStream* s) +static BOOL update_send_surface_command(rdpContext* context, wStream* s) { wStream* update; rdpRdp* rdp = context->rdp; + BOOL ret; update = fastpath_update_pdu_init(rdp->fastpath); - Stream_EnsureRemainingCapacity(update, Stream_GetPosition(s)); + if (!update) + return FALSE; + if (!Stream_EnsureRemainingCapacity(update, Stream_GetPosition(s))) + { + ret = FALSE; + goto out_fail; + } Stream_Write(update, Stream_Buffer(s), Stream_GetPosition(s)); - fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SURFCMDS, update, FALSE); + ret = fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SURFCMDS, update, FALSE); + +out_fail: Stream_Release(update); + return ret; } -static void update_send_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surfaceBitsCommand) +static BOOL update_send_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surfaceBitsCommand) { wStream* s; rdpRdp* rdp = context->rdp; + BOOL ret = FALSE; update_force_flush(context); s = fastpath_update_pdu_init(rdp->fastpath); - Stream_EnsureRemainingCapacity(s, SURFCMD_SURFACE_BITS_HEADER_LENGTH + (int) surfaceBitsCommand->bitmapDataLength); - update_write_surfcmd_surface_bits_header(s, surfaceBitsCommand); + if (!s) + return FALSE; + + if (!Stream_EnsureRemainingCapacity(s, SURFCMD_SURFACE_BITS_HEADER_LENGTH + (int) surfaceBitsCommand->bitmapDataLength) || + !update_write_surfcmd_surface_bits_header(s, surfaceBitsCommand)) + goto out_fail; + Stream_Write(s, surfaceBitsCommand->bitmapData, surfaceBitsCommand->bitmapDataLength); - fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SURFCMDS, s, surfaceBitsCommand->skipCompression); + + if (!fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SURFCMDS, s, surfaceBitsCommand->skipCompression)) + goto out_fail; update_force_flush(context); + ret = TRUE; +out_fail: Stream_Release(s); + return ret; } -static void update_send_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surfaceFrameMarker) +static BOOL update_send_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surfaceFrameMarker) { wStream* s; rdpRdp* rdp = context->rdp; + BOOL ret = FALSE; update_force_flush(context); s = fastpath_update_pdu_init(rdp->fastpath); - update_write_surfcmd_frame_marker(s, surfaceFrameMarker->frameAction, surfaceFrameMarker->frameId); - fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SURFCMDS, s, FALSE); + if (!s) + return FALSE; + + if (!update_write_surfcmd_frame_marker(s, surfaceFrameMarker->frameAction, surfaceFrameMarker->frameId) || + !fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SURFCMDS, s, FALSE)) + goto out_fail; update_force_flush(context); + ret = TRUE; +out_fail: Stream_Release(s); + return ret; } -static void update_send_surface_frame_bits(rdpContext* context, SURFACE_BITS_COMMAND* cmd, BOOL first, BOOL last, UINT32 frameId) +static BOOL update_send_surface_frame_bits(rdpContext* context, SURFACE_BITS_COMMAND* cmd, BOOL first, BOOL last, UINT32 frameId) { wStream* s; rdpRdp* rdp = context->rdp; + BOOL ret = FALSE; update_force_flush(context); s = fastpath_update_pdu_init(rdp->fastpath); - Stream_EnsureRemainingCapacity(s, SURFCMD_SURFACE_BITS_HEADER_LENGTH + (int) cmd->bitmapDataLength + 16); + if (!s) + return FALSE; + if (!Stream_EnsureRemainingCapacity(s, SURFCMD_SURFACE_BITS_HEADER_LENGTH + (int) cmd->bitmapDataLength + 16)) + goto out_fail; if (first) - update_write_surfcmd_frame_marker(s, SURFACECMD_FRAMEACTION_BEGIN, frameId); + { + if (!update_write_surfcmd_frame_marker(s, SURFACECMD_FRAMEACTION_BEGIN, frameId)) + goto out_fail; + } - update_write_surfcmd_surface_bits_header(s, cmd); + if (!update_write_surfcmd_surface_bits_header(s, cmd)) + goto out_fail; Stream_Write(s, cmd->bitmapData, cmd->bitmapDataLength); - if (last) - update_write_surfcmd_frame_marker(s, SURFACECMD_FRAMEACTION_END, frameId); + { + if (!update_write_surfcmd_frame_marker(s, SURFACECMD_FRAMEACTION_END, frameId)) + return FALSE; + } - fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SURFCMDS, s, cmd->skipCompression); + ret = fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SURFCMDS, s, cmd->skipCompression); update_force_flush(context); +out_fail: Stream_Release(s); + return ret; } -static void update_send_frame_acknowledge(rdpContext* context, UINT32 frameId) +static BOOL update_send_frame_acknowledge(rdpContext* context, UINT32 frameId) { wStream* s; rdpRdp* rdp = context->rdp; if (rdp->settings->ReceivedCapabilities[CAPSET_TYPE_FRAME_ACKNOWLEDGE]) { + BOOL ret; s = rdp_data_pdu_init(rdp); + if (!s) + return FALSE; Stream_Write_UINT32(s, frameId); - rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_FRAME_ACKNOWLEDGE, rdp->mcs->userId); + ret = rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_FRAME_ACKNOWLEDGE, rdp->mcs->userId); Stream_Release(s); + return ret; } + return TRUE; } -static void update_send_synchronize(rdpContext* context) +static BOOL update_send_synchronize(rdpContext* context) { wStream* s; rdpRdp* rdp = context->rdp; + BOOL ret; s = fastpath_update_pdu_init(rdp->fastpath); + if (!s) + return FALSE; Stream_Zero(s, 2); /* pad2Octets (2 bytes) */ - fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SYNCHRONIZE, s, FALSE); + ret = fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SYNCHRONIZE, s, FALSE); Stream_Release(s); + return ret; } -static void update_send_desktop_resize(rdpContext* context) +static BOOL update_send_desktop_resize(rdpContext* context) { - rdp_server_reactivate(context->rdp); + return rdp_server_reactivate(context->rdp); } -static void update_send_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) +static BOOL update_send_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) { wStream* s; rdpRdp* rdp = context->rdp; rdpUpdate* update = context->update; + BOOL ret = TRUE; update_force_flush(context); s = fastpath_update_pdu_init(rdp->fastpath); - update_write_bitmap_update(update, s, bitmapUpdate); - fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_BITMAP, s, bitmapUpdate->skipCompression); + if (!s) + return FALSE; + if (!update_write_bitmap_update(update, s, bitmapUpdate) || + !fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_BITMAP, s, bitmapUpdate->skipCompression)) + { + ret = FALSE; + goto out_fail; + } update_force_flush(context); +out_fail: Stream_Release(s); + return ret; } -static void update_send_play_sound(rdpContext* context, PLAY_SOUND_UPDATE* play_sound) +static BOOL update_send_play_sound(rdpContext* context, PLAY_SOUND_UPDATE* play_sound) { wStream* s; rdpRdp* rdp = context->rdp; + BOOL ret; if (!rdp->settings->ReceivedCapabilities[CAPSET_TYPE_SOUND]) { - return; + return TRUE; } s = rdp_data_pdu_init(rdp); + if (!s) + return FALSE; Stream_Write_UINT32(s, play_sound->duration); Stream_Write_UINT32(s, play_sound->frequency); - rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_PLAY_SOUND, rdp->mcs->userId); + ret = rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_PLAY_SOUND, rdp->mcs->userId); Stream_Release(s); + return ret; } /** * Primary Drawing Orders */ -static void update_send_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) +static BOOL update_send_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) { wStream* s; int offset; @@ -1020,18 +1098,23 @@ static void update_send_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) update_check_flush(context, headerLength + update_approximate_dstblt_order(&orderInfo, dstblt)); s = update->us; + if (!s) + return FALSE; offset = Stream_GetPosition(s); - Stream_EnsureRemainingCapacity(s, headerLength); + if (!Stream_EnsureRemainingCapacity(s, headerLength)) + return FALSE; Stream_Seek(s, headerLength); - update_write_dstblt_order(s, &orderInfo, dstblt); + if (!update_write_dstblt_order(s, &orderInfo, dstblt)) + return FALSE; update_write_order_info(context, s, &orderInfo, offset); update->numberOrders++; + return TRUE; } -static void update_send_patblt(rdpContext* context, PATBLT_ORDER* patblt) +static BOOL update_send_patblt(rdpContext* context, PATBLT_ORDER* patblt) { wStream* s; int offset; @@ -1044,18 +1127,22 @@ static void update_send_patblt(rdpContext* context, PATBLT_ORDER* patblt) update_check_flush(context, headerLength + update_approximate_patblt_order(&orderInfo, patblt)); s = update->us; + if (!s) + return FALSE; offset = Stream_GetPosition(s); - Stream_EnsureRemainingCapacity(s, headerLength); + if (!Stream_EnsureRemainingCapacity(s, headerLength)) + return FALSE; Stream_Seek(s, headerLength); update_write_patblt_order(s, &orderInfo, patblt); update_write_order_info(context, s, &orderInfo, offset); update->numberOrders++; + return TRUE; } -static void update_send_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) +static BOOL update_send_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) { wStream* s; int offset; @@ -1068,18 +1155,22 @@ static void update_send_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) update_check_flush(context, headerLength + update_approximate_scrblt_order(&orderInfo, scrblt)); s = update->us; + if (!s) + return TRUE; offset = Stream_GetPosition(s); - Stream_EnsureRemainingCapacity(s, headerLength); + if (!Stream_EnsureRemainingCapacity(s, headerLength)) + return FALSE; Stream_Seek(s, headerLength); update_write_scrblt_order(s, &orderInfo, scrblt); update_write_order_info(context, s, &orderInfo, offset); update->numberOrders++; + return TRUE; } -static void update_send_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect) +static BOOL update_send_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect) { wStream* s; int offset; @@ -1092,18 +1183,22 @@ static void update_send_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaq update_check_flush(context, headerLength + update_approximate_opaque_rect_order(&orderInfo, opaque_rect)); s = update->us; + if (!s) + return FALSE; offset = Stream_GetPosition(s); - Stream_EnsureRemainingCapacity(s, headerLength); + if (!Stream_EnsureRemainingCapacity(s, headerLength)) + return FALSE; Stream_Seek(s, headerLength); update_write_opaque_rect_order(s, &orderInfo, opaque_rect); update_write_order_info(context, s, &orderInfo, offset); update->numberOrders++; + return TRUE; } -static void update_send_line_to(rdpContext* context, LINE_TO_ORDER* line_to) +static BOOL update_send_line_to(rdpContext* context, LINE_TO_ORDER* line_to) { wStream* s; int offset; @@ -1116,18 +1211,22 @@ static void update_send_line_to(rdpContext* context, LINE_TO_ORDER* line_to) update_check_flush(context, headerLength + update_approximate_line_to_order(&orderInfo, line_to)); s = update->us; + if (!s) + return FALSE; offset = Stream_GetPosition(s); - Stream_EnsureRemainingCapacity(s, headerLength); + if (!Stream_EnsureRemainingCapacity(s, headerLength)) + return FALSE; Stream_Seek(s, headerLength); update_write_line_to_order(s, &orderInfo, line_to); update_write_order_info(context, s, &orderInfo, offset); update->numberOrders++; + return TRUE; } -static void update_send_memblt(rdpContext* context, MEMBLT_ORDER* memblt) +static BOOL update_send_memblt(rdpContext* context, MEMBLT_ORDER* memblt) { wStream* s; int offset; @@ -1140,18 +1239,22 @@ static void update_send_memblt(rdpContext* context, MEMBLT_ORDER* memblt) update_check_flush(context, headerLength + update_approximate_memblt_order(&orderInfo, memblt)); s = update->us; + if (!s) + return FALSE; offset = Stream_GetPosition(s); - Stream_EnsureRemainingCapacity(s, headerLength); + if (!Stream_EnsureRemainingCapacity(s, headerLength)) + return FALSE; Stream_Seek(s, headerLength); update_write_memblt_order(s, &orderInfo, memblt); update_write_order_info(context, s, &orderInfo, offset); update->numberOrders++; + return TRUE; } -static void update_send_glyph_index(rdpContext* context, GLYPH_INDEX_ORDER* glyph_index) +static BOOL update_send_glyph_index(rdpContext* context, GLYPH_INDEX_ORDER* glyph_index) { wStream* s; int offset; @@ -1164,22 +1267,26 @@ static void update_send_glyph_index(rdpContext* context, GLYPH_INDEX_ORDER* glyp update_check_flush(context, headerLength + update_approximate_glyph_index_order(&orderInfo, glyph_index)); s = update->us; + if (!s) + return FALSE; offset = Stream_GetPosition(s); - Stream_EnsureRemainingCapacity(s, headerLength); + if (!Stream_EnsureRemainingCapacity(s, headerLength)) + return FALSE; Stream_Seek(s, headerLength); update_write_glyph_index_order(s, &orderInfo, glyph_index); update_write_order_info(context, s, &orderInfo, offset); update->numberOrders++; + return TRUE; } /* * Secondary Drawing Orders */ -static void update_send_cache_bitmap(rdpContext* context, CACHE_BITMAP_ORDER* cache_bitmap) +static BOOL update_send_cache_bitmap(rdpContext* context, CACHE_BITMAP_ORDER* cache_bitmap) { wStream* s; int bm, em; @@ -1198,12 +1305,19 @@ static void update_send_cache_bitmap(rdpContext* context, CACHE_BITMAP_ORDER* ca update_check_flush(context, headerLength + update_approximate_cache_bitmap_order(cache_bitmap, cache_bitmap->compressed, &extraFlags)); s = update->us; + if (!s) + return FALSE; + bm = Stream_GetPosition(s); - Stream_EnsureRemainingCapacity(s, headerLength); + if (!Stream_EnsureRemainingCapacity(s, headerLength)) + return FALSE; + Stream_Seek(s, headerLength); - update_write_cache_bitmap_order(s, cache_bitmap, cache_bitmap->compressed, &extraFlags); + if (!update_write_cache_bitmap_order(s, cache_bitmap, cache_bitmap->compressed, &extraFlags)) + return FALSE; + em = Stream_GetPosition(s); orderLength = (em - bm) - 13; @@ -1216,9 +1330,10 @@ static void update_send_cache_bitmap(rdpContext* context, CACHE_BITMAP_ORDER* ca Stream_SetPosition(s, em); update->numberOrders++; + return TRUE; } -static void update_send_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2) +static BOOL update_send_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2) { wStream* s; int bm, em; @@ -1240,12 +1355,19 @@ static void update_send_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORD update_check_flush(context, headerLength + update_approximate_cache_bitmap_v2_order(cache_bitmap_v2, cache_bitmap_v2->compressed, &extraFlags)); s = update->us; + if (!s) + return FALSE; + bm = Stream_GetPosition(s); - Stream_EnsureRemainingCapacity(s, headerLength); + if (!Stream_EnsureRemainingCapacity(s, headerLength)) + return FALSE; + Stream_Seek(s, headerLength); - update_write_cache_bitmap_v2_order(s, cache_bitmap_v2, cache_bitmap_v2->compressed, &extraFlags); + if (!update_write_cache_bitmap_v2_order(s, cache_bitmap_v2, cache_bitmap_v2->compressed, &extraFlags)) + return FALSE; + em = Stream_GetPosition(s); orderLength = (em - bm) - 13; @@ -1258,9 +1380,10 @@ static void update_send_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORD Stream_SetPosition(s, em); update->numberOrders++; + return TRUE; } -static void update_send_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3) +static BOOL update_send_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3) { wStream* s; int bm, em; @@ -1277,12 +1400,19 @@ static void update_send_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORD update_check_flush(context, headerLength + update_approximate_cache_bitmap_v3_order(cache_bitmap_v3, &extraFlags)); s = update->us; + if (!s) + return FALSE; + bm = Stream_GetPosition(s); - Stream_EnsureRemainingCapacity(s, headerLength); + if (!Stream_EnsureRemainingCapacity(s, headerLength)) + return FALSE; + Stream_Seek(s, headerLength); - update_write_cache_bitmap_v3_order(s, cache_bitmap_v3, &extraFlags); + if (!update_write_cache_bitmap_v3_order(s, cache_bitmap_v3, &extraFlags)) + return FALSE; + em = Stream_GetPosition(s); orderLength = (em - bm) - 13; @@ -1295,9 +1425,10 @@ static void update_send_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORD Stream_SetPosition(s, em); update->numberOrders++; + return TRUE; } -static void update_send_cache_color_table(rdpContext* context, CACHE_COLOR_TABLE_ORDER* cache_color_table) +static BOOL update_send_cache_color_table(rdpContext* context, CACHE_COLOR_TABLE_ORDER* cache_color_table) { wStream* s; UINT16 flags; @@ -1312,12 +1443,19 @@ static void update_send_cache_color_table(rdpContext* context, CACHE_COLOR_TABLE update_check_flush(context, headerLength + update_approximate_cache_color_table_order(cache_color_table, &flags)); s = update->us; + if (!s) + return FALSE; + bm = Stream_GetPosition(s); - Stream_EnsureRemainingCapacity(s, headerLength); + if (!Stream_EnsureRemainingCapacity(s, headerLength)) + return FALSE; + Stream_Seek(s, headerLength); - update_write_cache_color_table_order(s, cache_color_table, &flags); + if (!update_write_cache_color_table_order(s, cache_color_table, &flags)) + return FALSE; + em = Stream_GetPosition(s); orderLength = (em - bm) - 13; @@ -1330,9 +1468,10 @@ static void update_send_cache_color_table(rdpContext* context, CACHE_COLOR_TABLE Stream_SetPosition(s, em); update->numberOrders++; + return TRUE; } -static void update_send_cache_glyph(rdpContext* context, CACHE_GLYPH_ORDER* cache_glyph) +static BOOL update_send_cache_glyph(rdpContext* context, CACHE_GLYPH_ORDER* cache_glyph) { wStream* s; UINT16 flags; @@ -1347,12 +1486,18 @@ static void update_send_cache_glyph(rdpContext* context, CACHE_GLYPH_ORDER* cach update_check_flush(context, headerLength + update_approximate_cache_glyph_order(cache_glyph, &flags)); s = update->us; + if (!s) + return FALSE; + bm = Stream_GetPosition(s); - Stream_EnsureRemainingCapacity(s, headerLength); + if (!Stream_EnsureRemainingCapacity(s, headerLength)) + return FALSE; Stream_Seek(s, headerLength); - update_write_cache_glyph_order(s, cache_glyph, &flags); + if (!update_write_cache_glyph_order(s, cache_glyph, &flags)) + return FALSE; + em = Stream_GetPosition(s); orderLength = (em - bm) - 13; @@ -1365,9 +1510,10 @@ static void update_send_cache_glyph(rdpContext* context, CACHE_GLYPH_ORDER* cach Stream_SetPosition(s, em); update->numberOrders++; + return TRUE; } -static void update_send_cache_glyph_v2(rdpContext* context, CACHE_GLYPH_V2_ORDER* cache_glyph_v2) +static BOOL update_send_cache_glyph_v2(rdpContext* context, CACHE_GLYPH_V2_ORDER* cache_glyph_v2) { wStream* s; UINT16 flags; @@ -1382,12 +1528,18 @@ static void update_send_cache_glyph_v2(rdpContext* context, CACHE_GLYPH_V2_ORDER update_check_flush(context, headerLength + update_approximate_cache_glyph_v2_order(cache_glyph_v2, &flags)); s = update->us; + if (!s) + return FALSE; + bm = Stream_GetPosition(s); - Stream_EnsureRemainingCapacity(s, headerLength); + if (!Stream_EnsureRemainingCapacity(s, headerLength)) + return FALSE; Stream_Seek(s, headerLength); - update_write_cache_glyph_v2_order(s, cache_glyph_v2, &flags); + if (!update_write_cache_glyph_v2_order(s, cache_glyph_v2, &flags)) + return FALSE; + em = Stream_GetPosition(s); orderLength = (em - bm) - 13; @@ -1400,9 +1552,10 @@ static void update_send_cache_glyph_v2(rdpContext* context, CACHE_GLYPH_V2_ORDER Stream_SetPosition(s, em); update->numberOrders++; + return TRUE; } -static void update_send_cache_brush(rdpContext* context, CACHE_BRUSH_ORDER* cache_brush) +static BOOL update_send_cache_brush(rdpContext* context, CACHE_BRUSH_ORDER* cache_brush) { wStream* s; UINT16 flags; @@ -1417,12 +1570,17 @@ static void update_send_cache_brush(rdpContext* context, CACHE_BRUSH_ORDER* cach update_check_flush(context, headerLength + update_approximate_cache_brush_order(cache_brush, &flags)); s = update->us; + if (!s) + return FALSE; bm = Stream_GetPosition(s); - Stream_EnsureRemainingCapacity(s, headerLength); + if (!Stream_EnsureRemainingCapacity(s, headerLength)) + return FALSE; Stream_Seek(s, headerLength); - update_write_cache_brush_order(s, cache_brush, &flags); + if (!update_write_cache_brush_order(s, cache_brush, &flags)) + return FALSE; + em = Stream_GetPosition(s); orderLength = (em - bm) - 13; @@ -1435,13 +1593,14 @@ static void update_send_cache_brush(rdpContext* context, CACHE_BRUSH_ORDER* cach Stream_SetPosition(s, em); update->numberOrders++; + return TRUE; } /** * Alternate Secondary Drawing Orders */ -static void update_send_create_offscreen_bitmap_order(rdpContext* context, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap) +static BOOL update_send_create_offscreen_bitmap_order(rdpContext* context, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap) { wStream* s; int bm, em; @@ -1457,12 +1616,16 @@ static void update_send_create_offscreen_bitmap_order(rdpContext* context, CREAT update_check_flush(context, headerLength + update_approximate_create_offscreen_bitmap_order(create_offscreen_bitmap)); s = update->us; + if (!s) + return FALSE; bm = Stream_GetPosition(s); - Stream_EnsureRemainingCapacity(s, headerLength); + if (!Stream_EnsureRemainingCapacity(s, headerLength)) + return FALSE; Stream_Seek(s, headerLength); - update_write_create_offscreen_bitmap_order(s, create_offscreen_bitmap); + if (!update_write_create_offscreen_bitmap_order(s, create_offscreen_bitmap)) + return FALSE; em = Stream_GetPosition(s); Stream_SetPosition(s, bm); @@ -1470,9 +1633,10 @@ static void update_send_create_offscreen_bitmap_order(rdpContext* context, CREAT Stream_SetPosition(s, em); update->numberOrders++; + return TRUE; } -static void update_send_switch_surface_order(rdpContext* context, SWITCH_SURFACE_ORDER* switch_surface) +static BOOL update_send_switch_surface_order(rdpContext* context, SWITCH_SURFACE_ORDER* switch_surface) { wStream* s; int bm, em; @@ -1488,12 +1652,16 @@ static void update_send_switch_surface_order(rdpContext* context, SWITCH_SURFACE update_check_flush(context, headerLength + update_approximate_switch_surface_order(switch_surface)); s = update->us; + if (!s) + return FALSE; bm = Stream_GetPosition(s); - Stream_EnsureRemainingCapacity(s, headerLength); + if (!Stream_EnsureRemainingCapacity(s, headerLength)) + return FALSE; Stream_Seek(s, headerLength); - update_write_switch_surface_order(s, switch_surface); + if (!update_write_switch_surface_order(s, switch_surface)) + return FALSE; em = Stream_GetPosition(s); Stream_SetPosition(s, bm); @@ -1501,44 +1669,56 @@ static void update_send_switch_surface_order(rdpContext* context, SWITCH_SURFACE Stream_SetPosition(s, em); update->numberOrders++; + return TRUE; } -static void update_send_pointer_system(rdpContext* context, POINTER_SYSTEM_UPDATE* pointer_system) +static BOOL update_send_pointer_system(rdpContext* context, POINTER_SYSTEM_UPDATE* pointer_system) { wStream* s; BYTE updateCode; rdpRdp* rdp = context->rdp; + BOOL ret; s = fastpath_update_pdu_init(rdp->fastpath); + if (!s) + return FALSE; if (pointer_system->type == SYSPTR_NULL) updateCode = FASTPATH_UPDATETYPE_PTR_NULL; else updateCode = FASTPATH_UPDATETYPE_PTR_DEFAULT; - fastpath_send_update_pdu(rdp->fastpath, updateCode, s, FALSE); + ret = fastpath_send_update_pdu(rdp->fastpath, updateCode, s, FALSE); Stream_Release(s); + return ret; } -static void update_send_pointer_position(rdpContext* context, POINTER_POSITION_UPDATE* pointerPosition) +static BOOL update_send_pointer_position(rdpContext* context, POINTER_POSITION_UPDATE* pointerPosition) { wStream* s; rdpRdp* rdp = context->rdp; + BOOL ret = FALSE; s = fastpath_update_pdu_init(rdp->fastpath); + if (!s) + return FALSE; - Stream_EnsureRemainingCapacity(s, 16); + if (!Stream_EnsureRemainingCapacity(s, 16)) + goto out_fail; Stream_Write_UINT16(s, pointerPosition->xPos); /* xPos (2 bytes) */ Stream_Write_UINT16(s, pointerPosition->yPos); /* yPos (2 bytes) */ - fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_PTR_POSITION, s, FALSE); + ret = fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_PTR_POSITION, s, FALSE); +out_fail: Stream_Release(s); + return ret; } -static void update_write_pointer_color(wStream* s, POINTER_COLOR_UPDATE* pointer_color) +static BOOL update_write_pointer_color(wStream* s, POINTER_COLOR_UPDATE* pointer_color) { - Stream_EnsureRemainingCapacity(s, 32 + (int) pointer_color->lengthAndMask + (int) pointer_color->lengthXorMask); + if (!Stream_EnsureRemainingCapacity(s, 32 + (int) pointer_color->lengthAndMask + (int) pointer_color->lengthXorMask)) + return FALSE; Stream_Write_UINT16(s, pointer_color->cacheIndex); Stream_Write_UINT16(s, pointer_color->xPos); @@ -1555,45 +1735,65 @@ static void update_write_pointer_color(wStream* s, POINTER_COLOR_UPDATE* pointer Stream_Write(s, pointer_color->andMaskData, pointer_color->lengthAndMask); Stream_Write_UINT8(s, 0); /* pad (1 byte) */ + return TRUE; } -static void update_send_pointer_color(rdpContext* context, POINTER_COLOR_UPDATE* pointer_color) +static BOOL update_send_pointer_color(rdpContext* context, POINTER_COLOR_UPDATE* pointer_color) { wStream* s; rdpRdp* rdp = context->rdp; + BOOL ret = FALSE; s = fastpath_update_pdu_init(rdp->fastpath); - update_write_pointer_color(s, pointer_color); - fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_COLOR, s, FALSE); + if (!s) + return FALSE; + + if (!update_write_pointer_color(s, pointer_color)) + goto out_fail; + + ret = fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_COLOR, s, FALSE); + +out_fail: Stream_Release(s); + return ret; } -static void update_send_pointer_new(rdpContext* context, POINTER_NEW_UPDATE* pointer_new) +static BOOL update_send_pointer_new(rdpContext* context, POINTER_NEW_UPDATE* pointer_new) { wStream* s; rdpRdp* rdp = context->rdp; + BOOL ret = FALSE; s = fastpath_update_pdu_init(rdp->fastpath); + if (!s) + return FALSE; - Stream_EnsureRemainingCapacity(s, 16); + if (!Stream_EnsureRemainingCapacity(s, 16)) + goto out_fail; Stream_Write_UINT16(s, pointer_new->xorBpp); /* xorBpp (2 bytes) */ update_write_pointer_color(s, &pointer_new->colorPtrAttr); - fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_POINTER, s, FALSE); + ret = fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_POINTER, s, FALSE); +out_fail: Stream_Release(s); + return ret; } -static void update_send_pointer_cached(rdpContext* context, POINTER_CACHED_UPDATE* pointer_cached) +static BOOL update_send_pointer_cached(rdpContext* context, POINTER_CACHED_UPDATE* pointer_cached) { wStream* s; rdpRdp* rdp = context->rdp; + BOOL ret; s = fastpath_update_pdu_init(rdp->fastpath); + if (!s) + return FALSE; Stream_Write_UINT16(s, pointer_cached->cacheIndex); /* cacheIndex (2 bytes) */ - fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_CACHED, s, FALSE); + ret = fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_CACHED, s, FALSE); Stream_Release(s); + return ret; } BOOL update_read_refresh_rect(rdpUpdate* update, wStream* s) @@ -1653,16 +1853,20 @@ BOOL update_read_suppress_output(rdpUpdate* update, wStream* s) return TRUE; } -static void update_send_set_keyboard_indicators(rdpContext* context, UINT16 led_flags) +static BOOL update_send_set_keyboard_indicators(rdpContext* context, UINT16 led_flags) { wStream* s; rdpRdp* rdp = context->rdp; + BOOL ret; s = rdp_data_pdu_init(rdp); + if (!s) + return FALSE; Stream_Write_UINT16(s, 0); /* unitId should be 0 according to MS-RDPBCGR 2.2.8.2.1.1 */ Stream_Write_UINT16(s, led_flags); /* ledFlags (2 bytes) */ - rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_SET_KEYBOARD_INDICATORS, rdp->mcs->userId); + ret = rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_SET_KEYBOARD_INDICATORS, rdp->mcs->userId); Stream_Release(s); + return ret; } void update_register_server_callbacks(rdpUpdate* update) diff --git a/libfreerdp/gdi/bitmap.c b/libfreerdp/gdi/bitmap.c index d32f11ee6..d01a4b983 100644 --- a/libfreerdp/gdi/bitmap.c +++ b/libfreerdp/gdi/bitmap.c @@ -173,6 +173,11 @@ HGDI_BITMAP gdi_CreateCompatibleBitmap(HGDI_DC hdc, int nWidth, int nHeight) hBitmap->width = nWidth; hBitmap->height = nHeight; hBitmap->data = _aligned_malloc(nWidth * nHeight * hBitmap->bytesPerPixel, 16); + if (!hBitmap->data) + { + free(hBitmap); + return NULL; + } hBitmap->scanline = nWidth * hBitmap->bytesPerPixel; return hBitmap; diff --git a/libfreerdp/gdi/brush.c b/libfreerdp/gdi/brush.c index 5184112aa..2e62138d6 100644 --- a/libfreerdp/gdi/brush.c +++ b/libfreerdp/gdi/brush.c @@ -24,7 +24,6 @@ #endif #include -#include #include #include @@ -55,6 +54,8 @@ p_PatBlt PatBlt_[5] = HGDI_BRUSH gdi_CreateSolidBrush(GDI_COLOR crColor) { HGDI_BRUSH hBrush = (HGDI_BRUSH) malloc(sizeof(GDI_BRUSH)); + if (!hBrush) + return NULL; hBrush->objectType = GDIOBJECT_BRUSH; hBrush->style = GDI_BS_SOLID; hBrush->color = crColor; @@ -71,6 +72,8 @@ HGDI_BRUSH gdi_CreateSolidBrush(GDI_COLOR crColor) HGDI_BRUSH gdi_CreatePatternBrush(HGDI_BITMAP hbmp) { HGDI_BRUSH hBrush = (HGDI_BRUSH) malloc(sizeof(GDI_BRUSH)); + if (!hBrush) + return NULL; hBrush->objectType = GDIOBJECT_BRUSH; hBrush->style = GDI_BS_PATTERN; hBrush->pattern = hbmp; @@ -80,6 +83,8 @@ HGDI_BRUSH gdi_CreatePatternBrush(HGDI_BITMAP hbmp) HGDI_BRUSH gdi_CreateHatchBrush(HGDI_BITMAP hbmp) { HGDI_BRUSH hBrush = (HGDI_BRUSH) malloc(sizeof(GDI_BRUSH)); + if (!hBrush) + return NULL; hBrush->objectType = GDIOBJECT_BRUSH; hBrush->style = GDI_BS_HATCHED; hBrush->pattern = hbmp; diff --git a/libfreerdp/gdi/dc.c b/libfreerdp/gdi/dc.c index 7a449b35c..207211dfe 100644 --- a/libfreerdp/gdi/dc.c +++ b/libfreerdp/gdi/dc.c @@ -42,10 +42,17 @@ HGDI_DC gdi_GetDC() { HGDI_DC hDC = (HGDI_DC) malloc(sizeof(GDI_DC)); + if (!hDC) + return NULL; hDC->bytesPerPixel = 4; hDC->bitsPerPixel = 32; hDC->drawMode = GDI_R2_BLACK; hDC->clip = gdi_CreateRectRgn(0, 0, 0, 0); + if (!hDC->clip) + { + free(hDC); + return NULL; + } hDC->clip->null = 1; hDC->hwnd = NULL; return hDC; @@ -94,11 +101,18 @@ HGDI_DC gdi_CreateDC(UINT32 flags, int bpp) HGDI_DC gdi_CreateCompatibleDC(HGDI_DC hdc) { HGDI_DC hDC = (HGDI_DC) malloc(sizeof(GDI_DC)); + if (!hDC) + return NULL; + + if (!(hDC->clip = gdi_CreateRectRgn(0, 0, 0, 0))) + { + free(hDC); + return NULL; + } + hDC->clip->null = 1; hDC->bytesPerPixel = hdc->bytesPerPixel; hDC->bitsPerPixel = hdc->bitsPerPixel; hDC->drawMode = hdc->drawMode; - hDC->clip = gdi_CreateRectRgn(0, 0, 0, 0); - hDC->clip->null = 1; hDC->hwnd = NULL; hDC->alpha = hdc->alpha; hDC->invert = hdc->invert; @@ -146,7 +160,7 @@ HGDIOBJECT gdi_SelectObject(HGDI_DC hdc, HGDIOBJECT hgdiobject) else { /* Unknown GDI Object Type */ - return 0; + return NULL; } return previousSelectedObject; @@ -182,7 +196,7 @@ int gdi_DeleteObject(HGDIOBJECT hgdiobject) { HGDI_BRUSH hBrush = (HGDI_BRUSH) hgdiobject; - if(hBrush->style == GDI_BS_PATTERN) + if (hBrush->style == GDI_BS_PATTERN || hBrush->style == GDI_BS_HATCHED) { if (hBrush->pattern != NULL) gdi_DeleteObject((HGDIOBJECT) hBrush->pattern); diff --git a/libfreerdp/gdi/gdi.c b/libfreerdp/gdi/gdi.c index a8cdcab66..267ef3590 100644 --- a/libfreerdp/gdi/gdi.c +++ b/libfreerdp/gdi/gdi.c @@ -430,7 +430,7 @@ void gdi_bitmap_free_ex(gdiBitmap* bitmap) } } -static void gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) +static BOOL gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) { int status; int nXDst; @@ -477,7 +477,7 @@ static void gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) gdi->bitmap_buffer = (BYTE*) _aligned_realloc(gdi->bitmap_buffer, gdi->bitmap_size, 16); if (!gdi->bitmap_buffer) - return; + return FALSE; } if (compressed) @@ -502,7 +502,7 @@ static void gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) if (status < 0) { WLog_ERR(TAG, "bitmap decompression failure"); - return; + return FALSE; } pSrcData = gdi->bitmap_buffer; @@ -531,9 +531,10 @@ static void gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate) gdi_InvalidateRegion(gdi->primary->hdc, nXDst, nYDst, nWidth, nHeight); } + return TRUE; } -static void gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette) +static BOOL gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette) { int index; PALETTE_ENTRY* pe; @@ -547,9 +548,10 @@ static void gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette) pe = &(palette->entries[index]); palette32[index] = RGB32(pe->red, pe->green, pe->blue); } + return TRUE; } -static void gdi_set_bounds(rdpContext* context, rdpBounds* bounds) +static BOOL gdi_set_bounds(rdpContext* context, rdpBounds* bounds) { rdpGdi* gdi = context->gdi; @@ -562,17 +564,20 @@ static void gdi_set_bounds(rdpContext* context, rdpBounds* bounds) { gdi_SetNullClipRgn(gdi->drawing->hdc); } + return TRUE; } -static void gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) +static BOOL gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) { rdpGdi* gdi = context->gdi; - gdi_BitBlt(gdi->drawing->hdc, dstblt->nLeftRect, dstblt->nTopRect, - dstblt->nWidth, dstblt->nHeight, NULL, 0, 0, gdi_rop3_code(dstblt->bRop)); + if (gdi_BitBlt(gdi->drawing->hdc, dstblt->nLeftRect, dstblt->nTopRect, + dstblt->nWidth, dstblt->nHeight, NULL, 0, 0, gdi_rop3_code(dstblt->bRop)) != 1) + return FALSE; + return TRUE; } -static void gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) +static BOOL gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) { BYTE* data; rdpBrush* brush; @@ -581,6 +586,7 @@ static void gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) GDI_COLOR originalColor; HGDI_BRUSH originalBrush; rdpGdi* gdi = context->gdi; + BOOL ret = TRUE; brush = &patblt->brush; @@ -594,9 +600,15 @@ static void gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) originalBrush = gdi->drawing->hdc->brush; gdi->drawing->hdc->brush = gdi_CreateSolidBrush(foreColor); + if (!gdi->drawing->hdc->brush) + { + ret = FALSE; + goto out_error; + } - gdi_PatBlt(gdi->drawing->hdc, patblt->nLeftRect, patblt->nTopRect, - patblt->nWidth, patblt->nHeight, gdi_rop3_code(patblt->bRop)); + if (gdi_PatBlt(gdi->drawing->hdc, patblt->nLeftRect, patblt->nTopRect, + patblt->nWidth, patblt->nHeight, gdi_rop3_code(patblt->bRop)) != 1) + ret = FALSE; gdi_DeleteObject((HGDIOBJECT) gdi->drawing->hdc->brush); gdi->drawing->hdc->brush = originalBrush; @@ -607,6 +619,11 @@ static void gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) HGDI_BITMAP hBmp; data = (BYTE*) _aligned_malloc(8 * 8 * gdi->bytesPerPixel, 16); + if (!data) + { + ret = FALSE; + goto out_error; + } hatched = GDI_BS_HATCHED_PATTERNS + (8 * brush->hatch); @@ -614,12 +631,25 @@ static void gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) hatched, backColor, foreColor, gdi->palette); hBmp = gdi_CreateBitmap(8, 8, gdi->drawing->hdc->bitsPerPixel, data); + if (!hBmp) + { + _aligned_free(data); + ret = FALSE; + goto out_error; + } originalBrush = gdi->drawing->hdc->brush; gdi->drawing->hdc->brush = gdi_CreateHatchBrush(hBmp); + if (!gdi->drawing->hdc->brush) + { + _aligned_free(data); + ret = FALSE; + goto out_error; + } - gdi_PatBlt(gdi->drawing->hdc, patblt->nLeftRect, patblt->nTopRect, - patblt->nWidth, patblt->nHeight, gdi_rop3_code(patblt->bRop)); + if (gdi_PatBlt(gdi->drawing->hdc, patblt->nLeftRect, patblt->nTopRect, + patblt->nWidth, patblt->nHeight, gdi_rop3_code(patblt->bRop)) != 1) + ret = FALSE; gdi_DeleteObject((HGDIOBJECT) gdi->drawing->hdc->brush); gdi->drawing->hdc->brush = originalBrush; @@ -634,6 +664,11 @@ static void gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) brushFormat = gdi_get_pixel_format(brush->bpp, FALSE); data = (BYTE*) _aligned_malloc(8 * 8 * gdi->bytesPerPixel, 16); + if (!data) + { + ret = FALSE; + goto out_error; + } freerdp_image_copy(data, gdi->format, -1, 0, 0, 8, 8, brush->data, brushFormat, -1, 0, 0, gdi->palette); @@ -641,18 +676,36 @@ static void gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) else { data = (BYTE*) _aligned_malloc(8 * 8 * gdi->bytesPerPixel, 16); + if (!data) + { + ret = FALSE; + goto out_error; + } freerdp_image_copy_from_monochrome(data, gdi->format, -1, 0, 0, 8, 8, brush->data, backColor, foreColor, gdi->palette); } hBmp = gdi_CreateBitmap(8, 8, gdi->drawing->hdc->bitsPerPixel, data); + if (!hBmp) + { + _aligned_free(data); + ret = FALSE; + goto out_error; + } originalBrush = gdi->drawing->hdc->brush; gdi->drawing->hdc->brush = gdi_CreatePatternBrush(hBmp); + if (!gdi->drawing->hdc->brush) + { + _aligned_free(data); + ret = FALSE; + goto out_error; + } - gdi_PatBlt(gdi->drawing->hdc, patblt->nLeftRect, patblt->nTopRect, - patblt->nWidth, patblt->nHeight, gdi_rop3_code(patblt->bRop)); + if (gdi_PatBlt(gdi->drawing->hdc, patblt->nLeftRect, patblt->nTopRect, + patblt->nWidth, patblt->nHeight, gdi_rop3_code(patblt->bRop)) != 1) + ret = FALSE; gdi_DeleteObject((HGDIOBJECT) gdi->drawing->hdc->brush); gdi->drawing->hdc->brush = originalBrush; @@ -662,24 +715,29 @@ static void gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) WLog_ERR(TAG, "unimplemented brush style:%d", brush->style); } +out_error: gdi_SetTextColor(gdi->drawing->hdc, originalColor); + return ret; } -static void gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) +static BOOL gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) { rdpGdi* gdi = context->gdi; - gdi_BitBlt(gdi->drawing->hdc, scrblt->nLeftRect, scrblt->nTopRect, + if (gdi_BitBlt(gdi->drawing->hdc, scrblt->nLeftRect, scrblt->nTopRect, scrblt->nWidth, scrblt->nHeight, gdi->primary->hdc, - scrblt->nXSrc, scrblt->nYSrc, gdi_rop3_code(scrblt->bRop)); + scrblt->nXSrc, scrblt->nYSrc, gdi_rop3_code(scrblt->bRop)) != 1) + return FALSE; + return TRUE; } -static void gdi_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect) +static BOOL gdi_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect) { GDI_RECT rect; HGDI_BRUSH hBrush; UINT32 brush_color; rdpGdi* gdi = context->gdi; + BOOL ret = FALSE; gdi_CRgnToRect(opaque_rect->nLeftRect, opaque_rect->nTopRect, opaque_rect->nWidth, opaque_rect->nHeight, &rect); @@ -687,12 +745,16 @@ static void gdi_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect) brush_color = freerdp_convert_gdi_order_color(opaque_rect->color, gdi->srcBpp, gdi->format, gdi->palette); hBrush = gdi_CreateSolidBrush(brush_color); - gdi_FillRect(gdi->drawing->hdc, &rect, hBrush); - - gdi_DeleteObject((HGDIOBJECT) hBrush); + if (hBrush) + { + if (gdi_FillRect(gdi->drawing->hdc, &rect, hBrush) == 0) + ret = TRUE; + gdi_DeleteObject((HGDIOBJECT) hBrush); + } + return ret; } -static void gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect) +static BOOL gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect) { int i; GDI_RECT rect; @@ -700,6 +762,7 @@ static void gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* UINT32 brush_color; DELTA_RECT* rectangle; rdpGdi* gdi = context->gdi; + BOOL ret = TRUE; for (i = 1; i < (int) multi_opaque_rect->numRectangles + 1; i++) { @@ -711,13 +774,19 @@ static void gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* brush_color = freerdp_convert_gdi_order_color(multi_opaque_rect->color, gdi->srcBpp, gdi->format, gdi->palette); hBrush = gdi_CreateSolidBrush(brush_color); + if (!hBrush) + { + ret = FALSE; + break; + } gdi_FillRect(gdi->drawing->hdc, &rect, hBrush); gdi_DeleteObject((HGDIOBJECT) hBrush); } + return ret; } -static void gdi_line_to(rdpContext* context, LINE_TO_ORDER* lineTo) +static BOOL gdi_line_to(rdpContext* context, LINE_TO_ORDER* lineTo) { UINT32 color; HGDI_PEN hPen; @@ -725,16 +794,23 @@ static void gdi_line_to(rdpContext* context, LINE_TO_ORDER* lineTo) color = freerdp_convert_gdi_order_color(lineTo->penColor, gdi->srcBpp, gdi->format, gdi->palette); hPen = gdi_CreatePen(lineTo->penStyle, lineTo->penWidth, (GDI_COLOR) color); - gdi_SelectObject(gdi->drawing->hdc, (HGDIOBJECT) hPen); + if (!hPen) + return FALSE; + if (!gdi_SelectObject(gdi->drawing->hdc, (HGDIOBJECT) hPen)) + { + gdi_DeleteObject((HGDIOBJECT) hPen); + return FALSE; + } gdi_SetROP2(gdi->drawing->hdc, lineTo->bRop2); gdi_MoveToEx(gdi->drawing->hdc, lineTo->nXStart, lineTo->nYStart, NULL); gdi_LineTo(gdi->drawing->hdc, lineTo->nXEnd, lineTo->nYEnd); gdi_DeleteObject((HGDIOBJECT) hPen); + return TRUE; } -static void gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) +static BOOL gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) { int i; INT32 x; @@ -746,6 +822,8 @@ static void gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) color = freerdp_convert_gdi_order_color(polyline->penColor, gdi->srcBpp, gdi->format, gdi->palette); hPen = gdi_CreatePen(GDI_PS_SOLID, 1, (GDI_COLOR) color); + if (!hPen) + return FALSE; gdi_SelectObject(gdi->drawing->hdc, (HGDIOBJECT) hPen); gdi_SetROP2(gdi->drawing->hdc, polyline->bRop2); @@ -763,9 +841,10 @@ static void gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) } gdi_DeleteObject((HGDIOBJECT) hPen); + return TRUE; } -static void gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) +static BOOL gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) { gdiBitmap* bitmap; rdpGdi* gdi = context->gdi; @@ -775,9 +854,10 @@ static void gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) gdi_BitBlt(gdi->drawing->hdc, memblt->nLeftRect, memblt->nTopRect, memblt->nWidth, memblt->nHeight, bitmap->hdc, memblt->nXSrc, memblt->nYSrc, gdi_rop3_code(memblt->bRop)); + return TRUE; } -static void gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) +static BOOL gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) { BYTE* data; rdpBrush* brush; @@ -787,6 +867,7 @@ static void gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) GDI_COLOR originalColor; HGDI_BRUSH originalBrush; rdpGdi* gdi = context->gdi; + BOOL ret = TRUE; brush = &mem3blt->brush; bitmap = (gdiBitmap*) mem3blt->bitmap; @@ -800,6 +881,11 @@ static void gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) { originalBrush = gdi->drawing->hdc->brush; gdi->drawing->hdc->brush = gdi_CreateSolidBrush(foreColor); + if (!gdi->drawing->hdc->brush) + { + ret = FALSE; + goto out_fail; + } gdi_BitBlt(gdi->drawing->hdc, mem3blt->nLeftRect, mem3blt->nTopRect, mem3blt->nWidth, mem3blt->nHeight, bitmap->hdc, @@ -818,6 +904,11 @@ static void gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) brushFormat = gdi_get_pixel_format(brush->bpp, FALSE); data = (BYTE*) _aligned_malloc(8 * 8 * gdi->bytesPerPixel, 16); + if (!data) + { + ret = FALSE; + goto out_fail; + } freerdp_image_copy(data, gdi->format, -1, 0, 0, 8, 8, brush->data, brushFormat, -1, 0, 0, gdi->palette); @@ -825,15 +916,31 @@ static void gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) else { data = (BYTE*) _aligned_malloc(8 * 8 * gdi->bytesPerPixel, 16); + if (!data) + { + ret = FALSE; + goto out_fail; + } freerdp_image_copy_from_monochrome(data, gdi->format, -1, 0, 0, 8, 8, brush->data, backColor, foreColor, gdi->palette); } hBmp = gdi_CreateBitmap(8, 8, gdi->drawing->hdc->bitsPerPixel, data); + if (!hBmp) + { + _aligned_free(data); + ret = FALSE; + goto out_fail; + } originalBrush = gdi->drawing->hdc->brush; gdi->drawing->hdc->brush = gdi_CreatePatternBrush(hBmp); + if (!gdi->drawing->hdc->brush) + { + gdi_DeleteObject((HGDIOBJECT) hBmp); + goto out_fail; + } gdi_BitBlt(gdi->drawing->hdc, mem3blt->nLeftRect, mem3blt->nTopRect, mem3blt->nWidth, mem3blt->nHeight, bitmap->hdc, @@ -847,36 +954,41 @@ static void gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) WLog_ERR(TAG, "Mem3Blt unimplemented brush style:%d", brush->style); } +out_fail: gdi_SetTextColor(gdi->drawing->hdc, originalColor); + return ret; } -static void gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) +static BOOL gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) { WLog_VRB(TAG, "not implemented"); + return TRUE; } -static void gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) +static BOOL gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) { WLog_VRB(TAG, "not implemented"); + return TRUE; } -static void gdi_ellipse_sc(rdpContext* context, ELLIPSE_SC_ORDER* ellipse_sc) +static BOOL gdi_ellipse_sc(rdpContext* context, ELLIPSE_SC_ORDER* ellipse_sc) { WLog_VRB(TAG, "not implemented"); + return TRUE; } -static void gdi_ellipse_cb(rdpContext* context, ELLIPSE_CB_ORDER* ellipse_cb) +static BOOL gdi_ellipse_cb(rdpContext* context, ELLIPSE_CB_ORDER* ellipse_cb) { WLog_VRB(TAG, "not implemented"); + return TRUE; } -static void gdi_frame_marker(rdpContext* context, FRAME_MARKER_ORDER* frameMarker) +static BOOL gdi_frame_marker(rdpContext* context, FRAME_MARKER_ORDER* frameMarker) { - - + return TRUE; } -void gdi_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surfaceFrameMarker) +BOOL gdi_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surfaceFrameMarker) { DEBUG_GDI("frameId %d frameAction %d", surfaceFrameMarker->frameId, @@ -894,9 +1006,10 @@ void gdi_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surface } break; } + return TRUE; } -static void gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* cmd) +static BOOL gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* cmd) { int i, j; int tx, ty; @@ -963,7 +1076,7 @@ static void gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* cmd) gdi->bitmap_buffer = (BYTE*) _aligned_realloc(gdi->bitmap_buffer, gdi->bitmap_size, 16); if (!gdi->bitmap_buffer) - return; + return FALSE; } pDstData = gdi->bitmap_buffer; @@ -988,7 +1101,7 @@ static void gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* cmd) gdi->bitmap_buffer = (BYTE*) _aligned_realloc(gdi->bitmap_buffer, gdi->bitmap_size, 16); if (!gdi->bitmap_buffer) - return; + return FALSE; } pDstData = gdi->bitmap_buffer; @@ -1009,6 +1122,7 @@ static void gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* cmd) { WLog_ERR(TAG, "Unsupported codecID %d", cmd->codecID); } + return TRUE; } /** diff --git a/libfreerdp/gdi/graphics.c b/libfreerdp/gdi/graphics.c index 9a04a051c..3cc3e8025 100644 --- a/libfreerdp/gdi/graphics.c +++ b/libfreerdp/gdi/graphics.c @@ -29,15 +29,7 @@ #include #include #include -#include -#include -#include #include -#include -#include -#include -#include -#include #include "graphics.h" @@ -105,21 +97,35 @@ HGDI_BITMAP gdi_create_bitmap(rdpGdi* gdi, int nWidth, int nHeight, int bpp, BYT return bitmap; } -void gdi_Bitmap_New(rdpContext* context, rdpBitmap* bitmap) +BOOL gdi_Bitmap_New(rdpContext* context, rdpBitmap* bitmap) { gdiBitmap* gdi_bitmap; rdpGdi* gdi = context->gdi; gdi_bitmap = (gdiBitmap*) bitmap; gdi_bitmap->hdc = gdi_CreateCompatibleDC(gdi->hdc); + if (!gdi->hdc) + return FALSE; if (!bitmap->data) gdi_bitmap->bitmap = gdi_CreateCompatibleBitmap(gdi->hdc, bitmap->width, bitmap->height); else gdi_bitmap->bitmap = gdi_create_bitmap(gdi, bitmap->width, bitmap->height, bitmap->bpp, bitmap->data); - gdi_SelectObject(gdi_bitmap->hdc, (HGDIOBJECT) gdi_bitmap->bitmap); + if (!gdi_bitmap->bitmap) + { + gdi_DeleteDC(gdi->hdc); + return FALSE; + } + + if (!gdi_SelectObject(gdi_bitmap->hdc, (HGDIOBJECT) gdi_bitmap->bitmap)) + { + gdi_DeleteObject((HGDIOBJECT) gdi_bitmap->bitmap); + gdi_DeleteDC(gdi->hdc); + return FALSE; + } gdi_bitmap->org_bitmap = NULL; + return TRUE; } void gdi_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap) @@ -134,7 +140,7 @@ void gdi_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap) } } -void gdi_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap) +BOOL gdi_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap) { int width, height; gdiBitmap* gdi_bitmap = (gdiBitmap*) bitmap; @@ -142,11 +148,13 @@ void gdi_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap) width = bitmap->right - bitmap->left + 1; height = bitmap->bottom - bitmap->top + 1; - gdi_BitBlt(context->gdi->primary->hdc, bitmap->left, bitmap->top, - width, height, gdi_bitmap->hdc, 0, 0, GDI_SRCCOPY); + if (gdi_BitBlt(context->gdi->primary->hdc, bitmap->left, bitmap->top, + width, height, gdi_bitmap->hdc, 0, 0, GDI_SRCCOPY) != 0) + return FALSE; + return TRUE; } -void gdi_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, +BOOL gdi_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, BYTE* data, int width, int height, int bpp, int length, BOOL compressed, int codecId) { @@ -188,7 +196,7 @@ void gdi_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, if (status < 0) { WLog_ERR(TAG, "Bitmap Decompression Failed"); - return; + return FALSE; } } else @@ -202,9 +210,10 @@ void gdi_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, bitmap->compressed = FALSE; bitmap->length = size; bitmap->bpp = gdi->dstBpp; + return TRUE; } -void gdi_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary) +BOOL gdi_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary) { rdpGdi* gdi = context->gdi; @@ -212,11 +221,13 @@ void gdi_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary) gdi->drawing = gdi->primary; else gdi->drawing = (gdiBitmap*) bitmap; + + return TRUE; } /* Glyph Class */ -void gdi_Glyph_New(rdpContext* context, rdpGlyph* glyph) +BOOL gdi_Glyph_New(rdpContext* context, rdpGlyph* glyph) { BYTE* data; gdiGlyph* gdi_glyph; @@ -224,16 +235,35 @@ void gdi_Glyph_New(rdpContext* context, rdpGlyph* glyph) gdi_glyph = (gdiGlyph*) glyph; gdi_glyph->hdc = gdi_GetDC(); + if (!gdi_glyph->hdc) + return FALSE; gdi_glyph->hdc->bytesPerPixel = 1; gdi_glyph->hdc->bitsPerPixel = 1; data = freerdp_glyph_convert(glyph->cx, glyph->cy, glyph->aj); + if (!data) + { + gdi_DeleteDC(gdi_glyph->hdc); + return FALSE; + } gdi_glyph->bitmap = gdi_CreateBitmap(glyph->cx, glyph->cy, 1, data); + if (!gdi_glyph->bitmap) + { + gdi_DeleteDC(gdi_glyph->hdc); + _aligned_free(data); + return FALSE; + } gdi_glyph->bitmap->bytesPerPixel = 1; gdi_glyph->bitmap->bitsPerPixel = 1; - gdi_SelectObject(gdi_glyph->hdc, (HGDIOBJECT) gdi_glyph->bitmap); + if (!gdi_SelectObject(gdi_glyph->hdc, (HGDIOBJECT) gdi_glyph->bitmap)) + { + gdi_DeleteDC(gdi_glyph->hdc); + _aligned_free(data); + return FALSE; + } gdi_glyph->org_bitmap = NULL; + return TRUE; } void gdi_Glyph_Free(rdpContext* context, rdpGlyph* glyph) @@ -250,48 +280,62 @@ void gdi_Glyph_Free(rdpContext* context, rdpGlyph* glyph) } } -void gdi_Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y) +BOOL gdi_Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y) { gdiGlyph* gdi_glyph; rdpGdi* gdi = context->gdi; gdi_glyph = (gdiGlyph*) glyph; - gdi_BitBlt(gdi->drawing->hdc, x, y, gdi_glyph->bitmap->width, - gdi_glyph->bitmap->height, gdi_glyph->hdc, 0, 0, GDI_DSPDxax); + if (gdi_BitBlt(gdi->drawing->hdc, x, y, gdi_glyph->bitmap->width, + gdi_glyph->bitmap->height, gdi_glyph->hdc, 0, 0, GDI_DSPDxax) != 0) + return FALSE; + return TRUE; } -void gdi_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor, BOOL fOpRedundant) +BOOL gdi_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor, BOOL fOpRedundant) { GDI_RECT rect; HGDI_BRUSH brush; rdpGdi* gdi = context->gdi; + int ret = 1; /* TODO: handle fOpRedundant! See xf_Glyph_BeginDraw() */ bgcolor = freerdp_convert_gdi_order_color(bgcolor, gdi->srcBpp, gdi->format, gdi->palette); fgcolor = freerdp_convert_gdi_order_color(fgcolor, gdi->srcBpp, gdi->format, gdi->palette); - gdi_CRgnToRect(x, y, width, height, &rect); - brush = gdi_CreateSolidBrush(fgcolor); - gdi_FillRect(gdi->drawing->hdc, &rect, brush); + if (!brush) + { + goto out_fail; + return FALSE; + } + + gdi_CRgnToRect(x, y, width, height, &rect); + ret = gdi_FillRect(gdi->drawing->hdc, &rect, brush); gdi_DeleteObject((HGDIOBJECT) brush); +out_fail: gdi->textColor = gdi_SetTextColor(gdi->drawing->hdc, bgcolor); + + if (ret != 0) + return FALSE; + return TRUE; } -void gdi_Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor) +BOOL gdi_Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor) { rdpGdi* gdi = context->gdi; bgcolor = freerdp_convert_gdi_order_color(bgcolor, gdi->srcBpp, gdi->format, gdi->palette); gdi->textColor = gdi_SetTextColor(gdi->drawing->hdc, bgcolor); + return TRUE; } /* Graphics Module */ -void gdi_register_graphics(rdpGraphics* graphics) +BOOL gdi_register_graphics(rdpGraphics* graphics) { rdpBitmap* bitmap; rdpGlyph* glyph; @@ -299,7 +343,7 @@ void gdi_register_graphics(rdpGraphics* graphics) bitmap = (rdpBitmap*) calloc(1, sizeof(rdpBitmap)); if (!bitmap) - return; + return FALSE; bitmap->size = sizeof(gdiBitmap); @@ -315,7 +359,7 @@ void gdi_register_graphics(rdpGraphics* graphics) glyph = (rdpGlyph*) calloc(1, sizeof(rdpGlyph)); if (!glyph) - return; + return FALSE; glyph->size = sizeof(gdiGlyph); @@ -327,4 +371,5 @@ void gdi_register_graphics(rdpGraphics* graphics) graphics_register_glyph(graphics, glyph); free(glyph); + return TRUE; } diff --git a/libfreerdp/gdi/graphics.h b/libfreerdp/gdi/graphics.h index eaa79aca9..dc219914f 100644 --- a/libfreerdp/gdi/graphics.h +++ b/libfreerdp/gdi/graphics.h @@ -25,11 +25,11 @@ HGDI_BITMAP gdi_create_bitmap(rdpGdi* gdi, int width, int height, int bpp, BYTE* data); -void gdi_Bitmap_New(rdpContext* context, rdpBitmap* bitmap); +BOOL gdi_Bitmap_New(rdpContext* context, rdpBitmap* bitmap); void gdi_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap); -void gdi_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, +BOOL gdi_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, BYTE* data, int width, int height, int bpp, int length, BOOL compressed, int codec_id); -void gdi_register_graphics(rdpGraphics* graphics); +BOOL gdi_register_graphics(rdpGraphics* graphics); #endif /* __GDI_GRAPHICS_H */ diff --git a/libfreerdp/gdi/pen.c b/libfreerdp/gdi/pen.c index 24051191c..345a9a945 100644 --- a/libfreerdp/gdi/pen.c +++ b/libfreerdp/gdi/pen.c @@ -24,7 +24,6 @@ #endif #include -#include #include #include @@ -45,6 +44,8 @@ HGDI_PEN gdi_CreatePen(int fnPenStyle, int nWidth, int crColor) { HGDI_PEN hPen = (HGDI_PEN) malloc(sizeof(GDI_PEN)); + if (!hPen) + return NULL; hPen->objectType = GDIOBJECT_PEN; hPen->style = fnPenStyle; hPen->color = crColor; diff --git a/libfreerdp/gdi/region.c b/libfreerdp/gdi/region.c index ac72b68e8..07ef30e4c 100644 --- a/libfreerdp/gdi/region.c +++ b/libfreerdp/gdi/region.c @@ -44,6 +44,8 @@ HGDI_RGN gdi_CreateRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect) { HGDI_RGN hRgn = (HGDI_RGN) malloc(sizeof(GDI_RGN)); + if (!hRgn) + return NULL; hRgn->objectType = GDIOBJECT_REGION; hRgn->x = nLeftRect; hRgn->y = nTopRect; diff --git a/server/Sample/sfreerdp.c b/server/Sample/sfreerdp.c index 19ee553c0..79fdcc454 100644 --- a/server/Sample/sfreerdp.c +++ b/server/Sample/sfreerdp.c @@ -555,12 +555,13 @@ BOOL tf_peer_activate(freerdp_peer* client) return TRUE; } -void tf_peer_synchronize_event(rdpInput* input, UINT32 flags) +BOOL tf_peer_synchronize_event(rdpInput* input, UINT32 flags) { WLog_DBG(TAG, "Client sent a synchronize event (flags:0x%X)", flags); + return TRUE; } -void tf_peer_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) +BOOL tf_peer_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) { freerdp_peer* client = input->context->peer; rdpUpdate* update = client->update; @@ -613,25 +614,29 @@ void tf_peer_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) { } + return TRUE; } -void tf_peer_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) +BOOL tf_peer_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) { WLog_DBG(TAG, "Client sent a unicode keyboard event (flags:0x%X code:0x%X)", flags, code); + return TRUE; } -void tf_peer_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) +BOOL tf_peer_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) { //WLog_DBG(TAG, "Client sent a mouse event (flags:0x%X pos:%d,%d)", flags, x, y); test_peer_draw_icon(input->context->peer, x + 10, y); + return TRUE; } -void tf_peer_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) +BOOL tf_peer_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) { //WLog_DBG(TAG, "Client sent an extended mouse event (flags:0x%X pos:%d,%d)", flags, x, y); + return TRUE; } -static void tf_peer_refresh_rect(rdpContext* context, BYTE count, RECTANGLE_16* areas) +static BOOL tf_peer_refresh_rect(rdpContext* context, BYTE count, RECTANGLE_16* areas) { BYTE i; WLog_DBG(TAG, "Client requested to refresh:"); @@ -640,9 +645,10 @@ static void tf_peer_refresh_rect(rdpContext* context, BYTE count, RECTANGLE_16* { WLog_DBG(TAG, " (%d, %d) (%d, %d)", areas[i].left, areas[i].top, areas[i].right, areas[i].bottom); } + return TRUE; } -static void tf_peer_suppress_output(rdpContext* context, BYTE allow, RECTANGLE_16* area) +static BOOL tf_peer_suppress_output(rdpContext* context, BYTE allow, RECTANGLE_16* area) { if (allow > 0) { @@ -652,6 +658,7 @@ static void tf_peer_suppress_output(rdpContext* context, BYTE allow, RECTANGLE_1 { WLog_DBG(TAG, "Client minimized and suppress output."); } + return TRUE; } static void* test_peer_mainloop(void* arg) diff --git a/server/shadow/Win/win_rdp.c b/server/shadow/Win/win_rdp.c index 55f7382f0..c0a7789b1 100644 --- a/server/shadow/Win/win_rdp.c +++ b/server/shadow/Win/win_rdp.c @@ -42,7 +42,7 @@ void shw_OnChannelDisconnectedEventHandler(rdpContext* context, ChannelDisconnec WLog_INFO(TAG, "OnChannelDisconnected: %s", e->name); } -void shw_begin_paint(rdpContext* context) +BOOL shw_begin_paint(rdpContext* context) { shwContext* shw; rdpGdi* gdi = context->gdi; @@ -51,9 +51,10 @@ void shw_begin_paint(rdpContext* context) gdi->primary->hdc->hwnd->invalid->null = 1; gdi->primary->hdc->hwnd->ninvalid = 0; + return TRUE; } -void shw_end_paint(rdpContext* context) +BOOL shw_end_paint(rdpContext* context) { int index; int ninvalid; @@ -79,16 +80,18 @@ void shw_end_paint(rdpContext* context) SetEvent(subsystem->RdpUpdateEnterEvent); WaitForSingleObject(subsystem->RdpUpdateLeaveEvent, INFINITE); ResetEvent(subsystem->RdpUpdateLeaveEvent); + return TRUE; } -void shw_desktop_resize(rdpContext* context) +BOOL shw_desktop_resize(rdpContext* context) { - + return TRUE; } -void shw_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surfaceFrameMarker) +BOOL shw_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surfaceFrameMarker) { shwContext* shw = (shwContext*) context; + return TRUE; } BOOL shw_authenticate(freerdp* instance, char** username, char** password, char** domain) @@ -249,9 +252,9 @@ void* shw_client_thread(void* arg) * Client Interface */ -void shw_freerdp_client_global_init(void) +BOOL shw_freerdp_client_global_init(void) { - + return TRUE; } void shw_freerdp_client_global_uninit(void) diff --git a/server/shadow/shadow_input.c b/server/shadow/shadow_input.c index b3e732036..d998c8622 100644 --- a/server/shadow/shadow_input.c +++ b/server/shadow/shadow_input.c @@ -22,49 +22,52 @@ #include "shadow.h" -void shadow_input_synchronize_event(rdpInput* input, UINT32 flags) +BOOL shadow_input_synchronize_event(rdpInput* input, UINT32 flags) { rdpShadowClient* client = (rdpShadowClient*) input->context; rdpShadowSubsystem* subsystem = client->server->subsystem; if (!client->mayInteract) - return; + return TRUE; if (subsystem->SynchronizeEvent) { subsystem->SynchronizeEvent(subsystem, flags); } + return TRUE; } -void shadow_input_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) +BOOL shadow_input_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) { rdpShadowClient* client = (rdpShadowClient*) input->context; rdpShadowSubsystem* subsystem = client->server->subsystem; if (!client->mayInteract) - return; + return TRUE; if (subsystem->KeyboardEvent) { subsystem->KeyboardEvent(subsystem, flags, code); } + return TRUE; } -void shadow_input_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) +BOOL shadow_input_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) { rdpShadowClient* client = (rdpShadowClient*) input->context; rdpShadowSubsystem* subsystem = client->server->subsystem; if (!client->mayInteract) - return; + return TRUE; if (subsystem->UnicodeKeyboardEvent) { subsystem->UnicodeKeyboardEvent(subsystem, flags, code); } + return TRUE; } -void shadow_input_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) +BOOL shadow_input_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) { rdpShadowClient* client = (rdpShadowClient*) input->context; rdpShadowSubsystem* subsystem = client->server->subsystem; @@ -80,20 +83,21 @@ void shadow_input_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) flags &= ~PTR_FLAGS_MOVE; if (!(flags & (PTR_FLAGS_BUTTON1 | PTR_FLAGS_BUTTON2 | PTR_FLAGS_BUTTON3))) - return; + return TRUE; } } if (!client->mayInteract) - return; + return TRUE; if (subsystem->MouseEvent) { subsystem->MouseEvent(subsystem, flags, x, y); } + return TRUE; } -void shadow_input_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) +BOOL shadow_input_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) { rdpShadowClient* client = (rdpShadowClient*) input->context; rdpShadowSubsystem* subsystem = client->server->subsystem; @@ -102,12 +106,13 @@ void shadow_input_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, client->pointerY = y; if (!client->mayInteract) - return; + return TRUE; if (subsystem->ExtendedMouseEvent) { subsystem->ExtendedMouseEvent(subsystem, flags, x, y); } + return TRUE; } void shadow_input_register_callbacks(rdpInput* input)