summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin H. Johnson <robbat2@gentoo.org>2015-08-08 13:49:04 -0700
committerRobin H. Johnson <robbat2@gentoo.org>2015-08-08 17:38:18 -0700
commit56bd759df1d0c750a065b8c845e93d5dfa6b549d (patch)
tree3f91093cdb475e565ae857f1c5a7fd339e2d781e /net-misc/freerdp/files
downloadgentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.tar.gz
gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.tar.bz2
gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.zip
proj/gentoo: Initial commit
This commit represents a new era for Gentoo: Storing the gentoo-x86 tree in Git, as converted from CVS. This commit is the start of the NEW history. Any historical data is intended to be grafted onto this point. Creation process: 1. Take final CVS checkout snapshot 2. Remove ALL ChangeLog* files 3. Transform all Manifests to thin 4. Remove empty Manifests 5. Convert all stale $Header$/$Id$ CVS keywords to non-expanded Git $Id$ 5.1. Do not touch files with -kb/-ko keyword flags. Signed-off-by: Robin H. Johnson <robbat2@gentoo.org> X-Thanks: Alec Warner <antarus@gentoo.org> - did the GSoC 2006 migration tests X-Thanks: Robin H. Johnson <robbat2@gentoo.org> - infra guy, herding this project X-Thanks: Nguyen Thai Ngoc Duy <pclouds@gentoo.org> - Former Gentoo developer, wrote Git features for the migration X-Thanks: Brian Harring <ferringb@gentoo.org> - wrote much python to improve cvs2svn X-Thanks: Rich Freeman <rich0@gentoo.org> - validation scripts X-Thanks: Patrick Lauer <patrick@gentoo.org> - Gentoo dev, running new 2014 work in migration X-Thanks: Michał Górny <mgorny@gentoo.org> - scripts, QA, nagging X-Thanks: All of other Gentoo developers - many ideas and lots of paint on the bikeshed
Diffstat (limited to 'net-misc/freerdp/files')
-rw-r--r--net-misc/freerdp/files/freerdp-1.1-CVE-2014-0250.patch308
-rw-r--r--net-misc/freerdp/files/freerdp-1.1-cmake-3.1.patch68
-rw-r--r--net-misc/freerdp/files/freerdp-1.1.0_beta1-avx.patch61
-rw-r--r--net-misc/freerdp/files/freerdp-1.1.0_beta1_p20130710-cmake.patch25
-rw-r--r--net-misc/freerdp/files/freerdp-1.1.0_beta1_p20130710-ffmpeg.patch127
-rw-r--r--net-misc/freerdp/files/freerdp-1.1.0_beta1_p20130710-uclibc.patch66
-rw-r--r--net-misc/freerdp/files/freerdp-armfp.patch84
-rw-r--r--net-misc/freerdp/files/freerdp-cmake-3.1.patch98
8 files changed, 837 insertions, 0 deletions
diff --git a/net-misc/freerdp/files/freerdp-1.1-CVE-2014-0250.patch b/net-misc/freerdp/files/freerdp-1.1-CVE-2014-0250.patch
new file mode 100644
index 000000000000..ce4d3d989098
--- /dev/null
+++ b/net-misc/freerdp/files/freerdp-1.1-CVE-2014-0250.patch
@@ -0,0 +1,308 @@
+From 5ad707ddf33d1d785a8ca1fbeec91d2eee985820 Mon Sep 17 00:00:00 2001
+From: Hardening <rdp.effort@gmail.com>
+Date: Fri, 6 Jun 2014 23:24:16 +0200
+Subject: [PATCH] Fix CVE-2014-0250
+
+This patch fixes CVE-2014-0250 by checking width, height and bpp when
+receiving a new pointer.
+---
+ client/X11/xf_cliprdr.c | 11 +++++--
+ libfreerdp/core/fastpath.c | 2 +-
+ libfreerdp/core/orders.c | 21 ++++++++++++
+ libfreerdp/core/surface.c | 6 ++++
+ libfreerdp/core/update.c | 82 +++++++++++++++++++++++++++++++++++++++-------
+ libfreerdp/core/update.h | 2 +-
+ libfreerdp/core/window.c | 5 +++
+ 7 files changed, 114 insertions(+), 15 deletions(-)
+
+diff --git a/client/X11/xf_cliprdr.c b/client/X11/xf_cliprdr.c
+index 19c4332..8fb49f9 100644
+--- a/client/X11/xf_cliprdr.c
++++ b/client/X11/xf_cliprdr.c
+@@ -914,7 +914,7 @@ static void xf_cliprdr_process_unicodetext(clipboardContext* cb, BYTE* data, int
+ crlf2lf(cb->data, &cb->data_length);
+ }
+
+-static void xf_cliprdr_process_dib(clipboardContext* cb, BYTE* data, int size)
++static BOOL xf_cliprdr_process_dib(clipboardContext* cb, BYTE* data, int size)
+ {
+ wStream* s;
+ UINT16 bpp;
+@@ -926,12 +926,18 @@ static void xf_cliprdr_process_dib(clipboardContext* cb, BYTE* data, int size)
+ if (size < 40)
+ {
+ DEBUG_X11_CLIPRDR("dib size %d too short", size);
+- return;
++ return FALSE;
+ }
+
+ s = Stream_New(data, size);
+ Stream_Seek(s, 14);
+ Stream_Read_UINT16(s, bpp);
++ if ((bpp < 1) || (bpp > 32))
++ {
++ fprintf(stderr, "%s: invalid bpp value %d", __FUNCTION__, bpp);
++ return FALSE;
++ }
++
+ Stream_Read_UINT32(s, ncolors);
+ offset = 14 + 40 + (bpp <= 8 ? (ncolors == 0 ? (1 << bpp) : ncolors) * 4 : 0);
+ Stream_Free(s, FALSE);
+@@ -949,6 +955,7 @@ static void xf_cliprdr_process_dib(clipboardContext* cb, BYTE* data, int size)
+ cb->data = Stream_Buffer(s);
+ cb->data_length = Stream_GetPosition(s);
+ Stream_Free(s, FALSE);
++ return TRUE;
+ }
+
+ static void xf_cliprdr_process_html(clipboardContext* cb, BYTE* data, int size)
+diff --git a/libfreerdp/core/fastpath.c b/libfreerdp/core/fastpath.c
+index 8448160..dcc7117 100644
+--- a/libfreerdp/core/fastpath.c
++++ b/libfreerdp/core/fastpath.c
+@@ -254,7 +254,7 @@ static int fastpath_recv_update(rdpFastPath* fastpath, BYTE updateCode, UINT32 s
+ break;
+
+ case FASTPATH_UPDATETYPE_COLOR:
+- if (!update_read_pointer_color(s, &pointer->pointer_color))
++ if (!update_read_pointer_color(s, &pointer->pointer_color, 24))
+ return -1;
+ IFCALL(pointer->PointerColor, context, &pointer->pointer_color);
+ break;
+diff --git a/libfreerdp/core/orders.c b/libfreerdp/core/orders.c
+index e5cc520..f22407f 100644
+--- a/libfreerdp/core/orders.c
++++ b/libfreerdp/core/orders.c
+@@ -1830,6 +1830,11 @@ BOOL update_read_cache_bitmap_order(wStream* s, CACHE_BITMAP_ORDER* cache_bitmap
+ Stream_Read_UINT8(s, cache_bitmap->bitmapWidth); /* bitmapWidth (1 byte) */
+ Stream_Read_UINT8(s, cache_bitmap->bitmapHeight); /* bitmapHeight (1 byte) */
+ Stream_Read_UINT8(s, cache_bitmap->bitmapBpp); /* bitmapBpp (1 byte) */
++ if ((cache_bitmap->bitmapBpp < 1) || (cache_bitmap->bitmapBpp > 32))
++ {
++ fprintf(stderr, "%s: invalid bitmap bpp %d\n", __FUNCTION__, cache_bitmap->bitmapBpp);
++ return FALSE;
++ }
+ Stream_Read_UINT16(s, cache_bitmap->bitmapLength); /* bitmapLength (2 bytes) */
+ Stream_Read_UINT16(s, cache_bitmap->cacheIndex); /* cacheIndex (2 bytes) */
+
+@@ -2068,6 +2073,11 @@ BOOL update_read_cache_bitmap_v3_order(wStream* s, CACHE_BITMAP_V3_ORDER* cache_
+ bitmapData = &cache_bitmap_v3->bitmapData;
+
+ Stream_Read_UINT8(s, bitmapData->bpp);
++ if ((bitmapData->bpp < 1) || (bitmapData->bpp > 32))
++ {
++ fprintf(stderr, "%s: invalid bpp value %d", __FUNCTION__, bitmapData->bpp);
++ return FALSE;
++ }
+ Stream_Seek_UINT8(s); /* reserved1 (1 byte) */
+ Stream_Seek_UINT8(s); /* reserved2 (1 byte) */
+ Stream_Read_UINT8(s, bitmapData->codecID); /* codecID (1 byte) */
+@@ -2672,6 +2682,11 @@ BOOL update_read_create_nine_grid_bitmap_order(wStream* s, CREATE_NINE_GRID_BITM
+ return FALSE;
+
+ Stream_Read_UINT8(s, create_nine_grid_bitmap->bitmapBpp); /* bitmapBpp (1 byte) */
++ if ((create_nine_grid_bitmap->bitmapBpp < 1) || (create_nine_grid_bitmap->bitmapBpp > 32))
++ {
++ fprintf(stderr, "%s: invalid bpp value %d", __FUNCTION__, create_nine_grid_bitmap->bitmapBpp);
++ return FALSE;
++ }
+ Stream_Read_UINT16(s, create_nine_grid_bitmap->bitmapId); /* bitmapId (2 bytes) */
+
+ nineGridInfo = &(create_nine_grid_bitmap->nineGridInfo);
+@@ -2707,6 +2722,12 @@ BOOL update_read_stream_bitmap_first_order(wStream* s, STREAM_BITMAP_FIRST_ORDER
+
+ Stream_Read_UINT8(s, stream_bitmap_first->bitmapFlags); /* bitmapFlags (1 byte) */
+ Stream_Read_UINT8(s, stream_bitmap_first->bitmapBpp); /* bitmapBpp (1 byte) */
++ if ((stream_bitmap_first->bitmapBpp < 1) || (stream_bitmap_first->bitmapBpp > 32))
++ {
++ fprintf(stderr, "%s: invalid bpp value %d", __FUNCTION__, stream_bitmap_first->bitmapBpp);
++ return FALSE;
++ }
++
+ Stream_Read_UINT16(s, stream_bitmap_first->bitmapType); /* bitmapType (2 bytes) */
+ Stream_Read_UINT16(s, stream_bitmap_first->bitmapWidth); /* bitmapWidth (2 bytes) */
+ Stream_Read_UINT16(s, stream_bitmap_first->bitmapHeight); /* bitmapHeigth (2 bytes) */
+diff --git a/libfreerdp/core/surface.c b/libfreerdp/core/surface.c
+index 7d0fb22..992a3dd 100644
+--- a/libfreerdp/core/surface.c
++++ b/libfreerdp/core/surface.c
+@@ -38,6 +38,12 @@ static int update_recv_surfcmd_surface_bits(rdpUpdate* update, wStream* s, UINT3
+ Stream_Read_UINT16(s, cmd->destRight);
+ Stream_Read_UINT16(s, cmd->destBottom);
+ Stream_Read_UINT8(s, cmd->bpp);
++ if ((cmd->bpp < 1) || (cmd->bpp > 32))
++ {
++ fprintf(stderr, "%s: invalid bpp value %d", __FUNCTION__, cmd->bpp);
++ return FALSE;
++ }
++
+ Stream_Seek(s, 2); /* reserved1, reserved2 */
+ Stream_Read_UINT8(s, cmd->codecID);
+ Stream_Read_UINT16(s, cmd->width);
+diff --git a/libfreerdp/core/update.c b/libfreerdp/core/update.c
+index c4eaede..27c36e3 100644
+--- a/libfreerdp/core/update.c
++++ b/libfreerdp/core/update.c
+@@ -219,16 +219,32 @@ BOOL update_read_pointer_system(wStream* s, POINTER_SYSTEM_UPDATE* pointer_syste
+ return TRUE;
+ }
+
+-BOOL update_read_pointer_color(wStream* s, POINTER_COLOR_UPDATE* pointer_color)
++BOOL update_read_pointer_color(wStream* s, POINTER_COLOR_UPDATE* pointer_color, int xorBpp)
+ {
++ BYTE *newMask;
++ int scanlineSize;
++
+ if (Stream_GetRemainingLength(s) < 14)
+ return FALSE;
+
+ Stream_Read_UINT16(s, pointer_color->cacheIndex); /* cacheIndex (2 bytes) */
+ Stream_Read_UINT16(s, pointer_color->xPos); /* xPos (2 bytes) */
+ Stream_Read_UINT16(s, pointer_color->yPos); /* yPos (2 bytes) */
++
++ /**
++ * As stated in 2.2.9.1.1.4.4 Color Pointer Update:
++ * The maximum allowed pointer width/height is 96 pixels if the client indicated support
++ * for large pointers by setting the LARGE_POINTER_FLAG (0x00000001) in the Large
++ * Pointer Capability Set (section 2.2.7.2.7). If the LARGE_POINTER_FLAG was not
++ * set, the maximum allowed pointer width/height is 32 pixels.
++ *
++ * So we check for a maximum of 96 for CVE-2014-0250.
++ */
+ Stream_Read_UINT16(s, pointer_color->width); /* width (2 bytes) */
+ Stream_Read_UINT16(s, pointer_color->height); /* height (2 bytes) */
++ if ((pointer_color->width > 96) || (pointer_color->height > 96))
++ return FALSE;
++
+ Stream_Read_UINT16(s, pointer_color->lengthAndMask); /* lengthAndMask (2 bytes) */
+ Stream_Read_UINT16(s, pointer_color->lengthXorMask); /* lengthXorMask (2 bytes) */
+
+@@ -245,26 +261,65 @@ BOOL update_read_pointer_color(wStream* s, POINTER_COLOR_UPDATE* pointer_color)
+
+ if (pointer_color->lengthXorMask > 0)
+ {
++ /**
++ * Spec states that:
++ *
++ * xorMaskData (variable): A variable-length array of bytes. Contains the 24-bpp, bottom-up
++ * XOR mask scan-line data. The XOR mask is padded to a 2-byte boundary for each encoded
++ * scan-line. For example, if a 3x3 pixel cursor is being sent, then each scan-line will consume 10
++ * bytes (3 pixels per scan-line multiplied by 3 bytes per pixel, rounded up to the next even
++ * number of bytes).
++ *
++ * In fact instead of 24-bpp, the bpp parameter is given by the containing packet.
++ */
+ if (Stream_GetRemainingLength(s) < pointer_color->lengthXorMask)
+ return FALSE;
+
+- if (!pointer_color->xorMaskData)
+- pointer_color->xorMaskData = malloc(pointer_color->lengthXorMask);
+- else
+- pointer_color->xorMaskData = realloc(pointer_color->xorMaskData, pointer_color->lengthXorMask);
++ scanlineSize = (7 + xorBpp * pointer_color->width) / 8;
++ scanlineSize = ((scanlineSize + 1) / 2) * 2;
++ if (scanlineSize * pointer_color->height != pointer_color->lengthXorMask)
++ {
++ fprintf(stderr, "%s: invalid lengthXorMask: width=%d height=%d, %d instead of %d\n", __FUNCTION__,
++ pointer_color->width, pointer_color->height,
++ pointer_color->lengthXorMask, scanlineSize * pointer_color->height);
++ return FALSE;
++ }
++
++ newMask = realloc(pointer_color->xorMaskData, pointer_color->lengthXorMask);
++ if (!newMask)
++ return FALSE;
++
++ pointer_color->xorMaskData = newMask;
+
+ Stream_Read(s, pointer_color->xorMaskData, pointer_color->lengthXorMask);
+ }
+
+ if (pointer_color->lengthAndMask > 0)
+ {
++ /**
++ * andMaskData (variable): A variable-length array of bytes. Contains the 1-bpp, bottom-up
++ * AND mask scan-line data. The AND mask is padded to a 2-byte boundary for each encoded
++ * scan-line. For example, if a 7x7 pixel cursor is being sent, then each scan-line will consume 2
++ * bytes (7 pixels per scan-line multiplied by 1 bpp, rounded up to the next even number of
++ * bytes).
++ */
+ if (Stream_GetRemainingLength(s) < pointer_color->lengthAndMask)
+ return FALSE;
+
+- if (!pointer_color->andMaskData)
+- pointer_color->andMaskData = malloc(pointer_color->lengthAndMask);
+- else
+- pointer_color->andMaskData = realloc(pointer_color->andMaskData, pointer_color->lengthAndMask);
++ scanlineSize = ((7 + pointer_color->width) / 8);
++ scanlineSize = ((1 + scanlineSize) / 2) * 2;
++ if (scanlineSize * pointer_color->height != pointer_color->lengthAndMask)
++ {
++ fprintf(stderr, "%s: invalid lengthAndMask: %d instead of %d\n", __FUNCTION__,
++ pointer_color->lengthAndMask, scanlineSize * pointer_color->height);
++ return FALSE;
++ }
++
++ newMask = realloc(pointer_color->andMaskData, pointer_color->lengthAndMask);
++ if (!newMask)
++ return FALSE;
++
++ pointer_color->andMaskData = newMask;
+
+ Stream_Read(s, pointer_color->andMaskData, pointer_color->lengthAndMask);
+ }
+@@ -281,7 +336,12 @@ BOOL update_read_pointer_new(wStream* s, POINTER_NEW_UPDATE* pointer_new)
+ return FALSE;
+
+ Stream_Read_UINT16(s, pointer_new->xorBpp); /* xorBpp (2 bytes) */
+- return update_read_pointer_color(s, &pointer_new->colorPtrAttr); /* colorPtrAttr */
++ if ((pointer_new->xorBpp < 1) || (pointer_new->xorBpp > 32))
++ {
++ fprintf(stderr, "%s: invalid xorBpp %d\n", __FUNCTION__, pointer_new->xorBpp);
++ return FALSE;
++ }
++ return update_read_pointer_color(s, &pointer_new->colorPtrAttr, pointer_new->xorBpp); /* colorPtrAttr */
+ }
+
+ BOOL update_read_pointer_cached(wStream* s, POINTER_CACHED_UPDATE* pointer_cached)
+@@ -320,7 +380,7 @@ BOOL update_recv_pointer(rdpUpdate* update, wStream* s)
+ break;
+
+ case PTR_MSG_TYPE_COLOR:
+- if (!update_read_pointer_color(s, &pointer->pointer_color))
++ if (!update_read_pointer_color(s, &pointer->pointer_color, 24))
+ return FALSE;
+ IFCALL(pointer->PointerColor, context, &pointer->pointer_color);
+ break;
+diff --git a/libfreerdp/core/update.h b/libfreerdp/core/update.h
+index c3088f2..d6c2d59 100644
+--- a/libfreerdp/core/update.h
++++ b/libfreerdp/core/update.h
+@@ -53,7 +53,7 @@ BOOL update_recv(rdpUpdate* update, wStream* s);
+
+ BOOL update_read_pointer_position(wStream* s, POINTER_POSITION_UPDATE* pointer_position);
+ BOOL update_read_pointer_system(wStream* s, POINTER_SYSTEM_UPDATE* pointer_system);
+-BOOL update_read_pointer_color(wStream* s, POINTER_COLOR_UPDATE* pointer_color);
++BOOL update_read_pointer_color(wStream* s, POINTER_COLOR_UPDATE* pointer_color, int xorBpp);
+ BOOL update_read_pointer_new(wStream* s, POINTER_NEW_UPDATE* pointer_new);
+ BOOL update_read_pointer_cached(wStream* s, POINTER_CACHED_UPDATE* pointer_cached);
+
+diff --git a/libfreerdp/core/window.c b/libfreerdp/core/window.c
+index 7422f5b..c10fa33 100644
+--- a/libfreerdp/core/window.c
++++ b/libfreerdp/core/window.c
+@@ -35,6 +35,11 @@ BOOL update_read_icon_info(wStream* s, ICON_INFO* icon_info)
+ Stream_Read_UINT16(s, icon_info->cacheEntry); /* cacheEntry (2 bytes) */
+ Stream_Read_UINT8(s, icon_info->cacheId); /* cacheId (1 byte) */
+ Stream_Read_UINT8(s, icon_info->bpp); /* bpp (1 byte) */
++ if ((icon_info->bpp < 1) || (icon_info->bpp > 32))
++ {
++ fprintf(stderr, "%s: invalid bpp %d\n", __FUNCTION__, icon_info->bpp);
++ return FALSE;
++ }
+ Stream_Read_UINT16(s, icon_info->width); /* width (2 bytes) */
+ Stream_Read_UINT16(s, icon_info->height); /* height (2 bytes) */
+
+--
+1.9.3
+
diff --git a/net-misc/freerdp/files/freerdp-1.1-cmake-3.1.patch b/net-misc/freerdp/files/freerdp-1.1-cmake-3.1.patch
new file mode 100644
index 000000000000..aedfeb07a263
--- /dev/null
+++ b/net-misc/freerdp/files/freerdp-1.1-cmake-3.1.patch
@@ -0,0 +1,68 @@
+From 1b663ceffe51008af7ae9749e5b7999b2f7d6698 Mon Sep 17 00:00:00 2001
+From: Bernhard Miklautz <bernhard.miklautz@shacknet.at>
+Date: Fri, 12 Dec 2014 18:26:45 +0100
+Subject: [PATCH] build: cmake 3.1 compatibility
+
+* fix problem with REMOVE_DUPLICATES on undefined lists
+* since 3.1 file(GLOB FILEPATHS RELATIVE .. returns single / instead of // as
+ previously - necessary adoptions for regex and matches done. Should
+ work with all cmake versions.
+
+Tested with 3.1.0-rc3
+---
+ channels/CMakeLists.txt | 4 ++--
+ channels/client/CMakeLists.txt | 2 ++
+ client/CMakeLists.txt | 4 ++--
+ server/CMakeLists.txt | 4 ++--
+ third-party/CMakeLists.txt | 6 +++---
+ 5 files changed, 11 insertions(+), 9 deletions(-)
+
+diff --git a/channels/CMakeLists.txt b/channels/CMakeLists.txt
+index c4e6048..540b1ac 100644
+--- a/channels/CMakeLists.txt
++++ b/channels/CMakeLists.txt
+@@ -253,8 +253,8 @@ set(FILENAME "ChannelOptions.cmake")
+ file(GLOB FILEPATHS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/${FILENAME}")
+
+ foreach(FILEPATH ${FILEPATHS})
+- if(${FILEPATH} MATCHES "^([^/]*)//${FILENAME}")
+- string(REGEX REPLACE "^([^/]*)//${FILENAME}" "\\1" DIR ${FILEPATH})
++ if(${FILEPATH} MATCHES "^([^/]*)/+${FILENAME}")
++ string(REGEX REPLACE "^([^/]*)/+${FILENAME}" "\\1" DIR ${FILEPATH})
+ set(CHANNEL_OPTION)
+ include(${FILEPATH})
+ if(${CHANNEL_OPTION})
+diff --git a/channels/client/CMakeLists.txt b/channels/client/CMakeLists.txt
+index 049bc7b..2db18e8 100644
+--- a/channels/client/CMakeLists.txt
++++ b/channels/client/CMakeLists.txt
+@@ -24,7 +24,9 @@ set(${MODULE_PREFIX}_SRCS
+ ${CMAKE_CURRENT_SOURCE_DIR}/addin.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/addin.h)
+
++if(CHANNEL_STATIC_CLIENT_ENTRIES)
+ list(REMOVE_DUPLICATES CHANNEL_STATIC_CLIENT_ENTRIES)
++endif()
+
+ foreach(STATIC_ENTRY ${CHANNEL_STATIC_CLIENT_ENTRIES})
+ foreach(STATIC_MODULE ${CHANNEL_STATIC_CLIENT_MODULES})
+diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt
+index 09b1fd4..610f35e 100644
+--- a/third-party/CMakeLists.txt
++++ b/third-party/CMakeLists.txt
+@@ -22,11 +22,11 @@
+ file(GLOB all_valid_subdirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/CMakeLists.txt")
+
+ foreach(dir ${all_valid_subdirs})
+- if(${dir} MATCHES "^([^/]*)//CMakeLists.txt")
+- string(REGEX REPLACE "^([^/]*)//CMakeLists.txt" "\\1" dir_trimmed ${dir})
++ if(${dir} MATCHES "^([^/]*)/+CMakeLists.txt")
++ string(REGEX REPLACE "^([^/]*)/+CMakeLists.txt" "\\1" dir_trimmed ${dir})
+ message(STATUS "Adding third-party component ${dir_trimmed}")
+ add_subdirectory(${dir_trimmed})
+ endif()
+ endforeach(dir)
+
+-set(THIRD_PARTY_INCLUDES ${THIRD_PARTY_INCLUDES} PARENT_SCOPE)
+\ No newline at end of file
++set(THIRD_PARTY_INCLUDES ${THIRD_PARTY_INCLUDES} PARENT_SCOPE)
diff --git a/net-misc/freerdp/files/freerdp-1.1.0_beta1-avx.patch b/net-misc/freerdp/files/freerdp-1.1.0_beta1-avx.patch
new file mode 100644
index 000000000000..8a07e8a6d30d
--- /dev/null
+++ b/net-misc/freerdp/files/freerdp-1.1.0_beta1-avx.patch
@@ -0,0 +1,61 @@
+commit 81580f10d910a8e88bc09c1fc692a2e14161ffa1
+Author: Bernhard Miklautz <bernhard.miklautz@shacknet.at>
+Date: Thu Mar 14 23:18:21 2013 +0100
+
+ winpr/sysinfo: fixed build and detection when build with AVX
+
+diff --git a/winpr/libwinpr/sysinfo/sysinfo.c b/winpr/libwinpr/sysinfo/sysinfo.c
+index 947dc24..59200cc 100644
+--- a/winpr/libwinpr/sysinfo/sysinfo.c
++++ b/winpr/libwinpr/sysinfo/sysinfo.c
+@@ -662,32 +662,29 @@ BOOL IsProcessorFeaturePresentEx(DWORD ProcessorFeature)
+ case PF_EX_AVX_AES:
+ {
+ if ((c & C_BITS_AVX) != C_BITS_AVX)
+- ret = FALSE;
++ break;
+
+- int e, f;
+- xgetbv(0, e, f);
++ int e, f;
++ xgetbv(0, e, f);
+
+- if ((e & E_BITS_AVX) == E_BITS_AVX)
++ if ((e & E_BITS_AVX) == E_BITS_AVX)
++ {
++ switch (ProcessorFeature)
+ {
+- switch (ProcessorFeature)
+- {
+- case: PF_EX_AVX:
+- ret = TRUE;
+- break;
+- case: PF_EX_FMA:
+- if (c & C_BIT_FMA)
+- ret = TRUE;
+- break;
+- case: PF_EX_AVX_AES:
+- if (c & C_BIT_AVX_AES)
+- ret = TRUE;
+- break;
+- {
++ case PF_EX_AVX:
+ ret = TRUE;
+ break;
+- }
+- }
+- }
++ case PF_EX_FMA:
++ if (c & C_BIT_FMA)
++ ret = TRUE;
++ break;
++ case PF_EX_AVX_AES:
++ if (c & C_BIT_AVX_AES)
++ ret = TRUE;
++ break;
++ }
++ }
++ }
+ break;
+ #endif //__AVX__
+ default:
diff --git a/net-misc/freerdp/files/freerdp-1.1.0_beta1_p20130710-cmake.patch b/net-misc/freerdp/files/freerdp-1.1.0_beta1_p20130710-cmake.patch
new file mode 100644
index 000000000000..4ab536a50572
--- /dev/null
+++ b/net-misc/freerdp/files/freerdp-1.1.0_beta1_p20130710-cmake.patch
@@ -0,0 +1,25 @@
+From a668a644889bd58405b92c72a91c308c2bad8022 Mon Sep 17 00:00:00 2001
+From: Bernhard Miklautz <bernhard.miklautz@thincast.com>
+Date: Tue, 11 Nov 2014 14:40:31 +0100
+Subject: [PATCH] Don't include CMakeDetermineSystem
+
+According to [1] this is an cmake "internal" module and shouldn't be
+included directly.
+
+[1] http://public.kitware.com/Bug/view.php?id=13796#c31892
+---
+ CMakeLists.txt | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 79f17bd..5f6859c 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -44,7 +44,6 @@ include(CheckCmakeCompat)
+ include(CheckIncludeFiles)
+ include(CheckLibraryExists)
+ include(CheckStructHasMember)
+-include(CMakeDetermineSystem)
+ include(FindPkgConfig)
+ include(TestBigEndian)
+
diff --git a/net-misc/freerdp/files/freerdp-1.1.0_beta1_p20130710-ffmpeg.patch b/net-misc/freerdp/files/freerdp-1.1.0_beta1_p20130710-ffmpeg.patch
new file mode 100644
index 000000000000..0e08c6043080
--- /dev/null
+++ b/net-misc/freerdp/files/freerdp-1.1.0_beta1_p20130710-ffmpeg.patch
@@ -0,0 +1,127 @@
+From bf065f3e892e0a94e442de9a7155a7ac170f2add Mon Sep 17 00:00:00 2001
+From: eroen <eroen@falcon.eroen.eu>
+Date: Thu, 21 Nov 2013 11:35:53 +0100
+Subject: [PATCH 1/3] ffmpeg-2 -- AVCODEC_MAX_AUDIO_FRAME_SIZE
+
+deprecated:
+http://git.videolan.org/?p=ffmpeg.git;a=commit;h=0eea212943544d40f99b05571aa7159d78667154
+
+broken with libavcodec 54
+---
+ channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c b/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c
+index adf8e04..0d5b956 100644
+--- a/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c
++++ b/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c
+@@ -43,6 +43,12 @@
+ #define AVMEDIA_TYPE_AUDIO 1
+ #endif
+
++#if LIBAVCODEC_VERSION_MAJOR < 54
++#define MAX_AUDIO_FRAME_SIZE AVCODEC_MAX_AUDIO_FRAME_SIZE
++#else
++#define MAX_AUDIO_FRAME_SIZE 192000
++#endif
++
+ typedef struct _TSMFFFmpegDecoder
+ {
+ ITSMFDecoder iface;
+@@ -351,7 +357,7 @@ static BOOL tsmf_ffmpeg_decode_audio(ITSMFDecoder* decoder, const BYTE* data, UI
+ #endif
+
+ if (mdecoder->decoded_size_max == 0)
+- mdecoder->decoded_size_max = AVCODEC_MAX_AUDIO_FRAME_SIZE + 16;
++ mdecoder->decoded_size_max = MAX_AUDIO_FRAME_SIZE + 16;
+ mdecoder->decoded_data = malloc(mdecoder->decoded_size_max);
+ ZeroMemory(mdecoder->decoded_data, mdecoder->decoded_size_max);
+ /* align the memory for SSE2 needs */
+@@ -363,7 +369,7 @@ static BOOL tsmf_ffmpeg_decode_audio(ITSMFDecoder* decoder, const BYTE* data, UI
+ while (src_size > 0)
+ {
+ /* Ensure enough space for decoding */
+- if (mdecoder->decoded_size_max - mdecoder->decoded_size < AVCODEC_MAX_AUDIO_FRAME_SIZE)
++ if (mdecoder->decoded_size_max - mdecoder->decoded_size < MAX_AUDIO_FRAME_SIZE)
+ {
+ mdecoder->decoded_size_max = mdecoder->decoded_size_max * 2 + 16;
+ mdecoder->decoded_data = realloc(mdecoder->decoded_data, mdecoder->decoded_size_max);
+--
+1.8.4
+
+
+From cbcf0de3fac985afaeeef7daf104c94ad8cdca26 Mon Sep 17 00:00:00 2001
+From: eroen <eroen@falcon.eroen.eu>
+Date: Thu, 21 Nov 2013 13:14:04 +0100
+Subject: [PATCH 2/3] ffmpeg-2 -- dsp_mask
+
+deprecated:
+http://git.videolan.org/?p=ffmpeg.git;a=commit;h=95510be8c35753da8f48062b28b65e7acdab965f
+
+broken with libavcodec 55
+---
+ channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c b/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c
+index 0d5b956..1f99ec3 100644
+--- a/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c
++++ b/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c
+@@ -104,6 +104,7 @@ static BOOL tsmf_ffmpeg_init_audio_stream(ITSMFDecoder* decoder, const TS_AM_MED
+ mdecoder->codec_context->channels = media_type->Channels;
+ mdecoder->codec_context->block_align = media_type->BlockAlign;
+
++#if LIBAVCODEC_VERSION_MAJOR < 55
+ #ifdef AV_CPU_FLAG_SSE2
+ mdecoder->codec_context->dsp_mask = AV_CPU_FLAG_SSE2 | AV_CPU_FLAG_MMX2;
+ #else
+@@ -113,6 +114,13 @@ static BOOL tsmf_ffmpeg_init_audio_stream(ITSMFDecoder* decoder, const TS_AM_MED
+ mdecoder->codec_context->dsp_mask = FF_MM_SSE2 | FF_MM_MMX2;
+ #endif
+ #endif
++#else /* LIBAVCODEC_VERSION_MAJOR < 55 */
++#ifdef AV_CPU_FLAG_SSE2
++ av_set_cpu_flags_mask(AV_CPU_FLAG_SSE2 | AV_CPU_FLAG_MMX2);
++#else
++ av_set_cpu_flags_mask(FF_MM_SSE2 | FF_MM_MMX2);
++#endif
++#endif /* LIBAVCODEC_VERSION_MAJOR < 55 */
+
+ return TRUE;
+ }
+--
+1.8.4
+
+
+From 6fe23e1a3860528a8ecdfc8e9ccfdbd0e3945869 Mon Sep 17 00:00:00 2001
+From: eroen <eroen@falcon.eroen.eu>
+Date: Thu, 21 Nov 2013 13:26:03 +0100
+Subject: [PATCH 3/3] ffmpeg-2 -- CodecID
+
+deprecated:
+http://git.videolan.org/?p=ffmpeg.git;a=commit;h=104e10fb426f903ba9157fdbfe30292d0e4c3d72
+
+broken with libavcodec 55
+---
+ channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c b/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c
+index 1f99ec3..09b4f68 100644
+--- a/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c
++++ b/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c
+@@ -54,7 +54,11 @@
+ ITSMFDecoder iface;
+
+ int media_type;
++#if LIBAVCODEC_VERSION_MAJOR < 55
+ enum CodecID codec_id;
++#else
++ enum AVCodecID codec_id;
++#endif
+ AVCodecContext* codec_context;
+ AVCodec* codec;
+ AVFrame* frame;
+--
+1.8.4
+
diff --git a/net-misc/freerdp/files/freerdp-1.1.0_beta1_p20130710-uclibc.patch b/net-misc/freerdp/files/freerdp-1.1.0_beta1_p20130710-uclibc.patch
new file mode 100644
index 000000000000..f4f28b287028
--- /dev/null
+++ b/net-misc/freerdp/files/freerdp-1.1.0_beta1_p20130710-uclibc.patch
@@ -0,0 +1,66 @@
+https://bugs.gentoo.org/show_bug.cgi?id=497808
+https://github.com/FreeRDP/FreeRDP/pull/2024
+
+--- FreeRDP-780d451afad21a22d2af6bd030ee71311856f038/channels/drive/client/drive_file.c
++++ FreeRDP-780d451afad21a22d2af6bd030ee71311856f038-uclibc/channels/drive/client/drive_file.c
+@@ -436,7 +436,11 @@ BOOL drive_file_set_information(DRIVE_FI
+ int status;
+ char* fullpath;
+ struct STAT st;
++#if defined(__linux__) && !defined(ANDROID)
++ struct timespec tv[2];
++#else
+ struct timeval tv[2];
++#endif
+ UINT64 LastWriteTime;
+ UINT32 FileAttributes;
+ UINT32 FileNameLength;
+@@ -457,14 +461,21 @@ BOOL drive_file_set_information(DRIVE_FI
+ return FALSE;
+
+ tv[0].tv_sec = st.st_atime;
+- tv[0].tv_usec = 0;
+- tv[1].tv_sec = (LastWriteTime > 0 ? FILE_TIME_RDP_TO_SYSTEM(LastWriteTime) : st.st_mtime);
+- tv[1].tv_usec = 0;
++ tv[1].tv_sec = (LastWriteTime > 0 ? FILE_TIME_RDP_TO_SYSTEM(LastWriteTime) : st.st_mtime);
++
+ #ifndef WIN32
+-/* TODO on win32 */
++/* TODO on win32 */
+ #ifdef ANDROID
++ tv[0].tv_usec = 0;
++ tv[1].tv_usec = 0;
+ utimes(file->fullpath, tv);
++#elif defined (__linux__)
++ tv[0].tv_nsec = 0;
++ tv[1].tv_nsec = 0;
++ futimens(file->fd, tv);
+ #else
++ tv[0].tv_usec = 0;
++ tv[1].tv_usec = 0;
+ futimes(file->fd, tv);
+ #endif
+
+--- FreeRDP-780d451afad21a22d2af6bd030ee71311856f038/winpr/libwinpr/synch/event.c
++++ FreeRDP-780d451afad21a22d2af6bd030ee71311856f038-uclibc/winpr/libwinpr/synch/event.c
+@@ -115,6 +115,20 @@ HANDLE OpenEventA(DWORD dwDesiredAccess,
+ return NULL;
+ }
+
++#ifdef HAVE_EVENTFD_H
++#if defined(__UCLIBC__)
++static int eventfd_read(int fd, eventfd_t* value)
++{
++ return (read(fd, value, sizeof(*value)) == sizeof(*value)) ? 0 : -1;
++}
++
++static int eventfd_write(int fd, eventfd_t value)
++{
++ return (write(fd, &value, sizeof(value)) == sizeof(value)) ? 0 : -1;
++}
++#endif
++#endif
++
+ BOOL SetEvent(HANDLE hEvent)
+ {
+ ULONG Type;
diff --git a/net-misc/freerdp/files/freerdp-armfp.patch b/net-misc/freerdp/files/freerdp-armfp.patch
new file mode 100644
index 000000000000..1a367d5600c3
--- /dev/null
+++ b/net-misc/freerdp/files/freerdp-armfp.patch
@@ -0,0 +1,84 @@
+From 2355b54f8516a6e1c600df8f26ac7d56916bfd99 Mon Sep 17 00:00:00 2001
+From: Mike Gilbert <floppym@gentoo.org>
+Date: Fri, 1 May 2015 17:35:21 -0400
+Subject: [PATCH] Remove the ARM_FP_ABI option
+
+It's unclear why this option would be necessary, and it causes problems
+when people do not match it to their toolchain and CFLAGS.
+
+To set the float abi, either use a toolchain with an appropriate default
+or set the float-abi option in the CFLAGS environment variable.
+
+This should resolve #2586.
+---
+ cmake/ConfigOptions.cmake | 6 ------
+ libfreerdp/CMakeLists.txt | 4 ++--
+ packaging/deb/freerdp-nightly/rules | 7 -------
+ 3 files changed, 2 insertions(+), 15 deletions(-)
+
+diff --git a/cmake/ConfigOptions.cmake b/cmake/ConfigOptions.cmake
+index b51a46b..cef6ba6 100644
+--- a/cmake/ConfigOptions.cmake
++++ b/cmake/ConfigOptions.cmake
+@@ -29,12 +29,6 @@ if(TARGET_ARCH MATCHES "ARM")
+ else()
+ option(WITH_NEON "Enable NEON optimization." OFF)
+ endif()
+- if (NOT DEFINED ARM_FP_ABI)
+- set(ARM_FP_ABI "softfp" CACHE STRING "Floating point ABI to use on arm")
+- else()
+- set(ARM_FP_ABI ${ARM_FP_API} CACHE STRING "Floating point ABI to use on arm")
+- endif()
+- mark_as_advanced(ARM_FP_ABI)
+ else()
+ if(NOT APPLE)
+ option(WITH_IPP "Use Intel Performance Primitives." OFF)
+diff --git a/libfreerdp/CMakeLists.txt b/libfreerdp/CMakeLists.txt
+index a1cbd9d..112b75a 100644
+--- a/libfreerdp/CMakeLists.txt
++++ b/libfreerdp/CMakeLists.txt
+@@ -156,7 +156,7 @@ if(WITH_SSE2)
+ endif()
+
+ if(WITH_NEON)
+- set_source_files_properties(${CODEC_NEON_SRCS} PROPERTIES COMPILE_FLAGS "-mfpu=neon -mfloat-abi=${ARM_FP_ABI} -Wno-unused-variable" )
++ set_source_files_properties(${CODEC_NEON_SRCS} PROPERTIES COMPILE_FLAGS "-mfpu=neon -Wno-unused-variable" )
+ set(CODEC_SRCS ${CODEC_SRCS} ${CODEC_NEON_SRCS})
+ endif()
+
+@@ -236,7 +236,7 @@ if(WITH_SSE2)
+ endif()
+ elseif(WITH_NEON)
+ if(CMAKE_COMPILER_IS_GNUCC)
+- set(OPTIMIZATION "${OPTIMIZATION} -mfpu=neon -mfloat-abi=${ARM_FP_ABI}")
++ set(OPTIMIZATION "${OPTIMIZATION} -mfpu=neon")
+ endif()
+ # TODO: Add MSVC equivalent
+ endif()
+diff --git a/packaging/deb/freerdp-nightly/rules b/packaging/deb/freerdp-nightly/rules
+index 4366f63..44ceb56 100755
+--- a/packaging/deb/freerdp-nightly/rules
++++ b/packaging/deb/freerdp-nightly/rules
+@@ -1,11 +1,5 @@
+ #!/usr/bin/make -f
+
+-DEB_HOST_ARCH=$(shell dpkg-architecture -qDEB_HOST_ARCH)
+-ifneq (,$(filter armhf,$(DEB_HOST_ARCH)))
+-ARM_FLOAT_ABI = -DARM_FP_ABI=hard
+-else
+-ARM_FLOAT_ABI =
+-endif
+ NULL =
+
+ DEB_CMAKE_EXTRA_FLAGS := -DCMAKE_SKIP_RPATH=FALSE \
+@@ -26,7 +20,6 @@ DEB_CMAKE_EXTRA_FLAGS := -DCMAKE_SKIP_RPATH=FALSE \
+ -DCMAKE_INSTALL_PREFIX=/opt/freerdp-nightly/ \
+ -DCMAKE_INSTALL_INCLUDEDIR=include \
+ -DCMAKE_INSTALL_LIBDIR=lib \
+- $(ARM_FLOAT_ABI) \
+ $(NULL)
+
+ %:
+--
+2.5.0
+
diff --git a/net-misc/freerdp/files/freerdp-cmake-3.1.patch b/net-misc/freerdp/files/freerdp-cmake-3.1.patch
new file mode 100644
index 000000000000..462fb56396f8
--- /dev/null
+++ b/net-misc/freerdp/files/freerdp-cmake-3.1.patch
@@ -0,0 +1,98 @@
+From 1b663ceffe51008af7ae9749e5b7999b2f7d6698 Mon Sep 17 00:00:00 2001
+From: Bernhard Miklautz <bernhard.miklautz@shacknet.at>
+Date: Fri, 12 Dec 2014 18:26:45 +0100
+Subject: [PATCH] build: cmake 3.1 compatibility
+
+* fix problem with REMOVE_DUPLICATES on undefined lists
+* since 3.1 file(GLOB FILEPATHS RELATIVE .. returns single / instead of // as
+ previously - necessary adoptions for regex and matches done. Should
+ work with all cmake versions.
+
+Tested with 3.1.0-rc3
+---
+ channels/CMakeLists.txt | 4 ++--
+ channels/client/CMakeLists.txt | 2 ++
+ client/CMakeLists.txt | 4 ++--
+ server/CMakeLists.txt | 4 ++--
+ third-party/CMakeLists.txt | 6 +++---
+ 5 files changed, 11 insertions(+), 9 deletions(-)
+
+diff --git a/channels/CMakeLists.txt b/channels/CMakeLists.txt
+index c4e6048..540b1ac 100644
+--- a/channels/CMakeLists.txt
++++ b/channels/CMakeLists.txt
+@@ -253,8 +253,8 @@ set(FILENAME "ChannelOptions.cmake")
+ file(GLOB FILEPATHS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/${FILENAME}")
+
+ foreach(FILEPATH ${FILEPATHS})
+- if(${FILEPATH} MATCHES "^([^/]*)//${FILENAME}")
+- string(REGEX REPLACE "^([^/]*)//${FILENAME}" "\\1" DIR ${FILEPATH})
++ if(${FILEPATH} MATCHES "^([^/]*)/+${FILENAME}")
++ string(REGEX REPLACE "^([^/]*)/+${FILENAME}" "\\1" DIR ${FILEPATH})
+ set(CHANNEL_OPTION)
+ include(${FILEPATH})
+ if(${CHANNEL_OPTION})
+diff --git a/channels/client/CMakeLists.txt b/channels/client/CMakeLists.txt
+index 049bc7b..2db18e8 100644
+--- a/channels/client/CMakeLists.txt
++++ b/channels/client/CMakeLists.txt
+@@ -24,7 +24,9 @@ set(${MODULE_PREFIX}_SRCS
+ ${CMAKE_CURRENT_SOURCE_DIR}/addin.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/addin.h)
+
++if(CHANNEL_STATIC_CLIENT_ENTRIES)
+ list(REMOVE_DUPLICATES CHANNEL_STATIC_CLIENT_ENTRIES)
++endif()
+
+ foreach(STATIC_ENTRY ${CHANNEL_STATIC_CLIENT_ENTRIES})
+ foreach(STATIC_MODULE ${CHANNEL_STATIC_CLIENT_MODULES})
+diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt
+index 14ed363..b8b7699 100644
+--- a/client/CMakeLists.txt
++++ b/client/CMakeLists.txt
+@@ -63,8 +63,8 @@ set(FILENAME "ModuleOptions.cmake")
+ file(GLOB FILEPATHS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/${FILENAME}")
+
+ foreach(FILEPATH ${FILEPATHS})
+- if(${FILEPATH} MATCHES "^([^/]*)//${FILENAME}")
+- string(REGEX REPLACE "^([^/]*)//${FILENAME}" "\\1" FREERDP_CLIENT ${FILEPATH})
++ if(${FILEPATH} MATCHES "^([^/]*)/+${FILENAME}")
++ string(REGEX REPLACE "^([^/]*)/+${FILENAME}" "\\1" FREERDP_CLIENT ${FILEPATH})
+ set(FREERDP_CLIENT_ENABLED 0)
+ include(${FILEPATH})
+ if(FREERDP_CLIENT_ENABLED)
+diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt
+index cda14ba..ee9458e 100644
+--- a/server/CMakeLists.txt
++++ b/server/CMakeLists.txt
+@@ -48,8 +48,8 @@ set(FILENAME "ModuleOptions.cmake")
+ file(GLOB FILEPATHS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/${FILENAME}")
+
+ foreach(FILEPATH ${FILEPATHS})
+- if(${FILEPATH} MATCHES "^([^/]*)//${FILENAME}")
+- string(REGEX REPLACE "^([^/]*)//${FILENAME}" "\\1" FREERDP_SERVER ${FILEPATH})
++ if(${FILEPATH} MATCHES "^([^/]*)/+${FILENAME}")
++ string(REGEX REPLACE "^([^/]*)/+${FILENAME}" "\\1" FREERDP_SERVER ${FILEPATH})
+ set(FREERDP_SERVER_ENABLED 0)
+ include(${FILEPATH})
+ if(FREERDP_SERVER_ENABLED)
+diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt
+index 09b1fd4..610f35e 100644
+--- a/third-party/CMakeLists.txt
++++ b/third-party/CMakeLists.txt
+@@ -22,11 +22,11 @@
+ file(GLOB all_valid_subdirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/CMakeLists.txt")
+
+ foreach(dir ${all_valid_subdirs})
+- if(${dir} MATCHES "^([^/]*)//CMakeLists.txt")
+- string(REGEX REPLACE "^([^/]*)//CMakeLists.txt" "\\1" dir_trimmed ${dir})
++ if(${dir} MATCHES "^([^/]*)/+CMakeLists.txt")
++ string(REGEX REPLACE "^([^/]*)/+CMakeLists.txt" "\\1" dir_trimmed ${dir})
+ message(STATUS "Adding third-party component ${dir_trimmed}")
+ add_subdirectory(${dir_trimmed})
+ endif()
+ endforeach(dir)
+
+-set(THIRD_PARTY_INCLUDES ${THIRD_PARTY_INCLUDES} PARENT_SCOPE)
+\ No newline at end of file
++set(THIRD_PARTY_INCLUDES ${THIRD_PARTY_INCLUDES} PARENT_SCOPE)