From 5c1216aad469a74bcbdd08942864c24c5580a167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andre=CC=81=20Moreau?= Date: Sun, 8 Jan 2012 12:42:30 -0500 Subject: [PATCH 1/7] libfreerdp-kbd: fix keymaps search --- libfreerdp-kbd/CMakeLists.txt | 12 +++++++----- libfreerdp-kbd/layouts_xkb.c | 8 ++++++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/libfreerdp-kbd/CMakeLists.txt b/libfreerdp-kbd/CMakeLists.txt index f6e9d4de8..060846f55 100644 --- a/libfreerdp-kbd/CMakeLists.txt +++ b/libfreerdp-kbd/CMakeLists.txt @@ -34,11 +34,13 @@ if(X11_FOUND) target_link_libraries(freerdp-kbd ${X11_LIBRARIES}) endif() -find_suggested_package(XKBFile) -if(XKBFILE_FOUND) - add_definitions(-DWITH_XKBFILE) - include_directories(${XKBFILE_INCLUDE_DIRS}) - target_link_libraries(freerdp-kbd ${XKBFILE_LIBRARIES}) +if(NOT APPLE) + find_suggested_package(XKBFile) + if(XKBFILE_FOUND) + add_definitions(-DWITH_XKBFILE) + include_directories(${XKBFILE_INCLUDE_DIRS}) + target_link_libraries(freerdp-kbd ${XKBFILE_LIBRARIES}) + endif() endif() add_definitions(-DKEYMAP_PATH="${FREERDP_KEYMAP_PATH}") diff --git a/libfreerdp-kbd/layouts_xkb.c b/libfreerdp-kbd/layouts_xkb.c index b9ad07f49..e71f50dcb 100644 --- a/libfreerdp-kbd/layouts_xkb.c +++ b/libfreerdp-kbd/layouts_xkb.c @@ -235,8 +235,12 @@ static int load_xkb_keyboard(KeycodeToVkcode map, char* kbd) if((fp = fopen(xkbfilepath, "r")) == NULL) { - /* If ran from the source tree, the keymaps will be in the parent directory */ - snprintf(xkbfilepath, sizeof(xkbfilepath), "../keymaps/%s", xkbfile); + /* If ran from the root of the source tree */ + snprintf(xkbfilepath, sizeof(xkbfilepath), "./keymaps/%s", xkbfile); + + /* If ran from the client directory */ + if((fp = fopen(xkbfilepath, "r")) == NULL) + snprintf(xkbfilepath, sizeof(xkbfilepath), "../../keymaps/%s", xkbfile); if((fp = fopen(xkbfilepath, "r")) == NULL) { From 78a517f171897b6c7f185213a94e76bff00916c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 8 Jan 2012 15:02:02 -0500 Subject: [PATCH 2/7] libfreerdp-core: fix padding with pointer color update --- libfreerdp-core/update.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libfreerdp-core/update.c b/libfreerdp-core/update.c index 0d3a8a25a..1bb9b1ebe 100644 --- a/libfreerdp-core/update.c +++ b/libfreerdp-core/update.c @@ -187,7 +187,8 @@ void update_read_pointer_color(STREAM* s, POINTER_COLOR_UPDATE* pointer_color) stream_read(s, pointer_color->andMaskData, pointer_color->lengthAndMask); } - stream_seek_uint8(s); /* pad (1 byte) */ + if (stream_get_left(s) > 0) + stream_seek_uint8(s); /* pad (1 byte) */ } void update_read_pointer_new(STREAM* s, POINTER_NEW_UPDATE* pointer_new) From 2cdf1aa24a83002342fed1155da019bb1fa6c5d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 8 Jan 2012 15:22:52 -0500 Subject: [PATCH 3/7] libfreerdp-core: fix issue #281 for slow-path pointer PDUs --- libfreerdp-core/rdp.h | 1 + libfreerdp-core/update.c | 9 +-------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/libfreerdp-core/rdp.h b/libfreerdp-core/rdp.h index 7630b7032..ac99c9bea 100644 --- a/libfreerdp-core/rdp.h +++ b/libfreerdp-core/rdp.h @@ -177,6 +177,7 @@ boolean rdp_send_pdu(rdpRdp* rdp, STREAM* s, uint16 type, uint16 channel_id); STREAM* rdp_data_pdu_init(rdpRdp* rdp); boolean rdp_send_data_pdu(rdpRdp* rdp, STREAM* s, uint8 type, uint16 channel_id); +void rdp_recv_data_pdu(rdpRdp* rdp, STREAM* s); boolean rdp_send(rdpRdp* rdp, STREAM* s, uint16 channel_id); void rdp_recv(rdpRdp* rdp); diff --git a/libfreerdp-core/update.c b/libfreerdp-core/update.c index 1bb9b1ebe..628b736c1 100644 --- a/libfreerdp-core/update.c +++ b/libfreerdp-core/update.c @@ -280,23 +280,16 @@ void update_recv(rdpUpdate* update, STREAM* s) if (stream_get_left(s) > RDP_SHARE_DATA_HEADER_LENGTH) { - uint8 type; uint16 pduType; uint16 length; uint16 source; - uint32 shareId; - uint8 compressed_type; - uint16 compressed_len; rdp_read_share_control_header(s, &length, &pduType, &source); if (pduType != PDU_TYPE_DATA) return; - rdp_read_share_data_header(s, &length, &type, &shareId, &compressed_type, &compressed_len); - - if (type == DATA_PDU_TYPE_UPDATE) - update_recv(update, s); + rdp_recv_data_pdu(update->context->rdp, s); } } From 7eff021771df4bbe783ae633642e6bc8d345c8bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 8 Jan 2012 16:02:59 -0500 Subject: [PATCH 4/7] libfreerdp-core: fix parsing bugs with synchronize, font map and session logon info PDUs --- libfreerdp-core/activation.c | 35 ++++++++++++++++++++++++++++++++++- libfreerdp-core/activation.h | 5 ++++- libfreerdp-core/info.c | 1 + libfreerdp-core/peer.c | 2 +- libfreerdp-core/rdp.c | 4 ++-- 5 files changed, 42 insertions(+), 5 deletions(-) diff --git a/libfreerdp-core/activation.c b/libfreerdp-core/activation.c index 4b7937609..5c781b8bf 100644 --- a/libfreerdp-core/activation.c +++ b/libfreerdp-core/activation.c @@ -36,6 +36,14 @@ void rdp_write_synchronize_pdu(STREAM* s, rdpSettings* settings) stream_write_uint16(s, settings->pdu_source); /* targetUser (2 bytes) */ } +boolean rdp_recv_synchronize_pdu(rdpRdp* rdp, STREAM* s) +{ + if (rdp->settings->server_mode) + return rdp_recv_server_synchronize_pdu(rdp, s); + else + return rdp_recv_client_synchronize_pdu(rdp, s); +} + boolean rdp_recv_server_synchronize_pdu(rdpRdp* rdp, STREAM* s) { rdp->finalize_sc_pdus |= FINALIZE_SC_SYNCHRONIZE_PDU; @@ -54,17 +62,22 @@ boolean rdp_send_server_synchronize_pdu(rdpRdp* rdp) return true; } -boolean rdp_recv_client_synchronize_pdu(STREAM* s) +boolean rdp_recv_client_synchronize_pdu(rdpRdp* rdp, STREAM* s) { uint16 messageType; + rdp->finalize_sc_pdus |= FINALIZE_SC_SYNCHRONIZE_PDU; + if (stream_get_left(s) < 4) return false; stream_read_uint16(s, messageType); /* messageType (2 bytes) */ + if (messageType != SYNCMSGTYPE_SYNC) return false; + /* targetUser (2 bytes) */ + stream_seek_uint16(s); return true; } @@ -220,12 +233,32 @@ boolean rdp_send_client_font_list_pdu(rdpRdp* rdp, uint16 flags) return rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_FONT_LIST, rdp->mcs->user_id); } +boolean rdp_recv_font_map_pdu(rdpRdp* rdp, STREAM* s) +{ + if (rdp->settings->server_mode) + return rdp_recv_server_font_map_pdu(rdp, s); + else + return rdp_recv_client_font_map_pdu(rdp, s); +} + boolean rdp_recv_server_font_map_pdu(rdpRdp* rdp, STREAM* s) { rdp->finalize_sc_pdus |= FINALIZE_SC_FONT_MAP_PDU; return true; } +boolean rdp_recv_client_font_map_pdu(rdpRdp* rdp, STREAM* s) +{ + rdp->finalize_sc_pdus |= FINALIZE_SC_FONT_MAP_PDU; + + stream_seek_uint16(s); /* numberEntries (2 bytes) */ + stream_seek_uint16(s); /* totalNumEntries (2 bytes) */ + stream_seek_uint16(s); /* mapFlags (2 bytes) */ + stream_seek_uint16(s); /* entrySize (2 bytes) */ + + return true; +} + boolean rdp_send_server_font_map_pdu(rdpRdp* rdp) { STREAM* s; diff --git a/libfreerdp-core/activation.h b/libfreerdp-core/activation.h index 5c414ed14..25891711a 100644 --- a/libfreerdp-core/activation.h +++ b/libfreerdp-core/activation.h @@ -41,9 +41,10 @@ boolean rdp_recv_deactivate_all(rdpRdp* rdp, STREAM* s); boolean rdp_send_deactivate_all(rdpRdp* rdp); +boolean rdp_recv_synchronize_pdu(rdpRdp* rdp, STREAM* s); boolean rdp_recv_server_synchronize_pdu(rdpRdp* rdp, STREAM* s); boolean rdp_send_server_synchronize_pdu(rdpRdp* rdp); -boolean rdp_recv_client_synchronize_pdu(STREAM* s); +boolean rdp_recv_client_synchronize_pdu(rdpRdp* rdp, STREAM* s); boolean rdp_send_client_synchronize_pdu(rdpRdp* rdp); boolean rdp_recv_control_pdu(STREAM* s, uint16* action); boolean rdp_recv_server_control_pdu(rdpRdp* rdp, STREAM* s); @@ -53,7 +54,9 @@ boolean rdp_send_client_control_pdu(rdpRdp* rdp, uint16 action); boolean rdp_send_client_persistent_key_list_pdu(rdpRdp* rdp); boolean rdp_recv_client_font_list_pdu(STREAM* s); boolean rdp_send_client_font_list_pdu(rdpRdp* rdp, uint16 flags); +boolean rdp_recv_font_map_pdu(rdpRdp* rdp, STREAM* s); boolean rdp_recv_server_font_map_pdu(rdpRdp* rdp, STREAM* s); +boolean rdp_recv_client_font_map_pdu(rdpRdp* rdp, STREAM* s); boolean rdp_send_server_font_map_pdu(rdpRdp* rdp); boolean rdp_server_accept_client_control_pdu(rdpRdp* rdp, STREAM* s); diff --git a/libfreerdp-core/info.c b/libfreerdp-core/info.c index 6c1794091..40c08e19b 100644 --- a/libfreerdp-core/info.c +++ b/libfreerdp-core/info.c @@ -612,6 +612,7 @@ void rdp_recv_logon_info_v2(rdpRdp* rdp, STREAM* s) stream_seek_uint16(s); /* version (2 bytes) */ stream_seek_uint32(s); /* size (4 bytes) */ + stream_seek_uint32(s); /* sessionId (4 bytes) */ stream_read_uint32(s, cbDomain); /* cbDomain (4 bytes) */ stream_read_uint32(s, cbUserName); /* cbUserName (4 bytes) */ stream_seek(s, 558); /* pad */ diff --git a/libfreerdp-core/peer.c b/libfreerdp-core/peer.c index e85662da4..3960e9d91 100644 --- a/libfreerdp-core/peer.c +++ b/libfreerdp-core/peer.c @@ -64,7 +64,7 @@ static boolean peer_recv_data_pdu(freerdp_peer* client, STREAM* s) switch (type) { case DATA_PDU_TYPE_SYNCHRONIZE: - if (!rdp_recv_client_synchronize_pdu(s)) + if (!rdp_recv_client_synchronize_pdu(client->context->rdp, s)) return false; break; diff --git a/libfreerdp-core/rdp.c b/libfreerdp-core/rdp.c index 4373a8310..5f32d5254 100644 --- a/libfreerdp-core/rdp.c +++ b/libfreerdp-core/rdp.c @@ -466,7 +466,7 @@ void rdp_recv_data_pdu(rdpRdp* rdp, STREAM* s) break; case DATA_PDU_TYPE_SYNCHRONIZE: - rdp_recv_server_synchronize_pdu(rdp, s); + rdp_recv_synchronize_pdu(rdp, s); break; case DATA_PDU_TYPE_REFRESH_RECT: @@ -493,7 +493,7 @@ void rdp_recv_data_pdu(rdpRdp* rdp, STREAM* s) break; case DATA_PDU_TYPE_FONT_MAP: - rdp_recv_server_font_map_pdu(rdp, s); + rdp_recv_font_map_pdu(rdp, s); break; case DATA_PDU_TYPE_SET_KEYBOARD_INDICATORS: From eb2c9969e8b70cca4ad1f6cdb21e9869966fad89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 8 Jan 2012 17:43:07 -0500 Subject: [PATCH 5/7] libfreerdp-gdi: fix 16bpp glyph drawing --- libfreerdp-gdi/16bpp.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/libfreerdp-gdi/16bpp.c b/libfreerdp-gdi/16bpp.c index 2d670eb05..44c121cdb 100644 --- a/libfreerdp-gdi/16bpp.c +++ b/libfreerdp-gdi/16bpp.c @@ -368,9 +368,9 @@ static int BitBlt_SRCPAINT_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nW static int BitBlt_DSPDxax_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc) { int x, y; - uint16* srcp; + uint8* srcp; uint16* dstp; - uint16* patp; + uint16 src16; uint16 color16; HGDI_BITMAP hSrcBmp; @@ -380,7 +380,6 @@ static int BitBlt_DSPDxax_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWi color16 = gdi_get_color_16bpp(hdcDest, hdcDest->textColor); hSrcBmp = (HGDI_BITMAP) hdcSrc->selectedObject; - srcp = (uint16*) hSrcBmp->data; if (hdcSrc->bytesPerPixel != 1) { @@ -390,15 +389,15 @@ static int BitBlt_DSPDxax_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWi for (y = 0; y < nHeight; y++) { - srcp = (uint16*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); + srcp = (uint8*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { - patp = (uint16*) &color16; - *dstp = (*srcp & *patp) | (~(*srcp) & *dstp); + src16 = (*srcp << 8) | *srcp; + *dstp = (src16 & color16) | (~src16 & *dstp); srcp++; dstp++; } From 05dd50c97a7fb59ab805d79b88af872f10bbb763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 8 Jan 2012 18:19:04 -0500 Subject: [PATCH 6/7] libfreerdp-gdi: fix minor color background bug with glyph drawing --- libfreerdp-gdi/graphics.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libfreerdp-gdi/graphics.c b/libfreerdp-gdi/graphics.c index b44e1c387..db5ab8976 100644 --- a/libfreerdp-gdi/graphics.c +++ b/libfreerdp-gdi/graphics.c @@ -186,10 +186,11 @@ void gdi_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int heigh HGDI_BRUSH brush; rdpGdi* gdi = context->gdi; - bgcolor = freerdp_color_convert_rgb(bgcolor, gdi->srcBpp, 32, gdi->clrconv); - fgcolor = freerdp_color_convert_rgb(fgcolor, gdi->srcBpp, 32, gdi->clrconv); + bgcolor = freerdp_color_convert_var_bgr(bgcolor, gdi->srcBpp, 32, gdi->clrconv); + fgcolor = freerdp_color_convert_var_bgr(fgcolor, gdi->srcBpp, 32, gdi->clrconv); gdi_CRgnToRect(x, y, width, height, &rect); + brush = gdi_CreateSolidBrush(fgcolor); gdi_FillRect(gdi->drawing->hdc, &rect, brush); @@ -201,7 +202,7 @@ void gdi_Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, { rdpGdi* gdi = context->gdi; - bgcolor = freerdp_color_convert_rgb(bgcolor, gdi->srcBpp, 32, gdi->clrconv); + bgcolor = freerdp_color_convert_var_bgr(bgcolor, gdi->srcBpp, 32, gdi->clrconv); gdi->textColor = gdi_SetTextColor(gdi->drawing->hdc, bgcolor); } From ebca5a2de2e3856da0c19ac71730457a02e81d5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 8 Jan 2012 19:08:13 -0500 Subject: [PATCH 7/7] xfreerdp: fix glyph background color bug --- client/X11/xf_graphics.c | 4 ++-- libfreerdp-cache/glyph.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/X11/xf_graphics.c b/client/X11/xf_graphics.c index 2b9d06a87..276c65c92 100644 --- a/client/X11/xf_graphics.c +++ b/client/X11/xf_graphics.c @@ -243,8 +243,8 @@ void xf_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height { xfInfo* xfi = ((xfContext*) context)->xfi; - bgcolor = freerdp_color_convert_rgb(bgcolor, xfi->srcBpp, 32, xfi->clrconv); - fgcolor = freerdp_color_convert_rgb(fgcolor, xfi->srcBpp, 32, xfi->clrconv); + bgcolor = freerdp_color_convert_var_rgb(bgcolor, xfi->srcBpp, 32, xfi->clrconv); + fgcolor = freerdp_color_convert_var_rgb(fgcolor, xfi->srcBpp, 32, xfi->clrconv); XSetFunction(xfi->display, xfi->gc, GXcopy); XSetFillStyle(xfi->display, xfi->gc, FillSolid); diff --git a/libfreerdp-cache/glyph.c b/libfreerdp-cache/glyph.c index bd66fc8c5..c4fa08602 100644 --- a/libfreerdp-cache/glyph.c +++ b/libfreerdp-cache/glyph.c @@ -81,7 +81,7 @@ void update_process_glyph_fragments(rdpContext* context, uint8* data, uint32 len graphics = context->graphics; glyph_cache = context->cache->glyph; - if (opWidth > 1) + if (opWidth > 0 && opHeight > 0) Glyph_BeginDraw(context, opX, opY, opWidth, opHeight, bgcolor, fgcolor); else Glyph_BeginDraw(context, 0, 0, 0, 0, bgcolor, fgcolor);