summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorVlad Petrov2019-09-29 00:07:11 +0300
committerVlad Petrov2019-09-29 00:11:50 +0300
commit59b29156e6056c17c6fe6ef3214365b932f7f2a2 (patch)
treee738eac4e759a8b744ef5ca0601701b7e3e45a65
downloadaur-59b29156e6056c17c6fe6ef3214365b932f7f2a2.tar.gz
beautify internal package
-rw-r--r--.SRCINFO90
-rw-r--r--0001_fix-cmdline-parser.patch360
-rw-r--r--0002_handle-old-style-cmdline-options.patch64
-rw-r--r--0003_copy-data-when-adding-glyph-to-cache.patch106
-rw-r--r--0004_build-cmake-3.1-compatibility.patch78
-rw-r--r--0005_release-keys-when-xfreerdp-is-unfocused-to-prevent-s.patch42
-rw-r--r--0006_fix-null-cert-that-is-not-an-error.patch29
-rw-r--r--0007_Fix-build-failure-on-x32.patch32
-rw-r--r--0008-Fix-multiple-security-issues.patch756
-rw-r--r--0009-enable-TLS-12.patch38
-rw-r--r--1001_hide-internal-symbols.patch242
-rw-r--r--1002_update-pkg-config-file.patch16
-rw-r--r--1003_multi-arch-include-path.patch71
-rw-r--r--1004_64-bit-architectures.patch27
-rw-r--r--1005_parse-buffer-endianess.patch67
-rw-r--r--1006_test-unicode-endianess.patch102
-rw-r--r--1007_detect-arm-arch-correctly.patch14
-rw-r--r--1008_gcc-fPIC-on-arm64.patch15
-rw-r--r--1009_libusb-debug.patch14
-rw-r--r--1010_libudev-link.patch13
-rw-r--r--1011_ffmpeg-2.9.patch69
-rw-r--r--1012_typo-fix.patch14
-rw-r--r--1013_aligned_meminfo_alignment.patch48
-rw-r--r--2001_detect-ffmpeg-on-Debian.patch23
-rw-r--r--CVE-2014-0791.patch24
-rw-r--r--CVE-2018-8786.patch25
-rw-r--r--CVE-2018-8787.patch51
-rw-r--r--CVE-2018-8788.patch352
-rw-r--r--CVE-2018-8789.patch27
-rw-r--r--PKGBUILD126
-rw-r--r--tsmf_ffmpeg.patch13
31 files changed, 2948 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..9928330965d5
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,90 @@
+pkgbase = freerdp-1.1.0
+ pkgdesc = Free RDP client version 1.1.0 with patches applied by Canonical for Ubuntu bionic version of package
+ pkgver = 1.1.0
+ pkgrel = 1
+ url = http://freerdp.sourceforge.net
+ arch = i686
+ arch = x86_64
+ license = GPL
+ makedepends = krb5
+ makedepends = cmake
+ makedepends = damageproto
+ makedepends = xmlto
+ makedepends = docbook-xsl
+ depends = openssl-1.0
+ depends = libxcursor
+ depends = libcups
+ depends = alsa-lib
+ depends = libxext
+ depends = libxdamage
+ depends = ffmpeg
+ depends = libxkbfile
+ depends = libxinerama
+ depends = libxv
+ depends = libpulse
+ provides = freerdp
+ conflicts = freerdp
+ conflicts = freerdp-git
+ source = git+https://github.com/FreeRDP/FreeRDP.git#commit=440916eae2e07463912d5fe507677e67096eb083
+ source = 0001_fix-cmdline-parser.patch
+ source = 0002_handle-old-style-cmdline-options.patch
+ source = 0003_copy-data-when-adding-glyph-to-cache.patch
+ source = 0004_build-cmake-3.1-compatibility.patch
+ source = 0005_release-keys-when-xfreerdp-is-unfocused-to-prevent-s.patch
+ source = 0006_fix-null-cert-that-is-not-an-error.patch
+ source = 0007_Fix-build-failure-on-x32.patch
+ source = 0008-Fix-multiple-security-issues.patch
+ source = 0009-enable-TLS-12.patch
+ source = 1001_hide-internal-symbols.patch
+ source = 1002_update-pkg-config-file.patch
+ source = 1003_multi-arch-include-path.patch
+ source = 1004_64-bit-architectures.patch
+ source = 1005_parse-buffer-endianess.patch
+ source = 1006_test-unicode-endianess.patch
+ source = 1007_detect-arm-arch-correctly.patch
+ source = 1008_gcc-fPIC-on-arm64.patch
+ source = 1009_libusb-debug.patch
+ source = 1010_libudev-link.patch
+ source = 1011_ffmpeg-2.9.patch
+ source = 1012_typo-fix.patch
+ source = 1013_aligned_meminfo_alignment.patch
+ source = 2001_detect-ffmpeg-on-Debian.patch
+ source = CVE-2014-0791.patch
+ source = CVE-2018-8786.patch
+ source = CVE-2018-8787.patch
+ source = CVE-2018-8788.patch
+ source = CVE-2018-8789.patch
+ source = tsmf_ffmpeg.patch
+ md5sums = SKIP
+ md5sums = fac4007e3e7c23b97f93c705d3f2b318
+ md5sums = b07a139fb9fe6bb58fce28cb6652ad5b
+ md5sums = 685b9b4ec76e05e21c4c0139ff799424
+ md5sums = 7ad9df81edee2b0f50b31c632ed3115e
+ md5sums = ef594eee59363853c344ec264127dffe
+ md5sums = 68be4cb0387223439304dbb8260c8f10
+ md5sums = 7355210711d6b31eef62cca6dcfb47b3
+ md5sums = e6f05798bcd88dedc4088c33ce0550e8
+ md5sums = a2b13ddd61b21457493321d6cb2fdea3
+ md5sums = 4b234f9fd511784b5afc8b509f2a55ca
+ md5sums = e2e046945d90738180a0a74ed1f5716e
+ md5sums = f8ffb6e5892a9f4779035a643c28a69b
+ md5sums = f45f4ccbb75bc375b66c1f26516638e4
+ md5sums = 4d806b51c39fb31d151dd1ad2d0d7bef
+ md5sums = b00de13c7d72b7140fc7979636446aac
+ md5sums = c6e549c8ab2db539daf780e999d5defa
+ md5sums = 081bef0c3443f2abb4509e8827f18404
+ md5sums = b189033a55f32fe940f1643b5a848480
+ md5sums = 50ce07e227a119cc14f68b1e9da6e502
+ md5sums = 2849fc753e757b3e28242327c6e592db
+ md5sums = 7c373a53c8506fd14c836c45bbeefddd
+ md5sums = 9d1d6b827a0d6b3f8fa308b85e6917bc
+ md5sums = 1fcc55173b3921698b711cccc9b6594a
+ md5sums = 30ce3d4083ac14ca1e2d77980a0f1af7
+ md5sums = d698f5e4e65363c8a0afc6f8c3375c09
+ md5sums = eb5c448d229d5e7825e2cfc6a6bea8e5
+ md5sums = 5d3b8f0eb6f7c14cadc8006fd2f396ee
+ md5sums = 39e69a6d8932a45769f24a0c5c99e1ec
+ md5sums = ce69a20d193e9aec0a2dedd55253405f
+
+pkgname = freerdp-1.1.0
+
diff --git a/0001_fix-cmdline-parser.patch b/0001_fix-cmdline-parser.patch
new file mode 100644
index 000000000000..824c5ba2a9c9
--- /dev/null
+++ b/0001_fix-cmdline-parser.patch
@@ -0,0 +1,360 @@
+Description: Command line parser fixes.
+Author: Bernhard Miklautz <bernhard.miklautz@shacknet.at>
+Abstract:
+ The command line parser had serveral problems when old style syntax
+ was used.
+
+diff --git a/client/common/cmdline.c b/client/common/cmdline.c
+index 3d0cc2d..34064ea 100644
+--- a/client/common/cmdline.c
++++ b/client/common/cmdline.c
+@@ -421,7 +421,7 @@ char** freerdp_command_line_parse_comma_separated_values(char* list, int* count)
+ int index;
+ int nCommas;
+
+- nArgs = nCommas = 0;
++ nCommas = 0;
+
+ for (index = 0; list[index]; index++)
+ nCommas += (list[index] == ',') ? 1 : 0;
+@@ -915,8 +915,13 @@ BOOL freerdp_client_detect_command_line(int argc, char** argv, DWORD* flags)
+ *flags |= COMMAND_LINE_SIGIL_DASH | COMMAND_LINE_SIGIL_DOUBLE_DASH;
+ *flags |= COMMAND_LINE_SIGIL_ENABLE_DISABLE;
+
+- if (windows_cli_count > posix_cli_count)
++ if (posix_cli_status <= COMMAND_LINE_STATUS_PRINT)
++ return compatibility;
++
++ /* Check, if this may be windows style syntax... */
++ if ((windows_cli_count && (windows_cli_count >= posix_cli_count)) || (windows_cli_status <= COMMAND_LINE_STATUS_PRINT))
+ {
++ windows_cli_count = 1;
+ *flags = COMMAND_LINE_SEPARATOR_COLON;
+ *flags |= COMMAND_LINE_SIGIL_SLASH | COMMAND_LINE_SIGIL_PLUS_MINUS;
+ }
+@@ -1020,8 +1025,7 @@ int freerdp_client_parse_command_line_arguments(int argc, char** argv, rdpSettin
+ freerdp_client_command_line_pre_filter, freerdp_client_command_line_post_filter);
+ }
+
+-
+- arg = CommandLineFindArgumentA(args, "v");
++ CommandLineFindArgumentA(args, "v");
+
+ arg = args;
+
+diff --git a/client/common/compatibility.c b/client/common/compatibility.c
+index 788b413..c7177c2 100644
+--- a/client/common/compatibility.c
++++ b/client/common/compatibility.c
+@@ -118,18 +118,25 @@ void freerdp_client_old_parse_hostname(char* str, char** ServerHostname, UINT32*
+
+ int freerdp_client_old_process_plugin(rdpSettings* settings, ADDIN_ARGV* args)
+ {
++ int args_handled = 0;
+ if (strcmp(args->argv[0], "cliprdr") == 0)
+ {
++ args_handled++;
+ settings->RedirectClipboard = TRUE;
+ fprintf(stderr, "--plugin cliprdr -> +clipboard\n");
+ }
+ else if (strcmp(args->argv[0], "rdpdr") == 0)
+ {
++ args_handled++;
++ if (args->argc < 2)
++ return 1;
++
+ if ((strcmp(args->argv[1], "disk") == 0) ||
+ (strcmp(args->argv[1], "drive") == 0))
+ {
+ freerdp_addin_replace_argument(args, "disk", "drive");
+ freerdp_client_add_device_channel(settings, args->argc - 1, &args->argv[1]);
++ args_handled++;
+ }
+ else if (strcmp(args->argv[1], "printer") == 0)
+ {
+@@ -152,15 +159,29 @@ int freerdp_client_old_process_plugin(rdpSettings* settings, ADDIN_ARGV* args)
+ }
+ else if (strcmp(args->argv[0], "drdynvc") == 0)
+ {
++ args_handled++;
++ if (args->argc < 2)
++ return args_handled;
++
+ freerdp_client_add_dynamic_channel(settings, args->argc - 1, &args->argv[1]);
+ }
+ else if (strcmp(args->argv[0], "rdpsnd") == 0)
+ {
+- freerdp_addin_replace_argument_value(args, args->argv[1], "sys", args->argv[1]);
++ args_handled++;
++ if (args->argc > 2)
++ {
++ args_handled++;
++ freerdp_addin_replace_argument_value(args, args->argv[1], "sys", args->argv[1]);
++ }
+ freerdp_client_add_static_channel(settings, args->argc, args->argv);
+ }
+ else if (strcmp(args->argv[0], "rail") == 0)
+ {
++ args_handled++;
++ if (args->argc < 2)
++ return 1;
++
++ args_handled++;
+ settings->RemoteApplicationProgram = _strdup(args->argv[1]);
+ }
+ else
+@@ -168,14 +189,12 @@ int freerdp_client_old_process_plugin(rdpSettings* settings, ADDIN_ARGV* args)
+ freerdp_client_add_static_channel(settings, args->argc, args->argv);
+ }
+
+- return 1;
++ return args_handled;
+ }
+
+ int freerdp_client_old_command_line_pre_filter(void* context, int index, int argc, LPCSTR* argv)
+ {
+- rdpSettings* settings;
+-
+- settings = (rdpSettings*) context;
++ rdpSettings* settings = (rdpSettings*) context;
+
+ if (index == (argc - 1))
+ {
+@@ -191,6 +210,8 @@ int freerdp_client_old_command_line_pre_filter(void* context, int index, int arg
+ return -1;
+ }
+ freerdp_client_old_parse_hostname((char*) argv[index], &settings->ServerHostname, &settings->ServerPort);
++
++ return 1;
+ }
+ else
+ {
+@@ -215,20 +236,18 @@ int freerdp_client_old_command_line_pre_filter(void* context, int index, int arg
+ return -1;
+
+ args = (ADDIN_ARGV*) malloc(sizeof(ADDIN_ARGV));
+- args->argv = (char**) malloc(sizeof(char*) * 5);
++ args->argv = (char**) calloc(argc, sizeof(char*));
+ args->argc = 1;
+
+- args->argv[0] = _strdup(argv[t]);
+-
+ if ((index < argc - 1) && strcmp("--data", argv[index + 1]) == 0)
+ {
+ i = 0;
+ index += 2;
+- args->argc = 1;
+
+ while ((index < argc) && (strcmp("--", argv[index]) != 0))
+ {
+ args->argc = 1;
++ args->argv[0] = _strdup(argv[t]);
+
+ for (j = 0, p = (char*) argv[index]; (j < 4) && (p != NULL); j++)
+ {
+@@ -250,8 +269,12 @@ int freerdp_client_old_command_line_pre_filter(void* context, int index, int arg
+
+ if (p != NULL)
+ {
+- length = p - a;
+- args->argv[j + 1] = malloc(length + 1);
++ p = strchr(p, ':');
++ }
++ if (p != NULL)
++ {
++ length = (int) (p - a);
++ args->argv[j + 1] = (char*) malloc(length + 1);
+ CopyMemory(args->argv[j + 1], a, length);
+ args->argv[j + 1][length] = '\0';
+ p++;
+@@ -264,20 +287,33 @@ int freerdp_client_old_command_line_pre_filter(void* context, int index, int arg
+ args->argc++;
+ }
+
+- if (settings->instance)
++ if (settings)
+ {
+ freerdp_client_old_process_plugin(settings, args);
+ }
++ for (i = 0; i < args->argc; i++)
++ free(args->argv[i]);
++ memset(args->argv, 0, argc * sizeof(char*));
+
++ for (i = 0; i < args->argc; i++)
++ free(args->argv[i]);
++ memset(args->argv, 0, argc * sizeof(char*));
+ index++;
+ i++;
+ }
+- } else {
+- if (settings->instance)
+- {
+- freerdp_client_old_process_plugin(settings, args);
+- }
+ }
++ else
++ {
++ if (settings)
++ {
++ args->argv[0] = _strdup(argv[t]);
++ freerdp_client_old_process_plugin(settings, args);
++ free (args->argv[0]);
++ }
++ }
++
++ free(args->argv);
++ free(args);
+
+ return (index - old_index);
+ }
+diff --git a/client/common/test/CMakeLists.txt b/client/common/test/CMakeLists.txt
+index b68ac11..06c2c46 100644
+--- a/client/common/test/CMakeLists.txt
++++ b/client/common/test/CMakeLists.txt
+@@ -6,7 +6,9 @@ set(${MODULE_PREFIX}_DRIVER ${MODULE_NAME}.c)
+
+ set(${MODULE_PREFIX}_TESTS
+ TestClientRdpFile.c
+- TestClientChannels.c)
++ TestClientChannels.c
++ TestClientCmdLine.c
++ )
+
+ create_test_sourcelist(${MODULE_PREFIX}_SRCS
+ ${${MODULE_PREFIX}_DRIVER}
+@@ -15,11 +17,16 @@ create_test_sourcelist(${MODULE_PREFIX}_SRCS
+ add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS})
+
+ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} freerdp-client)
++set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD}
++ MODULE freerdp
++ MODULES freerdp-core)
+
+ target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS})
+
+ set_target_properties(${MODULE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TESTING_OUTPUT_DIRECTORY}")
+
++
++
+ foreach(test ${${MODULE_PREFIX}_TESTS})
+ get_filename_component(TestName ${test} NAME_WE)
+ add_test(${TestName} ${TESTING_OUTPUT_DIRECTORY}/${MODULE_NAME} ${TestName})
+diff --git a/client/common/test/TestClientCmdLine.c b/client/common/test/TestClientCmdLine.c
+new file mode 100644
+index 0000000..66fb662
+--- /dev/null
++++ b/client/common/test/TestClientCmdLine.c
+@@ -0,0 +1,113 @@
++#include <freerdp/client.h>
++#include <freerdp/client/cmdline.h>
++#include <freerdp/settings.h>
++#include <winpr/cmdline.h>
++#include <winpr/spec.h>
++
++#define TESTCASE(cmd, expected_return) status = freerdp_client_parse_command_line_arguments(ARRAYSIZE(cmd), cmd, settings); \
++ if (status != expected_return) { \
++ printf("Test argument %s failed\n", #cmd); \
++ return -1; \
++ }
++
++#define TESTCASE_SUCCESS(cmd) status = freerdp_client_parse_command_line_arguments(ARRAYSIZE(cmd), cmd, settings); \
++ if (status < 0) { \
++ printf("Test argument %s failed\n", #cmd); \
++ return -1; \
++ }
++
++int TestClientCmdLine(int argc, char* argv[])
++{
++ int status;
++ rdpSettings* settings = freerdp_settings_new(0);
++
++ char* cmd1[] = {"xfreerdp", "--help"};
++ TESTCASE(cmd1, COMMAND_LINE_STATUS_PRINT_HELP);
++
++ char* cmd2[] = {"xfreerdp", "/help"};
++ TESTCASE(cmd2, COMMAND_LINE_STATUS_PRINT_HELP);
++
++ char* cmd3[] = {"xfreerdp", "-help"};
++ TESTCASE(cmd3, COMMAND_LINE_STATUS_PRINT_HELP);
++
++ char* cmd4[] = {"xfreerdp", "--version"};
++ TESTCASE(cmd4, COMMAND_LINE_STATUS_PRINT_VERSION);
++
++ char* cmd5[] = {"xfreerdp", "/version"};
++ TESTCASE(cmd5, COMMAND_LINE_STATUS_PRINT_VERSION);
++
++ char* cmd6[] = {"xfreerdp", "-version"};
++ TESTCASE(cmd6, COMMAND_LINE_STATUS_PRINT_VERSION);
++
++ char* cmd7[] = {"xfreerdp", "test.freerdp.com"};
++ TESTCASE_SUCCESS(cmd7);
++
++ char* cmd8[] = {"xfreerdp", "-v", "test.freerdp.com"};
++ TESTCASE_SUCCESS(cmd8);
++
++ char* cmd9[] = {"xfreerdp", "--v", "test.freerdp.com"};
++ TESTCASE_SUCCESS(cmd9);
++
++ char* cmd10[] = {"xfreerdp", "/v:test.freerdp.com"};
++ TESTCASE_SUCCESS(cmd10);
++
++ char* cmd11[] = {"xfreerdp", "--plugin", "rdpsnd", "--plugin", "rdpdr", "--data", "disk:media:/tmp", "--", "test.freerdp.com" };
++ TESTCASE_SUCCESS(cmd11);
++
++ char* cmd12[] = {"xfreerdp", "/sound", "/drive:media:/tmp", "/v:test.freerdp.com" };
++ TESTCASE_SUCCESS(cmd12);
++
++ // password gets overwritten therefore it need to be writeable
++ char* cmd13[6] = {"xfreerdp", "-u", "test", "-p", "test", "test.freerdp.com"};
++ cmd13[4] = malloc(5);
++ strncpy(cmd13[4], "test", 4);
++ TESTCASE_SUCCESS(cmd13);
++ free(cmd13[4]);
++
++ char* cmd14[] = {"xfreerdp", "-u", "test", "-p", "test", "-v", "test.freerdp.com"};
++ cmd14[4] = malloc(5);
++ strncpy(cmd14[4], "test", 4);
++ TESTCASE_SUCCESS(cmd14);
++ free(cmd14[4]);
++
++ char* cmd15[] = {"xfreerdp", "/u:test", "/p:test", "/v:test.freerdp.com"};
++ cmd15[2] = malloc(7);
++ strncpy(cmd15[2], "/p:test", 6);
++ TESTCASE_SUCCESS(cmd15);
++ free(cmd15[2]);
++
++#if 0
++ char* cmd16[] = {"xfreerdp", "-invalid"};
++ TESTCASE(cmd16, COMMAND_LINE_ERROR_NO_KEYWORD);
++
++ char* cmd17[] = {"xfreerdp", "--invalid"};
++ TESTCASE(cmd17, COMMAND_LINE_ERROR_NO_KEYWORD);
++#endif
++
++ char* cmd18[] = {"xfreerdp", "/kbd-list"};
++ TESTCASE(cmd18, COMMAND_LINE_STATUS_PRINT);
++
++ char* cmd19[] = {"xfreerdp", "/monitor-list"};
++ TESTCASE(cmd19, COMMAND_LINE_STATUS_PRINT);
++
++ /*
++ * Faulty command misses -- after data and the data for disk is incorrect
++ * This tests was added because it caused a segfault
++ * The command line is "valid" but disk isn't initialized correctly
++ */
++ char* cmd20[] = { "xfreerdp", "-g", "1920x1200", "-d", "domain", "-u", "username", "-D", "-a", "16", "--plugin", "rdpsnd", "--plugin", "rdpdr", "-data", "disk", "media", "/home/username/media/", "-x", "l", "--rfx", "--ignore-certificate", "--plugin", "cliprdr", "some.host.name.com"};
++ TESTCASE_SUCCESS(cmd20);
++
++ /* Command misses -- for data */
++ char* cmd21[] = { "xfreerdp", "-g", "1920x1200", "-d", "domain", "-u", "username", "-D", "-a", "16", "--plugin", "rdpsnd", "--plugin", "rdpdr", "--data", "disk:media:/home/username/media/", "-x", "l", "--rfx", "--ignore-certificate", "--plugin", "cliprdr", "xxx"};
++ TESTCASE_SUCCESS(cmd21);
++ if (settings->ServerHostname && !strcmp(settings->ServerHostname, "xxx")){
++ printf("cmd21 problem - hostname shoudn't be set because -- is missing after data (status %d - %s)", status, settings->ServerHostname);
++ return -1;
++ }
++ char* cmd22[] = { "xfreerdp", "-g", "1920x1200", "-d", "domain", "-u", "username", "-D", "-a", "16", "--plugin", "rdpsnd", "--plugin", "rdpdr", "--data", "disk:media:/home/username/media/", "--", "-x", "l", "--rfx", "--ignore-certificate", "--plugin", "cliprdr", "some.host.name.com"};
++ TESTCASE_SUCCESS(cmd22);
++
++ return 0;
++}
++
diff --git a/0002_handle-old-style-cmdline-options.patch b/0002_handle-old-style-cmdline-options.patch
new file mode 100644
index 000000000000..6fdb52f7dd18
--- /dev/null
+++ b/0002_handle-old-style-cmdline-options.patch
@@ -0,0 +1,64 @@
+From 85856224f63cd6e356a386f096156ff85e2f64e9 Mon Sep 17 00:00:00 2001
+From: Bernhard Miklautz <bernhard.miklautz@thincast.com>
+Date: Tue, 10 Mar 2015 13:10:39 +0100
+Subject: [PATCH] settings: handle collection_add in detection case
+
+Command line detection is run with dummy settings where not everything
+is allocated. Collections (device, dynamic channel and static
+channel) didn't handle this case properly.
+
+(cherry picked from commit e9985c20938954f7df8f57b43c30c74c9d480dde)
+
+Conflicts:
+ client/common/test/TestClientCmdLine.c
+---
+ client/common/test/TestClientCmdLine.c | 5 +++++
+ libfreerdp/common/settings.c | 9 +++++++++
+ 2 files changed, 14 insertions(+)
+
+--- a/client/common/test/TestClientCmdLine.c
++++ b/client/common/test/TestClientCmdLine.c
+@@ -108,6 +108,11 @@
+ char* cmd22[] = { "xfreerdp", "-g", "1920x1200", "-d", "domain", "-u", "username", "-D", "-a", "16", "--plugin", "rdpsnd", "--plugin", "rdpdr", "--data", "disk:media:/home/username/media/", "--", "-x", "l", "--rfx", "--ignore-certificate", "--plugin", "cliprdr", "some.host.name.com"};
+ TESTCASE_SUCCESS(cmd22);
+
++#if 0
++ char* cmd23[] = {"xfreerdp -z --plugin cliprdr --plugin rdpsnd --data alsa latency:100 -- --plugin rdpdr --data disk:w7share:/home/w7share -- --plugin drdynvc --data tsmf:decoder:gstreamer -- -u test host.example.com"};
++ TESTCASE(cmd23, COMMAND_LINE_STATUS_PRINT);
++#endif
++
+ return 0;
+ }
+
+--- a/libfreerdp/common/settings.c
++++ b/libfreerdp/common/settings.c
+@@ -135,6 +135,9 @@
+
+ void freerdp_device_collection_add(rdpSettings* settings, RDPDR_DEVICE* device)
+ {
++ if (!settings->DeviceArray)
++ return;
++
+ if (settings->DeviceArraySize < (settings->DeviceCount + 1))
+ {
+ settings->DeviceArraySize *= 2;
+@@ -204,6 +207,9 @@
+
+ void freerdp_static_channel_collection_add(rdpSettings* settings, ADDIN_ARGV* channel)
+ {
++ if (!settings->StaticChannelArray)
++ return;
++
+ if (settings->StaticChannelArraySize < (settings->StaticChannelCount + 1))
+ {
+ settings->StaticChannelArraySize *= 2;
+@@ -252,6 +258,9 @@
+
+ void freerdp_dynamic_channel_collection_add(rdpSettings* settings, ADDIN_ARGV* channel)
+ {
++ if (!settings->DynamicChannelArray)
++ return;
++
+ if (settings->DynamicChannelArraySize < (settings->DynamicChannelCount + 1))
+ {
+ settings->DynamicChannelArraySize *= 2;
diff --git a/0003_copy-data-when-adding-glyph-to-cache.patch b/0003_copy-data-when-adding-glyph-to-cache.patch
new file mode 100644
index 000000000000..8e553f4d112e
--- /dev/null
+++ b/0003_copy-data-when-adding-glyph-to-cache.patch
@@ -0,0 +1,106 @@
+From daea54925b2e8c7606eb22e65ab6b2397306363b Mon Sep 17 00:00:00 2001
+From: Bernhard Miklautz <bmiklautz@thinstuff.at>
+Date: Tue, 24 Sep 2013 23:25:18 +0200
+Subject: [PATCH] core/glyph: copy data when adding glyph to cache
+
+fixes #2439
+
+(cherry picked from commit c99d9ee72bae06d19a15cce46eb4f3230a97f296)
+---
+ libfreerdp/cache/glyph.c | 15 +++++----------
+ libfreerdp/core/orders.c | 4 ++--
+ libfreerdp/core/update.c | 2 ++
+ 3 files changed, 9 insertions(+), 12 deletions(-)
+
+--- a/libfreerdp/cache/glyph.c
++++ b/libfreerdp/cache/glyph.c
+@@ -279,7 +279,7 @@
+ if (y == -32768)
+ y = fast_glyph->bkTop;
+
+- if (fast_glyph->cbData > 1)
++ if (fast_glyph->cbData > 1 && NULL != fast_glyph->glyphData.aj)
+ {
+ /* got option font that needs to go into cache */
+ glyph_data = &fast_glyph->glyphData;
+@@ -290,7 +290,8 @@
+ glyph->cx = glyph_data->cx;
+ glyph->cy = glyph_data->cy;
+ glyph->cb = glyph_data->cb;
+- glyph->aj = glyph_data->aj;
++ glyph->aj = malloc(glyph_data->cb);
++ CopyMemory(glyph->aj, glyph_data->aj, glyph->cb);
+ Glyph_New(context, glyph);
+
+ glyph_cache_put(cache->glyph, fast_glyph->cacheId, fast_glyph->data[0], glyph);
+@@ -370,16 +371,14 @@
+
+ if (index > glyph_cache->glyphCache[id].number)
+ {
+- fprintf(stderr, "invalid glyph cache index: %d in cache id: %d\n", index, id);
++ fprintf(stderr, "index %d out of range for cache id: %d\n", index, id);
+ return NULL;
+ }
+
+ glyph = glyph_cache->glyphCache[id].entries[index];
+
+ if (glyph == NULL)
+- {
+- fprintf(stderr, "invalid glyph at cache index: %d in cache id: %d\n", index, id);
+- }
++ fprintf(stderr, "no glyph found at cache index: %d in cache id: %d\n", index, id);
+
+ return glyph;
+ }
+@@ -420,9 +419,7 @@
+ *size = (BYTE) glyph_cache->fragCache.entries[index].size;
+
+ if (fragment == NULL)
+- {
+ fprintf(stderr, "invalid glyph fragment at index:%d\n", index);
+- }
+
+ return fragment;
+ }
+@@ -437,9 +434,7 @@
+ glyph_cache->fragCache.entries[index].size = size;
+
+ if (prevFragment != NULL)
+- {
+ free(prevFragment);
+- }
+ }
+
+ void glyph_cache_register_callbacks(rdpUpdate* update)
+--- a/libfreerdp/core/orders.c
++++ b/libfreerdp/core/orders.c
+@@ -485,9 +485,7 @@
+ Stream_Write_UINT8(s, byte);
+ }
+ else
+- {
+ return FALSE;
+- }
+
+ return TRUE;
+ }
+@@ -1670,6 +1668,8 @@
+ if (Stream_GetRemainingLength(s) < glyph->cb)
+ return FALSE;
+
++ if (glyph->aj)
++ free(glyph->aj);
+ glyph->aj = (BYTE*) malloc(glyph->cb);
+ Stream_Read(s, glyph->aj, glyph->cb);
+ }
+--- a/libfreerdp/core/update.c
++++ b/libfreerdp/core/update.c
+@@ -1596,6 +1596,8 @@
+
+ free(update->primary->polyline.points);
+ free(update->primary->polygon_sc.points);
++ if (NULL != update->primary->fast_glyph.glyphData.aj)
++ free(update->primary->fast_glyph.glyphData.aj);
+ free(update->primary);
+
+ free(update->secondary);
diff --git a/0004_build-cmake-3.1-compatibility.patch b/0004_build-cmake-3.1-compatibility.patch
new file mode 100644
index 000000000000..71df3ec5be16
--- /dev/null
+++ b/0004_build-cmake-3.1-compatibility.patch
@@ -0,0 +1,78 @@
+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
+
+Origin: upstream, https://github.com/FreeRDP/FreeRDP/commit/1b663ceffe51008af7ae9749e5b7999b2f7d6698?diff=unified
+
+diff --git a/channels/CMakeLists.txt b/channels/CMakeLists.txt
+index d9e8402..006e50f 100644
+--- a/channels/CMakeLists.txt
++++ b/channels/CMakeLists.txt
+@@ -202,8 +202,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 fc42466..a78cdeb 100644
+--- a/channels/client/CMakeLists.txt
++++ b/channels/client/CMakeLists.txt
+@@ -30,7 +30,9 @@ set(${MODULE_PREFIX}_SRCS
+ ${CMAKE_CURRENT_SOURCE_DIR}/channels.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/channels.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/winpr/libwinpr/CMakeLists.txt b/winpr/libwinpr/CMakeLists.txt
+index fdb2bda..7e1603b 100644
+--- a/winpr/libwinpr/CMakeLists.txt
++++ b/winpr/libwinpr/CMakeLists.txt
+@@ -32,8 +32,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" ${MODULE_PREFIX}_SUBMODULE ${FILEPATH})
++ if(${FILEPATH} MATCHES "^([^/]*)/+${FILENAME}")
++ string(REGEX REPLACE "^([^/]*)/+${FILENAME}" "\\1" ${MODULE_PREFIX}_SUBMODULE ${FILEPATH})
+ set(${MODULE_PREFIX}_SUBMODULES ${${MODULE_PREFIX}_SUBMODULES} ${${MODULE_PREFIX}_SUBMODULE})
+ endif()
+ endforeach(FILEPATH)
diff --git a/0005_release-keys-when-xfreerdp-is-unfocused-to-prevent-s.patch b/0005_release-keys-when-xfreerdp-is-unfocused-to-prevent-s.patch
new file mode 100644
index 000000000000..e45c21c9af0a
--- /dev/null
+++ b/0005_release-keys-when-xfreerdp-is-unfocused-to-prevent-s.patch
@@ -0,0 +1,42 @@
+>From ffa7f0363fa4f0770d0f1ac451d7a5e87d415d7b Mon Sep 17 00:00:00 2001
+From: Seray Rosh <seray.rosh@web.de>
+Date: Fri, 27 Feb 2015 16:02:40 +0100
+Subject: [PATCH] fix #778650: release keys when xfreerdp is unfocused to prevent stuck keys
+
+This fixes https://bugs.debian.org/778650
+Originated from https://github.com/FreeRDP/FreeRDP/pull/2430
+Cherry picked from upstream commit ffa7f0363fa4f0770d0f1ac451d7a5e87d415d7b, ported for debian/1.1.0~git20140921.1.440916e+dfsg1-5
+
+---
+
+Signed-off-by: Petr Vorel <petr.vorel@gmail.com>
+---
+ client/X11/xf_event.c | 1 +
+ client/X11/xf_keyboard.c | 6 ++++++
+ 2 files changed, 7 insertions(+)
+
+--- a/client/X11/xf_event.c
++++ b/client/X11/xf_event.c
+@@ -456,6 +456,7 @@
+ if (event->xfocus.mode == NotifyWhileGrabbed)
+ XUngrabKeyboard(xfc->display, CurrentTime);
+
++ xf_kbd_release_all_keypress(xfc);
+ xf_kbd_clear(xfc);
+
+ if (app)
+--- a/client/X11/xf_keyboard.c
++++ b/client/X11/xf_keyboard.c
+@@ -75,6 +75,12 @@
+ if (xfc->pressed_keys[keycode] != NoSymbol)
+ {
+ rdp_scancode = freerdp_keyboard_get_rdp_scancode_from_x11_keycode(keycode);
++
++ // release tab before releasing the windows key.
++ // this stops the start menu from opening on unfocus event.
++ if (rdp_scancode == RDP_SCANCODE_LWIN)
++ freerdp_input_send_keyboard_event_ex(xfc->instance->input, FALSE, RDP_SCANCODE_TAB);
++
+ freerdp_input_send_keyboard_event_ex(xfc->instance->input, FALSE, rdp_scancode);
+ xfc->pressed_keys[keycode] = NoSymbol;
+ }
diff --git a/0006_fix-null-cert-that-is-not-an-error.patch b/0006_fix-null-cert-that-is-not-an-error.patch
new file mode 100644
index 000000000000..c336c8460ef4
--- /dev/null
+++ b/0006_fix-null-cert-that-is-not-an-error.patch
@@ -0,0 +1,29 @@
+From 603a6378fffd43a67e14ead860bcf9196be6979e Mon Sep 17 00:00:00 2001
+From: Hardening <rdp.effort@gmail.com>
+Date: Wed, 7 May 2014 16:12:38 +0200
+Subject: [PATCH] Fix null certificate that is not an error
+
+v2: Backported to 1.1.0~git20140921.1.440916e+dfsg1-5 by Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+---
+ libfreerdp/core/certificate.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/libfreerdp/core/certificate.c
++++ b/libfreerdp/core/certificate.c
+@@ -568,15 +568,12 @@
+ UINT32 dwVersion;
+ int status = 1;
+
+- if (length < 1)
++ if (length < 4)
+ {
+ DEBUG_CERTIFICATE("null server certificate\n");
+ return 0;
+ }
+
+- if (length < 4)
+- return -1;
+-
+ s = Stream_New(server_cert, length);
+
+ Stream_Read_UINT32(s, dwVersion); /* dwVersion (4 bytes) */
diff --git a/0007_Fix-build-failure-on-x32.patch b/0007_Fix-build-failure-on-x32.patch
new file mode 100644
index 000000000000..2962d69f4bd4
--- /dev/null
+++ b/0007_Fix-build-failure-on-x32.patch
@@ -0,0 +1,32 @@
+>From 15d5037df438e60f2c5439184dbe7ea232cbd100 Mon Sep 17 00:00:00 2001
+From: Adam Borowski <kilobyte@angband.pl>
+Date: Thu, 29 Jan 2015 05:50:12 +0100
+Subject: [PATCH] Fix build failure on x32.
+
+Unlike i386, x32 can't accept -march=i686 but wants -fPIC, same as amd64
+(both are x86_64 ABIs after all). Thus, check for the __x86_64__ define
+instead of pointer width.
+---
+ CMakeLists.txt | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -33,6 +33,7 @@
+ # Include cmake modules
+ include(CheckIncludeFiles)
+ include(CheckLibraryExists)
++include(CheckSymbolExists)
+ include(CheckStructHasMember)
+ include(CMakeDetermineSystem)
+ include(FindPkgConfig)
+@@ -112,7 +113,8 @@
+ # Compiler-specific flags
+ if(CMAKE_COMPILER_IS_GNUCC)
+ if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
+- if(CMAKE_SIZEOF_VOID_P EQUAL 8)
++ CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
++ if(IS_X86_64)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
+ else()
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
diff --git a/0008-Fix-multiple-security-issues.patch b/0008-Fix-multiple-security-issues.patch
new file mode 100644
index 000000000000..df9004bfe45e
--- /dev/null
+++ b/0008-Fix-multiple-security-issues.patch
@@ -0,0 +1,756 @@
+From 03ab68318966c3a22935a02838daaea7b7fbe96c Mon Sep 17 00:00:00 2001
+From: Bernhard Miklautz <bernhard.miklautz@thincast.com>
+Date: Thu, 27 Jul 2017 13:24:37 +0200
+Subject: [PATCH] Fix multiple security issues
+
+Fix the following issues identified by the CISCO TALOS project:
+
+* TALOS-2017-0336 CVE-2017-2834
+* TALOS-2017-0337 CVE-2017-2835
+* TALOS-2017-0338 CVE-2017-2836
+* TALOS-2017-0339 CVE-2017-2837
+* TALOS-2017-0340 CVE-2017-2838
+* TALOS-2017-0341 CVE-2017-2839
+
+Backported based on commit 8292b4558f0684065ce1f58db7783cc426099223.
+---
+ libfreerdp/core/capabilities.c | 4 +--
+ libfreerdp/core/certificate.c | 18 ++++++++-----
+ libfreerdp/core/certificate.h | 2 +-
+ libfreerdp/core/connection.c | 17 ++++++------
+ libfreerdp/core/gcc.c | 60 ++++++++++++++++++++++++------------------
+ libfreerdp/core/info.c | 4 +--
+ libfreerdp/core/license.c | 39 ++++++++++++++++++++-------
+ libfreerdp/core/mcs.c | 17 +++++++++---
+ libfreerdp/core/nego.c | 8 +++---
+ libfreerdp/core/peer.c | 4 +--
+ libfreerdp/core/rdp.c | 37 ++++++++++++++++++++------
+ libfreerdp/core/rdp.h | 4 +--
+ libfreerdp/core/security.c | 12 ++++-----
+ libfreerdp/core/security.h | 12 ++++-----
+ libfreerdp/core/surface.c | 2 +-
+ libfreerdp/core/tpkt.c | 22 ++++++++++++----
+ libfreerdp/core/tpkt.h | 2 +-
+ libfreerdp/core/transport.c | 6 ++++-
+ 18 files changed, 174 insertions(+), 96 deletions(-)
+
+diff --git a/libfreerdp/core/capabilities.c b/libfreerdp/core/capabilities.c
+index 4d69b4e..0e3b0de 100644
+--- a/libfreerdp/core/capabilities.c
++++ b/libfreerdp/core/capabilities.c
+@@ -3341,12 +3341,12 @@ BOOL rdp_recv_get_active_header(rdpRdp* rdp, wStream* s, UINT16* pChannelId)
+
+ if (rdp->settings->DisableEncryption)
+ {
+- if (!rdp_read_security_header(s, &securityFlags))
++ if (!rdp_read_security_header(s, &securityFlags, &length))
+ return FALSE;
+
+ if (securityFlags & SEC_ENCRYPT)
+ {
+- if (!rdp_decrypt(rdp, s, length - 4, securityFlags))
++ if (!rdp_decrypt(rdp, s, length, securityFlags))
+ {
+ fprintf(stderr, "rdp_decrypt failed\n");
+ return FALSE;
+diff --git a/libfreerdp/core/certificate.c b/libfreerdp/core/certificate.c
+index 6a28ab3..9a36abe 100644
+--- a/libfreerdp/core/certificate.c
++++ b/libfreerdp/core/certificate.c
+@@ -327,10 +327,10 @@ static BOOL certificate_process_server_public_key(rdpCertificate* certificate, w
+ UINT32 keylen;
+ UINT32 bitlen;
+ UINT32 datalen;
+- UINT32 modlen;
+
+ if (Stream_GetRemainingLength(s) < 20)
+ return FALSE;
++
+ Stream_Read(s, magic, 4);
+
+ if (memcmp(magic, "RSA1", 4) != 0)
+@@ -343,12 +343,16 @@ static BOOL certificate_process_server_public_key(rdpCertificate* certificate, w
+ Stream_Read_UINT32(s, bitlen);
+ Stream_Read_UINT32(s, datalen);
+ Stream_Read(s, certificate->cert_info.exponent, 4);
+- modlen = keylen - 8;
+
+- if (Stream_GetRemainingLength(s) < modlen + 8) // count padding
++ if ((keylen <= 8) || (Stream_GetRemainingLength(s) < keylen))
+ return FALSE;
+- certificate->cert_info.ModulusLength = modlen;
++
++ certificate->cert_info.ModulusLength = keylen - 8;
+ certificate->cert_info.Modulus = malloc(certificate->cert_info.ModulusLength);
++
++ if (!certificate->cert_info.Modulus)
++ return FALSE;
++
+ Stream_Read(s, certificate->cert_info.Modulus, certificate->cert_info.ModulusLength);
+ /* 8 bytes of zero padding */
+ Stream_Seek(s, 8);
+@@ -500,7 +504,7 @@ BOOL certificate_read_server_proprietary_certificate(rdpCertificate* certificate
+
+ BOOL certificate_read_server_x509_certificate_chain(rdpCertificate* certificate, wStream* s)
+ {
+- int i;
++ UINT32 i;
+ UINT32 certLength;
+ UINT32 numCertBlobs;
+ BOOL ret;
+@@ -513,7 +517,7 @@ BOOL certificate_read_server_x509_certificate_chain(rdpCertificate* certificate,
+
+ certificate->x509_cert_chain = certificate_new_x509_certificate_chain(numCertBlobs);
+
+- for (i = 0; i < (int) numCertBlobs; i++)
++ for (i = 0; i < numCertBlobs; i++)
+ {
+ if (Stream_GetRemainingLength(s) < 4)
+ return FALSE;
+@@ -562,7 +566,7 @@ BOOL certificate_read_server_x509_certificate_chain(rdpCertificate* certificate,
+ * @param length certificate length
+ */
+
+-int certificate_read_server_certificate(rdpCertificate* certificate, BYTE* server_cert, int length)
++int certificate_read_server_certificate(rdpCertificate* certificate, BYTE* server_cert, size_t length)
+ {
+ wStream* s;
+ UINT32 dwVersion;
+diff --git a/libfreerdp/core/certificate.h b/libfreerdp/core/certificate.h
+index 5008bb4..fb818f5 100644
+--- a/libfreerdp/core/certificate.h
++++ b/libfreerdp/core/certificate.h
+@@ -50,7 +50,7 @@ void certificate_free_x509_certificate_chain(rdpX509CertChain* x509_cert_chain);
+
+ BOOL certificate_read_server_proprietary_certificate(rdpCertificate* certificate, wStream* s);
+ BOOL certificate_read_server_x509_certificate_chain(rdpCertificate* certificate, wStream* s);
+-int certificate_read_server_certificate(rdpCertificate* certificate, BYTE* server_cert, int length);
++int certificate_read_server_certificate(rdpCertificate* certificate, BYTE* server_cert, size_t length);
+
+ rdpCertificate* certificate_new(void);
+ void certificate_free(rdpCertificate* certificate);
+diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c
+index 9c4c3d7..7e6b2bd 100644
+--- a/libfreerdp/core/connection.c
++++ b/libfreerdp/core/connection.c
+@@ -77,19 +77,18 @@ BOOL rdp_client_connect(rdpRdp* rdp)
+
+ if (settings->GatewayEnabled)
+ {
+- char* user;
++ char* user = NULL;
+ char* domain;
+ char* cookie;
+- int user_length = 0;
++ int user_length = 0;
+ int domain_length;
+ int cookie_length;
+
+-
+- if (settings->Username)
+- {
+- user = settings->Username;
+- user_length = strlen(settings->Username);
+- }
++ if (settings->Username)
++ {
++ user = settings->Username;
++ user_length = strlen(settings->Username);
++ }
+
+ if (settings->Domain)
+ domain = settings->Domain;
+@@ -365,7 +364,7 @@ static BOOL rdp_server_establish_keys(rdpRdp* rdp, wStream* s)
+ return FALSE;
+ }
+
+- if (!rdp_read_security_header(s, &sec_flags))
++ if (!rdp_read_security_header(s, &sec_flags, NULL))
+ return FALSE;
+
+ if ((sec_flags & SEC_EXCHANGE_PKT) == 0)
+diff --git a/libfreerdp/core/gcc.c b/libfreerdp/core/gcc.c
+index 316f4f9..27def74 100644
+--- a/libfreerdp/core/gcc.c
++++ b/libfreerdp/core/gcc.c
+@@ -830,6 +830,7 @@ BOOL gcc_read_server_security_data(wStream* s, rdpSettings* settings)
+
+ if (Stream_GetRemainingLength(s) < 8)
+ return FALSE;
++
+ Stream_Read_UINT32(s, settings->EncryptionMethods); /* encryptionMethod */
+ Stream_Read_UINT32(s, settings->EncryptionLevel); /* encryptionLevel */
+
+@@ -844,43 +845,50 @@ BOOL gcc_read_server_security_data(wStream* s, rdpSettings* settings)
+
+ if (Stream_GetRemainingLength(s) < 8)
+ return FALSE;
++
+ Stream_Read_UINT32(s, settings->ServerRandomLength); /* serverRandomLen */
+ Stream_Read_UINT32(s, settings->ServerCertificateLength); /* serverCertLen */
+
+- if (Stream_GetRemainingLength(s) < settings->ServerRandomLength + settings->ServerCertificateLength)
++ if (settings->ServerRandomLength == 0 || settings->ServerCertificateLength == 0)
+ return FALSE;
+
+- if (settings->ServerRandomLength > 0)
+- {
+- /* serverRandom */
+- settings->ServerRandom = (BYTE*) malloc(settings->ServerRandomLength);
+- Stream_Read(s, settings->ServerRandom, settings->ServerRandomLength);
+- }
+- else
+- {
++ if (Stream_GetRemainingLength(s) < settings->ServerRandomLength)
+ return FALSE;
+- }
+
+- if (settings->ServerCertificateLength > 0)
+- {
+- /* serverCertificate */
+- settings->ServerCertificate = (BYTE*) malloc(settings->ServerCertificateLength);
+- Stream_Read(s, settings->ServerCertificate, settings->ServerCertificateLength);
++ /* serverRandom */
++ settings->ServerRandom = (BYTE*) malloc(settings->ServerRandomLength);
++ if (!settings->ServerRandom)
++ return FALSE;
++ Stream_Read(s, settings->ServerRandom, settings->ServerRandomLength);
+
+- certificate_free(settings->RdpServerCertificate);
+- settings->RdpServerCertificate = certificate_new();
+- data = settings->ServerCertificate;
+- length = settings->ServerCertificateLength;
++ /* serverCertificate */
++ if(Stream_GetRemainingLength(s) < settings->ServerCertificateLength)
++ goto out_fail1;
++ settings->ServerCertificate = (BYTE*) malloc(settings->ServerCertificateLength);
++ if (!settings->ServerCertificate)
++ goto out_fail1;
+
+- if (certificate_read_server_certificate(settings->RdpServerCertificate, data, length) < 1)
+- return FALSE;
+- }
+- else
+- {
+- return FALSE;
+- }
++ Stream_Read(s, settings->ServerCertificate, settings->ServerCertificateLength);
++ certificate_free(settings->RdpServerCertificate);
++ settings->RdpServerCertificate = certificate_new();
++ if (!settings->RdpServerCertificate)
++ goto out_fail2;
++
++ data = settings->ServerCertificate;
++ length = settings->ServerCertificateLength;
++
++ if (certificate_read_server_certificate(settings->RdpServerCertificate, data, length) < 1)
++ goto out_fail2;
+
+ return TRUE;
++
++ out_fail2:
++ free(settings->ServerCertificate);
++ settings->ServerCertificate = NULL;
++ out_fail1:
++ free(settings->ServerRandom);
++ settings->ServerRandom = NULL;
++ return FALSE;
+ }
+
+ static const BYTE initial_signature[] =
+diff --git a/libfreerdp/core/info.c b/libfreerdp/core/info.c
+index 11435ef..7717731 100644
+--- a/libfreerdp/core/info.c
++++ b/libfreerdp/core/info.c
+@@ -441,7 +441,7 @@ BOOL rdp_recv_client_info(rdpRdp* rdp, wStream* s)
+ if (!rdp_read_header(rdp, s, &length, &channelId))
+ return FALSE;
+
+- if (!rdp_read_security_header(s, &securityFlags))
++ if (!rdp_read_security_header(s, &securityFlags, &length))
+ return FALSE;
+
+ if ((securityFlags & SEC_INFO_PKT) == 0)
+@@ -457,7 +457,7 @@ BOOL rdp_recv_client_info(rdpRdp* rdp, wStream* s)
+
+ if (securityFlags & SEC_ENCRYPT)
+ {
+- if (!rdp_decrypt(rdp, s, length - 4, securityFlags))
++ if (!rdp_decrypt(rdp, s, length, securityFlags))
+ {
+ fprintf(stderr, "rdp_decrypt failed\n");
+ return FALSE;
+diff --git a/libfreerdp/core/license.c b/libfreerdp/core/license.c
+index 88d039e..40bb150 100644
+--- a/libfreerdp/core/license.c
++++ b/libfreerdp/core/license.c
+@@ -240,12 +240,12 @@ BOOL license_recv(rdpLicense* license, wStream* s)
+ return FALSE;
+ }
+
+- if (!rdp_read_security_header(s, &securityFlags))
++ if (!rdp_read_security_header(s, &securityFlags, &length))
+ return FALSE;
+
+ if (securityFlags & SEC_ENCRYPT)
+ {
+- if (!rdp_decrypt(license->rdp, s, length - 4, securityFlags))
++ if (!rdp_decrypt(license->rdp, s, length, securityFlags))
+ {
+ fprintf(stderr, "rdp_decrypt failed\n");
+ return FALSE;
+@@ -474,25 +474,41 @@ BOOL license_read_product_info(wStream* s, PRODUCT_INFO* productInfo)
+
+ Stream_Read_UINT32(s, productInfo->cbCompanyName); /* cbCompanyName (4 bytes) */
+
+- if (Stream_GetRemainingLength(s) < productInfo->cbCompanyName + 4)
++ /* Name must be > 0, but there is no upper limit defined, use UINT32_MAX */
++ if ((productInfo->cbCompanyName < 2) || (productInfo->cbCompanyName % 2 != 0))
++ return FALSE;
++
++ if (Stream_GetRemainingLength(s) < productInfo->cbCompanyName)
+ return FALSE;
+
+ productInfo->pbCompanyName = (BYTE*) malloc(productInfo->cbCompanyName);
++ if (!productInfo->pbCompanyName)
++ return FALSE;
+ Stream_Read(s, productInfo->pbCompanyName, productInfo->cbCompanyName);
+
++ if (Stream_GetRemainingLength(s) < 4)
++ goto out_fail;
++
+ Stream_Read_UINT32(s, productInfo->cbProductId); /* cbProductId (4 bytes) */
+
++ if ((productInfo->cbProductId < 2) || (productInfo->cbProductId % 2 != 0))
++ goto out_fail;
++
+ if (Stream_GetRemainingLength(s) < productInfo->cbProductId)
+- {
+- free(productInfo->pbCompanyName);
+- productInfo->pbCompanyName = NULL;
+- return FALSE;
+- }
++ goto out_fail;
+
+ productInfo->pbProductId = (BYTE*) malloc(productInfo->cbProductId);
+- Stream_Read(s, productInfo->pbProductId, productInfo->cbProductId);
++ if (!productInfo->pbProductId)
++ goto out_fail;
+
++ Stream_Read(s, productInfo->pbProductId, productInfo->cbProductId);
+ return TRUE;
++
++ out_fail:
++ free(productInfo->pbCompanyName);
++ productInfo->pbCompanyName = NULL;
++ return FALSE;
++
+ }
+
+ /**
+@@ -796,7 +812,10 @@ BOOL license_read_platform_challenge_packet(rdpLicense* license, wStream* s)
+
+ /* EncryptedPlatformChallenge */
+ license->EncryptedPlatformChallenge->type = BB_ANY_BLOB;
+- license_read_binary_blob(s, license->EncryptedPlatformChallenge);
++
++ if (!license_read_binary_blob(s, license->EncryptedPlatformChallenge))
++ return FALSE;
++
+ license->EncryptedPlatformChallenge->type = BB_ENCRYPTED_DATA_BLOB;
+
+ if (Stream_GetRemainingLength(s) < 16)
+diff --git a/libfreerdp/core/mcs.c b/libfreerdp/core/mcs.c
+index d5ea089..16cf88e 100644
+--- a/libfreerdp/core/mcs.c
++++ b/libfreerdp/core/mcs.c
+@@ -197,7 +197,8 @@ BOOL mcs_read_domain_mcspdu_header(wStream* s, enum DomainMCSPDU* domainMCSPDU,
+ BYTE choice;
+ enum DomainMCSPDU MCSPDU;
+
+- *length = tpkt_read_header(s);
++ if (!tpkt_read_header(s, length))
++ return FALSE;
+
+ if (!tpdu_read_data(s, &li))
+ return FALSE;
+@@ -332,8 +333,13 @@ BOOL mcs_recv_connect_initial(rdpMcs* mcs, wStream* s)
+ UINT16 li;
+ int length;
+ BOOL upwardFlag;
++ UINT16 tlength;
++
++ if (!mcs || !s)
++ return FALSE;
+
+- tpkt_read_header(s);
++ if (!tpkt_read_header(s, &tlength))
++ return FALSE;
+
+ if (!tpdu_read_data(s, &li))
+ return FALSE;
+@@ -504,8 +510,13 @@ BOOL mcs_recv_connect_response(rdpMcs* mcs, wStream* s)
+ BYTE result;
+ UINT16 li;
+ UINT32 calledConnectId;
++ UINT16 tlength;
+
+- tpkt_read_header(s);
++ if (!mcs || !s)
++ return FALSE;
++
++ if (!tpkt_read_header(s, &tlength))
++ return FALSE;
+
+ if (!tpdu_read_data(s, &li))
+ return FALSE;
+diff --git a/libfreerdp/core/nego.c b/libfreerdp/core/nego.c
+index 6148e86..bc77eb3 100644
+--- a/libfreerdp/core/nego.c
++++ b/libfreerdp/core/nego.c
+@@ -506,9 +506,7 @@ int nego_recv(rdpTransport* transport, wStream* s, void* extra)
+ UINT16 length;
+ rdpNego* nego = (rdpNego*) extra;
+
+- length = tpkt_read_header(s);
+-
+- if (length == 0)
++ if (!tpkt_read_header(s, &length) || length == 0)
+ return -1;
+
+ if (!tpdu_read_connection_confirm(s, &li))
+@@ -582,8 +580,10 @@ BOOL nego_read_request(rdpNego* nego, wStream* s)
+ BYTE li;
+ BYTE c;
+ BYTE type;
++ UINT16 length;
+
+- tpkt_read_header(s);
++ if (!tpkt_read_header(s, &length))
++ return FALSE;
+
+ if (!tpdu_read_connection_request(s, &li))
+ return FALSE;
+diff --git a/libfreerdp/core/peer.c b/libfreerdp/core/peer.c
+index eb4ad60..b9bad7e 100644
+--- a/libfreerdp/core/peer.c
++++ b/libfreerdp/core/peer.c
+@@ -179,12 +179,12 @@ static int peer_recv_tpkt_pdu(freerdp_peer* client, wStream* s)
+
+ if (rdp->settings->DisableEncryption)
+ {
+- if (!rdp_read_security_header(s, &securityFlags))
++ if (!rdp_read_security_header(s, &securityFlags, &length))
+ return -1;
+
+ if (securityFlags & SEC_ENCRYPT)
+ {
+- if (!rdp_decrypt(rdp, s, length - 4, securityFlags))
++ if (!rdp_decrypt(rdp, s, length, securityFlags))
+ {
+ fprintf(stderr, "rdp_decrypt failed\n");
+ return -1;
+diff --git a/libfreerdp/core/rdp.c b/libfreerdp/core/rdp.c
+index 1a4704d..bb35bd9 100644
+--- a/libfreerdp/core/rdp.c
++++ b/libfreerdp/core/rdp.c
+@@ -77,13 +77,17 @@ static const char* const DATA_PDU_TYPE_STRINGS[] =
+ * @param flags security flags
+ */
+
+-BOOL rdp_read_security_header(wStream* s, UINT16* flags)
++BOOL rdp_read_security_header(wStream* s, UINT16* flags, UINT16* length)
+ {
+ /* Basic Security Header */
+- if (Stream_GetRemainingLength(s) < 4)
++ if (Stream_GetRemainingLength(s) < 4 || (length && (*length < 4)))
+ return FALSE;
+ Stream_Read_UINT16(s, *flags); /* flags */
+ Stream_Seek(s, 2); /* flagsHi (unused) */
++
++ if (length)
++ *length -= 4;
++
+ return TRUE;
+ }
+
+@@ -249,6 +253,9 @@ BOOL rdp_read_header(rdpRdp* rdp, wStream* s, UINT16* length, UINT16* channel_id
+ return FALSE;
+ }
+
++ if (*length < 8)
++ return FALSE;
++
+ if (*length - 8 > Stream_GetRemainingLength(s))
+ return FALSE;
+
+@@ -273,8 +280,12 @@ BOOL rdp_read_header(rdpRdp* rdp, wStream* s, UINT16* length, UINT16* channel_id
+ if (Stream_GetRemainingLength(s) < 5)
+ return FALSE;
+
+- per_read_integer16(s, &initiator, MCS_BASE_CHANNEL_ID); /* initiator (UserId) */
+- per_read_integer16(s, channel_id, 0); /* channelId */
++ if (!per_read_integer16(s, &initiator, MCS_BASE_CHANNEL_ID)) /* initiator (UserId) */
++ return FALSE;
++
++ if (!per_read_integer16(s, channel_id, 0)) /* channelId */
++ return FALSE;
++
+ Stream_Seek(s, 1); /* dataPriority + Segmentation (0x70) */
+
+ if (!per_read_length(s, length)) /* userData (OCTET_STRING) */
+@@ -701,16 +712,20 @@ BOOL rdp_recv_out_of_sequence_pdu(rdpRdp* rdp, wStream* s)
+ * @param length int
+ */
+
+-BOOL rdp_decrypt(rdpRdp* rdp, wStream* s, int length, UINT16 securityFlags)
++BOOL rdp_decrypt(rdpRdp* rdp, wStream* s, INT32 length, UINT16 securityFlags)
+ {
+ BYTE cmac[8];
+ BYTE wmac[8];
+
++ if (!rdp || !s || length < 0)
++ return FALSE;
++
+ if (rdp->settings->EncryptionMethods == ENCRYPTION_METHOD_FIPS)
+ {
+ UINT16 len;
+ BYTE version, pad;
+ BYTE* sig;
++ INT64 padLength;
+
+ if (Stream_GetRemainingLength(s) < 12)
+ return FALSE;
+@@ -723,6 +738,10 @@ BOOL rdp_decrypt(rdpRdp* rdp, wStream* s, int length, UINT16 securityFlags)
+ Stream_Seek(s, 8); /* signature */
+
+ length -= 12;
++ padLength = length - pad;
++
++ if (length <= 0 || padLength <= 0)
++ return FALSE;
+
+ if (!security_fips_decrypt(Stream_Pointer(s), length, rdp))
+ {
+@@ -741,11 +760,13 @@ BOOL rdp_decrypt(rdpRdp* rdp, wStream* s, int length, UINT16 securityFlags)
+ return TRUE;
+ }
+
+- if (Stream_GetRemainingLength(s) < 8)
++ if (Stream_GetRemainingLength(s) < sizeof(wmac))
+ return FALSE;
+
+ Stream_Read(s, wmac, sizeof(wmac));
+ length -= sizeof(wmac);
++ if (length <= 0)
++ return FALSE;
+
+ if (!security_decrypt(Stream_Pointer(s), length, rdp))
+ return FALSE;
+@@ -795,12 +816,12 @@ static int rdp_recv_tpkt_pdu(rdpRdp* rdp, wStream* s)
+
+ if (rdp->settings->DisableEncryption)
+ {
+- if (!rdp_read_security_header(s, &securityFlags))
++ if (!rdp_read_security_header(s, &securityFlags, &length))
+ return -1;
+
+ if (securityFlags & (SEC_ENCRYPT | SEC_REDIRECTION_PKT))
+ {
+- if (!rdp_decrypt(rdp, s, length - 4, securityFlags))
++ if (!rdp_decrypt(rdp, s, length, securityFlags))
+ {
+ fprintf(stderr, "rdp_decrypt failed\n");
+ return -1;
+diff --git a/libfreerdp/core/rdp.h b/libfreerdp/core/rdp.h
+index fc73026..7bcfc27 100644
+--- a/libfreerdp/core/rdp.h
++++ b/libfreerdp/core/rdp.h
+@@ -160,7 +160,7 @@ struct rdp_rdp
+ BOOL deactivation_reactivation;
+ };
+
+-BOOL rdp_read_security_header(wStream* s, UINT16* flags);
++BOOL rdp_read_security_header(wStream* s, UINT16* flags, UINT16* length);
+ void rdp_write_security_header(wStream* s, UINT16 flags);
+
+ BOOL rdp_read_share_control_header(wStream* s, UINT16* length, UINT16* type, UINT16* channel_id);
+@@ -202,6 +202,6 @@ void rdp_free(rdpRdp* rdp);
+ #define DEBUG_RDP(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+ #endif
+
+-BOOL rdp_decrypt(rdpRdp* rdp, wStream* s, int length, UINT16 securityFlags);
++BOOL rdp_decrypt(rdpRdp* rdp, wStream* s, INT32 length, UINT16 securityFlags);
+
+ #endif /* __RDP_H */
+diff --git a/libfreerdp/core/security.c b/libfreerdp/core/security.c
+index 5684528..dc9b2fc 100644
+--- a/libfreerdp/core/security.c
++++ b/libfreerdp/core/security.c
+@@ -475,7 +475,7 @@ BOOL security_key_update(BYTE* key, BYTE* update_key, int key_len)
+ return TRUE;
+ }
+
+-BOOL security_encrypt(BYTE* data, int length, rdpRdp* rdp)
++BOOL security_encrypt(BYTE* data, size_t length, rdpRdp* rdp)
+ {
+ if (rdp->encrypt_use_count >= 4096)
+ {
+@@ -490,7 +490,7 @@ BOOL security_encrypt(BYTE* data, int length, rdpRdp* rdp)
+ return TRUE;
+ }
+
+-BOOL security_decrypt(BYTE* data, int length, rdpRdp* rdp)
++BOOL security_decrypt(BYTE* data, size_t length, rdpRdp* rdp)
+ {
+ if (rdp->rc4_decrypt_key == NULL)
+ return FALSE;
+@@ -507,7 +507,7 @@ BOOL security_decrypt(BYTE* data, int length, rdpRdp* rdp)
+ return TRUE;
+ }
+
+-void security_hmac_signature(const BYTE* data, int length, BYTE* output, rdpRdp* rdp)
++void security_hmac_signature(const BYTE* data, size_t length, BYTE* output, rdpRdp* rdp)
+ {
+ BYTE buf[20];
+ BYTE use_count_le[4];
+@@ -522,20 +522,20 @@ void security_hmac_signature(const BYTE* data, int length, BYTE* output, rdpRdp*
+ memmove(output, buf, 8);
+ }
+
+-BOOL security_fips_encrypt(BYTE* data, int length, rdpRdp* rdp)
++BOOL security_fips_encrypt(BYTE* data, size_t length, rdpRdp* rdp)
+ {
+ crypto_des3_encrypt(rdp->fips_encrypt, length, data, data);
+ rdp->encrypt_use_count++;
+ return TRUE;
+ }
+
+-BOOL security_fips_decrypt(BYTE* data, int length, rdpRdp* rdp)
++BOOL security_fips_decrypt(BYTE* data, size_t length, rdpRdp* rdp)
+ {
+ crypto_des3_decrypt(rdp->fips_decrypt, length, data, data);
+ return TRUE;
+ }
+
+-BOOL security_fips_check_signature(const BYTE* data, int length, const BYTE* sig, rdpRdp* rdp)
++BOOL security_fips_check_signature(const BYTE* data, size_t length, const BYTE* sig, rdpRdp* rdp)
+ {
+ BYTE buf[20];
+ BYTE use_count_le[4];
+diff --git a/libfreerdp/core/security.h b/libfreerdp/core/security.h
+index ffcebdf..c6b6038 100644
+--- a/libfreerdp/core/security.h
++++ b/libfreerdp/core/security.h
+@@ -37,12 +37,12 @@ void security_mac_signature(rdpRdp *rdp, const BYTE* data, UINT32 length, BYTE*
+ void security_salted_mac_signature(rdpRdp *rdp, const BYTE* data, UINT32 length, BOOL encryption, BYTE* output);
+ BOOL security_establish_keys(const BYTE* client_random, rdpRdp* rdp);
+
+-BOOL security_encrypt(BYTE* data, int length, rdpRdp* rdp);
+-BOOL security_decrypt(BYTE* data, int length, rdpRdp* rdp);
++BOOL security_encrypt(BYTE* data, size_t length, rdpRdp* rdp);
++BOOL security_decrypt(BYTE* data, size_t length, rdpRdp* rdp);
+
+-void security_hmac_signature(const BYTE* data, int length, BYTE* output, rdpRdp* rdp);
+-BOOL security_fips_encrypt(BYTE* data, int length, rdpRdp* rdp);
+-BOOL security_fips_decrypt(BYTE* data, int length, rdpRdp* rdp);
+-BOOL security_fips_check_signature(const BYTE* data, int length, const BYTE* sig, rdpRdp* rdp);
++void security_hmac_signature(const BYTE* data, size_t length, BYTE* output, rdpRdp* rdp);
++BOOL security_fips_encrypt(BYTE* data, size_t length, rdpRdp* rdp);
++BOOL security_fips_decrypt(BYTE* data, size_t length, rdpRdp* rdp);
++BOOL security_fips_check_signature(const BYTE* data, size_t length, const BYTE* sig, rdpRdp* rdp);
+
+ #endif /* __SECURITY_H */
+diff --git a/libfreerdp/core/surface.c b/libfreerdp/core/surface.c
+index 992a3dd..15b2257 100644
+--- a/libfreerdp/core/surface.c
++++ b/libfreerdp/core/surface.c
+@@ -85,7 +85,7 @@ int update_recv_surfcmds(rdpUpdate* update, UINT32 size, wStream* s)
+ {
+ BYTE* mark;
+ UINT16 cmdType;
+- UINT32 cmdLength;
++ UINT32 cmdLength = 0;
+
+ while (size > 2)
+ {
+diff --git a/libfreerdp/core/tpkt.c b/libfreerdp/core/tpkt.c
+index 5689d62..900e288 100644
+--- a/libfreerdp/core/tpkt.c
++++ b/libfreerdp/core/tpkt.c
+@@ -81,25 +81,37 @@ BOOL tpkt_verify_header(wStream* s)
+ * @return length
+ */
+
+-UINT16 tpkt_read_header(wStream* s)
++BOOL tpkt_read_header(wStream* s, UINT16* length)
+ {
+ BYTE version;
+- UINT16 length;
++
++ if (Stream_GetRemainingLength(s) < 1)
++ return FALSE;
+
+ Stream_Peek_UINT8(s, version);
+
+ if (version == 3)
+ {
++ UINT16 len;
++
++ if (Stream_GetRemainingLength(s) < 4)
++ return FALSE;
++
+ Stream_Seek(s, 2);
+- Stream_Read_UINT16_BE(s, length);
++ Stream_Read_UINT16_BE(s, len);
++
++ if (len < 4)
++ return FALSE;
++
++ *length = len;
+ }
+ else
+ {
+ /* not a TPKT header */
+- length = 0;
++ *length = 0;
+ }
+
+- return length;
++ return TRUE;
+ }
+
+ /**
+diff --git a/libfreerdp/core/tpkt.h b/libfreerdp/core/tpkt.h
+index af984c1..9b51749 100644
+--- a/libfreerdp/core/tpkt.h
++++ b/libfreerdp/core/tpkt.h
+@@ -28,7 +28,7 @@
+ #define TPKT_HEADER_LENGTH 4
+
+ BOOL tpkt_verify_header(wStream* s);
+-UINT16 tpkt_read_header(wStream* s);
++BOOL tpkt_read_header(wStream* s, UINT16* length);
+ void tpkt_write_header(wStream* s, UINT16 length);
+
+ #endif /* __TPKT_H */
+diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c
+index 0f29c6c..bc45dc8 100644
+--- a/libfreerdp/core/transport.c
++++ b/libfreerdp/core/transport.c
+@@ -673,7 +673,11 @@ int transport_check_fds(rdpTransport** ptransport)
+ return 0;
+ }
+
+- length = tpkt_read_header(transport->ReceiveBuffer);
++ if (!tpkt_read_header(transport->ReceiveBuffer, &length))
++ {
++ fprintf(stderr, "transport_check_fds: problem reading tpkt header.\n");
++ return -1;
++ }
+ }
+ else if (nla_verify_header(transport->ReceiveBuffer))
+ {
+--
+2.1.4
+
diff --git a/0009-enable-TLS-12.patch b/0009-enable-TLS-12.patch
new file mode 100644
index 000000000000..50c63bba77cd
--- /dev/null
+++ b/0009-enable-TLS-12.patch
@@ -0,0 +1,38 @@
+From 3ba81cbd5a59434f3053665e9fc4a432afd0db20 Mon Sep 17 00:00:00 2001
+From: Bernhard Miklautz <bernhard.miklautz@shacknet.at>
+Date: Thu, 10 Aug 2017 09:31:21 +0200
+Subject: [PATCH 1/1] enable TLS 1+
+
+Currently TLS version 1.0 is used implicitly by using the TLSv1_method.
+To be able to also use TLS 1.1 and later use SSLv23_client_method
+instead. To make sure SSLv2 or SSLv3 isn't used disable them.
+
+cherry-picked from aa80f63b4ab19101cbdc376f7e0613ed410fee11
+---
+ libfreerdp/crypto/tls.c | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+--- a/libfreerdp/crypto/tls.c
++++ b/libfreerdp/crypto/tls.c
+@@ -102,7 +102,7 @@
+ int connection_status;
+ char *hostname;
+
+- tls->ctx = SSL_CTX_new(TLSv1_client_method());
++ tls->ctx = SSL_CTX_new(SSLv23_client_method());
+
+ if (tls->ctx == NULL)
+ {
+@@ -141,6 +141,12 @@
+ */
+ options |= SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS;
+
++ /**
++ * disable SSLv2 and SSLv3
++ */
++ options |= SSL_OP_NO_SSLv2;
++ options |= SSL_OP_NO_SSLv3;
++
+ SSL_CTX_set_options(tls->ctx, options);
+
+ tls->ssl = SSL_new(tls->ctx);
diff --git a/1001_hide-internal-symbols.patch b/1001_hide-internal-symbols.patch
new file mode 100644
index 000000000000..e2a612044c6e
--- /dev/null
+++ b/1001_hide-internal-symbols.patch
@@ -0,0 +1,242 @@
+Description: Hide internal functions
+ They are only used in the test suite and via function pointers. There is no
+ need to expose them via the public ABI of libfreerdp-primitives and
+ libfreerdp-codec.
+Author: Sebastian Ramacher <sramacher@debian.org>
+Last-Update: 2014-08-17
+
+--- /dev/null
++++ b/libfreerdp/codec/codec_internal.h
+@@ -0,0 +1,14 @@
++#ifdef __GNUC__
++# pragma once
++#endif
++
++#ifndef __CODEC_INTERNAL_H_INCLUDED__
++#define __CODEC_INTERNAL_H_INCLUDED__
++
++#if __GNUC__ >= 4
++ #define CODEC_HIDDEN __attribute__ ((visibility("hidden")))
++#else
++ #define CODEC_HIDDEN
++#endif
++
++#endif /* !__CODEC_INTERNAL_H_INCLUDED__ */
+--- a/libfreerdp/codec/nsc_sse2.h
++++ b/libfreerdp/codec/nsc_sse2.h
+@@ -21,8 +21,9 @@
+ #define __NSC_SSE2_H
+
+ #include <freerdp/codec/nsc.h>
++#include "codec_internal.h"
+
+-void nsc_init_sse2(NSC_CONTEXT* context);
++CODEC_HIDDEN void nsc_init_sse2(NSC_CONTEXT* context);
+
+ #ifdef WITH_SSE2
+ #ifndef NSC_INIT_SIMD
+--- a/libfreerdp/codec/rfx_neon.c
++++ b/libfreerdp/codec/rfx_neon.c
+@@ -51,7 +51,7 @@
+ while(buf < buf_end);
+ }
+
+-void
++static void
+ rfx_quantization_decode_NEON(INT16 * buffer, const UINT32 * quantization_values)
+ {
+ rfx_quantization_decode_block_NEON(buffer, 4096, 5);
+@@ -242,7 +242,7 @@
+ rfx_dwt_2d_decode_block_vert_NEON(l_dst, h_dst, buffer, subband_width);
+ }
+
+-void rfx_dwt_2d_decode_NEON(INT16 * buffer, INT16 * dwt_buffer)
++static void rfx_dwt_2d_decode_NEON(INT16 * buffer, INT16 * dwt_buffer)
+ {
+ rfx_dwt_2d_decode_block_NEON(buffer + 3840, dwt_buffer, 8);
+ rfx_dwt_2d_decode_block_NEON(buffer + 3072, dwt_buffer, 16);
+--- a/libfreerdp/codec/rfx_neon.h
++++ b/libfreerdp/codec/rfx_neon.h
+@@ -21,8 +21,9 @@
+ #define __RFX_NEON_H
+
+ #include <freerdp/codec/rfx.h>
++#include "codec_internal.h"
+
+-void rfx_init_neon(RFX_CONTEXT * context);
++CODEC_HIDDEN void rfx_init_neon(RFX_CONTEXT * context);
+
+ #ifndef RFX_INIT_SIMD
+ #if defined(WITH_NEON)
+--- a/libfreerdp/codec/rfx_sse2.h
++++ b/libfreerdp/codec/rfx_sse2.h
+@@ -21,8 +21,9 @@
+ #define __RFX_SSE2_H
+
+ #include <freerdp/codec/rfx.h>
++#include "codec_internal.h"
+
+-void rfx_init_sse2(RFX_CONTEXT* context);
++CODEC_HIDDEN void rfx_init_sse2(RFX_CONTEXT* context);
+
+ #ifdef WITH_SSE2
+ #ifndef RFX_INIT_SIMD
+--- a/libfreerdp/primitives/prim_alphaComp_opt.c
++++ b/libfreerdp/primitives/prim_alphaComp_opt.c
+@@ -45,7 +45,7 @@
+ #ifdef WITH_SSE2
+ #if !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS)
+
+-pstatus_t sse2_alphaComp_argb(
++PRIMITIVES_HIDDEN pstatus_t sse2_alphaComp_argb(
+ const BYTE *pSrc1, INT32 src1Step,
+ const BYTE *pSrc2, INT32 src2Step,
+ BYTE *pDst, INT32 dstStep,
+@@ -196,7 +196,7 @@
+
+ #ifdef WITH_IPP
+ /* ------------------------------------------------------------------------- */
+-pstatus_t ipp_alphaComp_argb(
++PRIMITIVES_HIDDEN pstatus_t ipp_alphaComp_argb(
+ const BYTE *pSrc1, INT32 src1Step,
+ const BYTE *pSrc2, INT32 src2Step,
+ BYTE *pDst, INT32 dstStep,
+--- a/libfreerdp/primitives/prim_colors_opt.c
++++ b/libfreerdp/primitives/prim_colors_opt.c
+@@ -66,7 +66,7 @@
+ #endif /* DO_PREFETCH */
+
+ /*---------------------------------------------------------------------------*/
+-pstatus_t sse2_yCbCrToRGB_16s16s_P3P3(
++PRIMITIVES_HIDDEN pstatus_t sse2_yCbCrToRGB_16s16s_P3P3(
+ const INT16 *pSrc[3],
+ int srcStep,
+ INT16 *pDst[3],
+@@ -206,7 +206,7 @@
+ /* The encodec YCbCr coeffectients are represented as 11.5 fixed-point
+ * numbers. See the general code above.
+ */
+-pstatus_t sse2_RGBToYCbCr_16s16s_P3P3(
++PRIMITIVES_HIDDEN pstatus_t sse2_RGBToYCbCr_16s16s_P3P3(
+ const INT16 *pSrc[3],
+ int srcStep,
+ INT16 *pDst[3],
+@@ -359,7 +359,7 @@
+ #define XMM_ALL_ONES \
+ _mm_set1_epi32(0xFFFFFFFFU)
+
+-pstatus_t sse2_RGBToRGB_16s8u_P3AC4R(
++PRIMITIVES_HIDDEN pstatus_t sse2_RGBToRGB_16s8u_P3AC4R(
+ const INT16 *pSrc[3], /* 16-bit R,G, and B arrays */
+ INT32 srcStep, /* bytes between rows in source data */
+ BYTE *pDst, /* 32-bit interleaved ARGB (ABGR?) data */
+@@ -440,7 +440,7 @@
+
+ /*---------------------------------------------------------------------------*/
+ #ifdef WITH_NEON
+-pstatus_t neon_yCbCrToRGB_16s16s_P3P3(
++PRIMITIVES_HIDDEN pstatus_t neon_yCbCrToRGB_16s16s_P3P3(
+ const INT16 *pSrc[3],
+ int srcStep,
+ INT16 *pDst[3],
+--- a/libfreerdp/primitives/prim_internal.h
++++ b/libfreerdp/primitives/prim_internal.h
+@@ -27,6 +27,11 @@
+
+ #include <freerdp/primitives.h>
+
++#if __GNUC__ >= 4
++ #define PRIMITIVES_HIDDEN __attribute__ ((visibility("hidden")))
++#else
++ #define PRIMITIVES_HIDDEN
++#endif
+
+ /* Use lddqu for unaligned; load for 16-byte aligned. */
+ #define LOAD_SI128(_ptr_) \
+--- a/libfreerdp/primitives/prim_set_opt.c
++++ b/libfreerdp/primitives/prim_set_opt.c
+@@ -36,7 +36,7 @@
+ /* ========================================================================= */
+ #ifdef WITH_SSE2
+ # if !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS)
+-pstatus_t sse2_set_8u(
++PRIMITIVES_HIDDEN pstatus_t sse2_set_8u(
+ BYTE val,
+ BYTE *pDst,
+ INT32 len)
+@@ -103,7 +103,7 @@
+ /* ------------------------------------------------------------------------- */
+ #ifdef WITH_SSE2
+ # if !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS)
+-pstatus_t sse2_set_32u(
++PRIMITIVES_HIDDEN pstatus_t sse2_set_32u(
+ UINT32 val,
+ UINT32 *pDst,
+ INT32 len)
+@@ -174,7 +174,7 @@
+ }
+
+ /* ------------------------------------------------------------------------- */
+-pstatus_t sse2_set_32s(
++PRIMITIVES_HIDDEN pstatus_t sse2_set_32s(
+ INT32 val,
+ INT32 *pDst,
+ INT32 len)
+@@ -187,7 +187,7 @@
+
+ #ifdef WITH_IPP
+ /* ------------------------------------------------------------------------- */
+-pstatus_t ipp_wrapper_set_32u(
++PRIMITIVES_HIDDEN pstatus_t ipp_wrapper_set_32u(
+ UINT32 val,
+ UINT32 *pDst,
+ INT32 len)
+--- a/libfreerdp/primitives/prim_sign_opt.c
++++ b/libfreerdp/primitives/prim_sign_opt.c
+@@ -32,7 +32,7 @@
+
+ #ifdef WITH_SSE2
+ /* ------------------------------------------------------------------------- */
+-pstatus_t ssse3_sign_16s(
++PRIMITIVES_HIDDEN pstatus_t ssse3_sign_16s(
+ const INT16 *pSrc,
+ INT16 *pDst,
+ INT32 len)
+--- a/libfreerdp/primitives/prim_templates.h
++++ b/libfreerdp/primitives/prim_templates.h
+@@ -20,6 +20,8 @@
+ #ifndef __PRIM_TEMPLATES_H_INCLUDED__
+ #define __PRIM_TEMPLATES_H_INCLUDED__
+
++#include "prim_internal.h"
++
+ /* These are prototypes for SSE (potentially NEON) routines that do a
+ * simple SSE operation over an array of data. Since so much of this
+ * code is shared except for the operation itself, these prototypes are
+@@ -44,7 +46,7 @@
+ * SCD = Source, Constant, Destination
+ */
+ #define SSE3_SCD_ROUTINE(_name_, _type_, _fallback_, _op_, _slowWay_) \
+-pstatus_t _name_(const _type_ *pSrc, INT32 val, _type_ *pDst, INT32 len) \
++PRIMITIVES_HIDDEN pstatus_t _name_(const _type_ *pSrc, INT32 val, _type_ *pDst, INT32 len) \
+ { \
+ int shifts; \
+ UINT32 offBeatMask; \
+@@ -188,7 +190,7 @@
+ * PRE = preload xmm0 with the constant.
+ */
+ #define SSE3_SCD_PRE_ROUTINE(_name_, _type_, _fallback_, _op_, _slowWay_) \
+-pstatus_t _name_(const _type_ *pSrc, _type_ val, _type_ *pDst, INT32 len) \
++PRIMITIVES_HIDDEN pstatus_t _name_(const _type_ *pSrc, _type_ val, _type_ *pDst, INT32 len) \
+ { \
+ int shifts; \
+ UINT32 offBeatMask; \
+@@ -293,7 +295,7 @@
+ * SSD = Source1, Source2, Destination
+ */
+ #define SSE3_SSD_ROUTINE(_name_, _type_, _fallback_, _op_, _slowWay_) \
+-pstatus_t _name_(const _type_ *pSrc1, const _type_ *pSrc2, _type_ *pDst, INT32 len) \
++PRIMITIVES_HIDDEN pstatus_t _name_(const _type_ *pSrc1, const _type_ *pSrc2, _type_ *pDst, INT32 len) \
+ { \
+ int shifts; \
+ UINT32 offBeatMask; \
diff --git a/1002_update-pkg-config-file.patch b/1002_update-pkg-config-file.patch
new file mode 100644
index 000000000000..7dc501a5b50f
--- /dev/null
+++ b/1002_update-pkg-config-file.patch
@@ -0,0 +1,16 @@
+Description: Add missing -lfreerdp-client
+Author: Sebastian Ramacher <sramacher@debian.org>
+Last-Update: 2014-08-17
+
+diff --git a/freerdp.pc.in b/freerdp.pc.in
+index 59e2b44..70288dd 100644
+--- a/freerdp.pc.in
++++ b/freerdp.pc.in
+@@ -8,6 +8,6 @@ Description: A free remote desktop protocol client
+ URL: http://www.freerdp.com/
+ Version: @FREERDP_VERSION_FULL@
+ Requires:
+-Libs: -L${libdir} -lfreerdp-cache -lfreerdp-codec -lfreerdp-core -lfreerdp-crypto -lfreerdp-gdi -lfreerdp-locale -lfreerdp-rail -lfreerdp-utils -lwinpr-sspi -lwinpr-rpc -lwinpr-utils
++Libs: -L${libdir} -lfreerdp-cache -lfreerdp-codec -lfreerdp-client -lfreerdp-core -lfreerdp-crypto -lfreerdp-gdi -lfreerdp-locale -lfreerdp-rail -lfreerdp-utils -lwinpr-sspi -lwinpr-rpc -lwinpr-utils
+ Cflags: -I${includedir}
+
diff --git a/1003_multi-arch-include-path.patch b/1003_multi-arch-include-path.patch
new file mode 100644
index 000000000000..7bf670086224
--- /dev/null
+++ b/1003_multi-arch-include-path.patch
@@ -0,0 +1,71 @@
+Description: Make include path configurable for multi-arch installation targets
+Author: Mike Gabriel <mike.gabriel@das-netzkwerkteam.de>
+
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -398,6 +398,7 @@
+ # Path to put plugins
+
+ set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
++set(FREERDP_INCLUDE_PATH "${CMAKE_INSTALL_INCLUDEDIR}")
+
+ set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp")
+ set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
+@@ -408,6 +409,7 @@
+ # Include directories
+ include_directories(${CMAKE_CURRENT_BINARY_DIR})
+ include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
++include_directories(${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR})
+ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
+
+ # Configure files
+--- a/freerdp.pc.in
++++ b/freerdp.pc.in
+@@ -1,7 +1,7 @@
+ prefix=@CMAKE_INSTALL_PREFIX@
+ exec_prefix=@CMAKE_INSTALL_PREFIX@
+ libdir=@CMAKE_INSTALL_FULL_LIBDIR@
+-includedir=@CMAKE_INSTALL_PREFIX@/include
++includedir=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@
+
+ Name: FreeRDP
+ Description: A free remote desktop protocol client
+--- b/winpr/include/CMakeLists.txt
++++ b/winpr/include/CMakeLists.txt
+@@ -16,4 +16,4 @@
+ # limitations under the License.
+
+ file(GLOB WINPR_HEADERS "winpr/*.h")
+-install(FILES ${WINPR_HEADERS} DESTINATION include/winpr COMPONENT headers)
++install(FILES ${WINPR_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/winpr COMPONENT headers)
+--- a/include/CMakeLists.txt
++++ b/include/CMakeLists.txt
+@@ -20,16 +20,16 @@
+ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/freerdp/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/freerdp/version.h)
+
+ file(GLOB FREERDP_HEADERS "freerdp/*.h")
+-install(FILES ${FREERDP_HEADERS} DESTINATION include/freerdp COMPONENT headers)
+-install(FILES ${CMAKE_CURRENT_BINARY_DIR}/freerdp/version.h DESTINATION include/freerdp COMPONENT headers)
++install(FILES ${FREERDP_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/freerdp COMPONENT headers)
++install(FILES ${CMAKE_CURRENT_BINARY_DIR}/freerdp/version.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/freerdp COMPONENT headers)
+
+-install(DIRECTORY freerdp/cache DESTINATION include/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
+-install(DIRECTORY freerdp/codec DESTINATION include/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
+-install(DIRECTORY freerdp/crypto DESTINATION include/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
+-install(DIRECTORY freerdp/gdi DESTINATION include/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
+-install(DIRECTORY freerdp/locale DESTINATION include/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
+-install(DIRECTORY freerdp/rail DESTINATION include/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
+-install(DIRECTORY freerdp/utils DESTINATION include/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
+-install(DIRECTORY freerdp/client DESTINATION include/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
+-install(DIRECTORY freerdp/server DESTINATION include/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
+-install(DIRECTORY freerdp/channels DESTINATION include/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
++install(DIRECTORY freerdp/cache DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
++install(DIRECTORY freerdp/codec DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
++install(DIRECTORY freerdp/crypto DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
++install(DIRECTORY freerdp/gdi DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
++install(DIRECTORY freerdp/locale DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
++install(DIRECTORY freerdp/rail DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
++install(DIRECTORY freerdp/utils DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
++install(DIRECTORY freerdp/client DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
++install(DIRECTORY freerdp/server DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
++install(DIRECTORY freerdp/channels DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/freerdp COMPONENT headers FILES_MATCHING PATTERN "*.h")
diff --git a/1004_64-bit-architectures.patch b/1004_64-bit-architectures.patch
new file mode 100644
index 000000000000..d8aa139ac715
--- /dev/null
+++ b/1004_64-bit-architectures.patch
@@ -0,0 +1,27 @@
+The current definitions wrongly assume the only 64-bit architecture is
+x86-64. Use the __ILP64__, __LP64__ and __LLP64__ to correctly define
+the size of a long and of pointer.
+
+Ideally long, intptr_t and uintptr_t should be used directly but there
+might be a (portability ?) reason why it is not the case.
+
+--- a/winpr/include/winpr/wtypes.h
++++ b/winpr/include/winpr/wtypes.h
+@@ -37,7 +37,7 @@
+ #define __int32 int
+ #define __int64 long long
+
+-#if __x86_64__
++#if __ILP64__ || __LP64__
+ #define __int3264 __int64
+ #else
+ #define __int3264 __int32
+@@ -136,7 +136,7 @@ typedef void *PVOID64, *LPVOID64;
+ typedef const void *LPCVOID;
+ typedef unsigned short WORD, *PWORD, *LPWORD;
+
+-#if __x86_64__
++#if __ILP64__ || __LP64__ || __LLP64__
+ typedef __int64 INT_PTR;
+ typedef unsigned __int64 UINT_PTR;
+ #else
diff --git a/1005_parse-buffer-endianess.patch b/1005_parse-buffer-endianess.patch
new file mode 100644
index 000000000000..76772f043677
--- /dev/null
+++ b/1005_parse-buffer-endianess.patch
@@ -0,0 +1,67 @@
+The RDP file buffers contain little endian UTF-16, but all the wcs* and
+UTF conversion functions use the WCHAR type and assume native endian.
+Convert the buffer to little endian on big endian machines.
+
+--- a/client/common/file.c
++++ b/client/common/file.c
+@@ -42,6 +42,18 @@
+
+ #include <winpr/crt.h>
+
++#if defined(WIN32) || defined(WIN64)
++ #ifndef __LITTLE_ENDIAN
++ #define __LITTLE_ENDIAN 1234
++ #define __BIG_ENDIAN 4321
++ #endif
++ #ifndef __BYTE_ORDER
++ #define __BYTE_ORDER __LITTLE_ENDIAN
++ #endif
++#else
++ #include <endian.h>
++#endif
++
+ #define DEBUG_CLIENT_FILE 1
+
+ static BYTE BOM_UTF16_LE[2] = { 0xFF, 0xFE };
+@@ -364,7 +376,8 @@
+
+ BOOL freerdp_client_parse_rdp_file_buffer_unicode(rdpFile* file, BYTE* buffer, size_t size)
+ {
+- int length;
++ int i, length;
++ BYTE* bufferne;
+ WCHAR* line;
+ WCHAR* type;
+ WCHAR* context;
+@@ -372,7 +385,19 @@
+ WCHAR *beg, *end;
+ WCHAR *name, *value;
+
+- line = wcstok_s((WCHAR*) buffer, CR_LF_STR_W, &context);
++#if __BYTE_ORDER == __BIG_ENDIAN
++ /* Convert the buffer from little endian to native endian */
++ bufferne = (BYTE*) malloc(size);
++ for (i = 0; i < size / 2; i++)
++ {
++ bufferne[i*2] = buffer[i*2 + 1];
++ bufferne[i*2 + 1] = buffer[i*2];
++ }
++#else
++ bufferne = buffer;
++#endif
++
++ line = wcstok_s((WCHAR*) bufferne, CR_LF_STR_W, &context);
+
+ while (line != NULL)
+ {
+@@ -425,6 +450,10 @@
+ line = wcstok_s(NULL, CR_LF_STR_W, &context);
+ }
+
++#if __BYTE_ORDER == __BIG_ENDIAN
++ free(bufferne);
++#endif
++
+ return TRUE;
+ }
+
diff --git a/1006_test-unicode-endianess.patch b/1006_test-unicode-endianess.patch
new file mode 100644
index 000000000000..82ce2e3ca020
--- /dev/null
+++ b/1006_test-unicode-endianess.patch
@@ -0,0 +1,102 @@
+The testsuite stores the expected result in little endian UTF-16, while
+all the functions UTF conversion functions use the WCHAR type and assume
+native endian. Convert the expected results to little endian on big
+endian machines.
+
+--- a/winpr/libwinpr/crt/test/TestUnicodeConversion.c
++++ b/winpr/libwinpr/crt/test/TestUnicodeConversion.c
+@@ -4,6 +4,18 @@
+ #include <winpr/error.h>
+ #include <winpr/windows.h>
+
++#if defined(WIN32) || defined(WIN64)
++ #ifndef __LITTLE_ENDIAN
++ #define __LITTLE_ENDIAN 1234
++ #define __BIG_ENDIAN 4321
++ #endif
++ #ifndef __BYTE_ORDER
++ #define __BYTE_ORDER __LITTLE_ENDIAN
++ #endif
++#else
++ #include <endian.h>
++#endif
++
+ /* Letters */
+
+ static BYTE c_cedilla_UTF8[] = "\xC3\xA7\x00";
+@@ -108,6 +120,22 @@
+ }
+ }
+
++void utf16_le_to_ne(BYTE *data, int length)
++{
++#if __BYTE_ORDER == __BIG_ENDIAN
++ int i;
++
++ for (i = 0; i < length / 2; i++)
++ {
++ BYTE c;
++
++ c = data[i * 2];
++ data[i * 2] = data[i * 2 + 1];
++ data[i * 2 + 1] = c;
++ }
++#endif
++}
++
+ int convert_utf8_to_utf16(BYTE* lpMultiByteStr, BYTE* expected_lpWideCharStr, int expected_cchWideChar)
+ {
+ int length;
+@@ -247,6 +275,7 @@
+ /* Letters */
+
+ printf("Letters\n");
++ utf16_le_to_ne(c_cedilla_UTF16, sizeof(c_cedilla_UTF16));
+
+ if (convert_utf8_to_utf16(c_cedilla_UTF8, c_cedilla_UTF16, c_cedilla_cchWideChar) < 1)
+ return -1;
+@@ -257,6 +286,8 @@
+ /* English */
+
+ printf("English\n");
++ utf16_le_to_ne(en_Hello_UTF16, sizeof(en_Hello_UTF16));
++ utf16_le_to_ne(en_HowAreYou_UTF16, sizeof(en_HowAreYou_UTF16));
+
+ if (convert_utf8_to_utf16(en_Hello_UTF8, en_Hello_UTF16, en_Hello_cchWideChar) < 1)
+ return -1;
+@@ -271,6 +302,8 @@
+ /* French */
+
+ printf("French\n");
++ utf16_le_to_ne(fr_Hello_UTF16, sizeof(fr_Hello_UTF16));
++ utf16_le_to_ne(fr_HowAreYou_UTF16, sizeof(fr_HowAreYou_UTF16));
+
+ if (convert_utf8_to_utf16(fr_Hello_UTF8, fr_Hello_UTF16, fr_Hello_cchWideChar) < 1)
+ return -1;
+@@ -285,6 +318,8 @@
+ /* Russian */
+
+ printf("Russian\n");
++ utf16_le_to_ne(ru_Hello_UTF16, sizeof(ru_Hello_UTF16));
++ utf16_le_to_ne(ru_HowAreYou_UTF16, sizeof(ru_HowAreYou_UTF16));
+
+ if (convert_utf8_to_utf16(ru_Hello_UTF8, ru_Hello_UTF16, ru_Hello_cchWideChar) < 1)
+ return -1;
+@@ -299,6 +334,8 @@
+ /* Arabic */
+
+ printf("Arabic\n");
++ utf16_le_to_ne(ar_Hello_UTF16, sizeof(ar_Hello_UTF16));
++ utf16_le_to_ne(ar_HowAreYou_UTF16, sizeof(ar_HowAreYou_UTF16));
+
+ if (convert_utf8_to_utf16(ar_Hello_UTF8, ar_Hello_UTF16, ar_Hello_cchWideChar) < 1)
+ return -1;
+@@ -313,6 +350,8 @@
+ /* Chinese */
+
+ printf("Chinese\n");
++ utf16_le_to_ne(ch_Hello_UTF16, sizeof(ch_Hello_UTF16));
++ utf16_le_to_ne(ch_HowAreYou_UTF16, sizeof(ch_HowAreYou_UTF16));
+
+ if (convert_utf8_to_utf16(ch_Hello_UTF8, ch_Hello_UTF16, ch_Hello_cchWideChar) < 1)
+ return -1;
diff --git a/1007_detect-arm-arch-correctly.patch b/1007_detect-arm-arch-correctly.patch
new file mode 100644
index 000000000000..b285033a2079
--- /dev/null
+++ b/1007_detect-arm-arch-correctly.patch
@@ -0,0 +1,14 @@
+Description: Detect arm architecture correctly
+Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+
+--- a/cmake/ConfigOptions.cmake
++++ b/cmake/ConfigOptions.cmake
+@@ -6,7 +6,7 @@
+ elseif((CMAKE_SYSTEM_PROCESSOR MATCHES "i386") AND (CMAKE_SIZEOF_VOID_P EQUAL 8) AND (APPLE))
+ # Mac is weird like that.
+ set(TARGET_ARCH "x64")
+-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm*")
++elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm.*")
+ set(TARGET_ARCH "ARM")
+ endif()
+
diff --git a/1008_gcc-fPIC-on-arm64.patch b/1008_gcc-fPIC-on-arm64.patch
new file mode 100644
index 000000000000..c79587c9e18d
--- /dev/null
+++ b/1008_gcc-fPIC-on-arm64.patch
@@ -0,0 +1,15 @@
+Description: CPU types arm64 and armhf need to be linked with -fPIC.
+Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -118,6 +118,9 @@
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
+ endif()
+ endif()
++ if (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
++ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
++ endif()
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
+ CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
+ if(Wno-unused-result)
diff --git a/1009_libusb-debug.patch b/1009_libusb-debug.patch
new file mode 100644
index 000000000000..160d7aa692b9
--- /dev/null
+++ b/1009_libusb-debug.patch
@@ -0,0 +1,14 @@
+Description: fixup libusb subchannel to use libusb_debug, not urbdrc_debug
+Author: Lionel Elie Mamane <lionel@mamane.lu>
+
+--- freerdp-1.1.0~git20140921.1.440916e+dfsg1.orig/channels/urbdrc/client/libusb/libusb_udevman.c
++++ freerdp-1.1.0~git20140921.1.440916e+dfsg1/channels/urbdrc/client/libusb/libusb_udevman.c
+@@ -550,7 +550,7 @@ static void urbdrc_udevman_parse_addin_a
+
+ CommandLineSwitchCase(arg, "dbg")
+ {
+- urbdrc_debug = 0;
++ libusb_debug = 0;
+ }
+ CommandLineSwitchCase(arg, "dev")
+ {
diff --git a/1010_libudev-link.patch b/1010_libudev-link.patch
new file mode 100644
index 000000000000..c765499da4e3
--- /dev/null
+++ b/1010_libudev-link.patch
@@ -0,0 +1,13 @@
+Description: Fix linking against UDEV libraries
+Author: Alex 'AdUser' Z <ad_user@runbox.com>
+
+--- a/channels/urbdrc/client/libusb/CMakeLists.txt 2016-01-26 15:25:32.979436442 +1000
++++ b/channels/urbdrc/client/libusb/CMakeLists.txt 2016-01-26 15:25:45.767436886 +1000
+@@ -39,6 +39,7 @@
+ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS}
+ ${DBUS_GLIB_LIBRARIES}
+ ${UUID_LIBRARIES}
++ ${UDEV_LIBRARIES}
+ ${LIBUSB_1_LIBRARIES}
+ )
+
diff --git a/1011_ffmpeg-2.9.patch b/1011_ffmpeg-2.9.patch
new file mode 100644
index 000000000000..374296a9e5a3
--- /dev/null
+++ b/1011_ffmpeg-2.9.patch
@@ -0,0 +1,69 @@
+Description: Replace deprecated FFmpeg API
+Author: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
+Last-Update: <2015-11-02>
+
+--- freerdp-1.1.0~git20140921.1.440916e+dfsg1.orig/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c
++++ freerdp-1.1.0~git20140921.1.440916e+dfsg1/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c
+@@ -107,7 +107,7 @@ static BOOL tsmf_ffmpeg_init_video_strea
+ mdecoder->codec_context->time_base.den = media_type->SamplesPerSecond.Numerator;
+ mdecoder->codec_context->time_base.num = media_type->SamplesPerSecond.Denominator;
+
+- mdecoder->frame = avcodec_alloc_frame();
++ mdecoder->frame = av_frame_alloc();
+
+ return TRUE;
+ }
+@@ -342,7 +342,7 @@ static BOOL tsmf_ffmpeg_decode_video(ITS
+ mdecoder->codec_context->width, mdecoder->codec_context->height);
+ mdecoder->decoded_data = malloc(mdecoder->decoded_size);
+ ZeroMemory(mdecoder->decoded_data, mdecoder->decoded_size);
+- frame = avcodec_alloc_frame();
++ frame = av_frame_alloc();
+ avpicture_fill((AVPicture*) frame, mdecoder->decoded_data,
+ mdecoder->codec_context->pix_fmt,
+ mdecoder->codec_context->width, mdecoder->codec_context->height);
+@@ -351,7 +351,7 @@ static BOOL tsmf_ffmpeg_decode_video(ITS
+ mdecoder->codec_context->pix_fmt,
+ mdecoder->codec_context->width, mdecoder->codec_context->height);
+
+- av_free(frame);
++ av_frame_free(&frame);
+ }
+
+ return ret;
+@@ -412,7 +412,7 @@ static BOOL tsmf_ffmpeg_decode_audio(ITS
+ (int16_t*) dst, &frame_size, src, src_size);
+ #else
+ {
+- AVFrame* decoded_frame = avcodec_alloc_frame();
++ AVFrame* decoded_frame = av_frame_alloc();
+ int got_frame = 0;
+ AVPacket pkt;
+ av_init_packet(&pkt);
+@@ -427,7 +427,7 @@ static BOOL tsmf_ffmpeg_decode_audio(ITS
+ memcpy(dst, decoded_frame->data[0], frame_size);
+ }
+
+- av_free(decoded_frame);
++ av_frame_free(&decoded_frame);
+ }
+ #endif
+ if (len <= 0 || frame_size <= 0)
+@@ -501,7 +501,7 @@ static UINT32 tsmf_ffmpeg_get_decoded_fo
+
+ switch (mdecoder->codec_context->pix_fmt)
+ {
+- case PIX_FMT_YUV420P:
++ case AV_PIX_FMT_YUV420P:
+ return RDP_PIXFMT_I420;
+
+ default:
+@@ -532,7 +532,7 @@ static void tsmf_ffmpeg_free(ITSMFDecode
+ TSMFFFmpegDecoder* mdecoder = (TSMFFFmpegDecoder*) decoder;
+
+ if (mdecoder->frame)
+- av_free(mdecoder->frame);
++ av_frame_free(&mdecoder->frame);
+
+ if (mdecoder->decoded_data)
+ free(mdecoder->decoded_data);
diff --git a/1012_typo-fix.patch b/1012_typo-fix.patch
new file mode 100644
index 000000000000..aedf1618f13e
--- /dev/null
+++ b/1012_typo-fix.patch
@@ -0,0 +1,14 @@
+Description: Fix spelling of "occurred" in an error msg."
+Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+
+--- a/channels/urbdrc/client/urbdrc_main.c
++++ b/channels/urbdrc/client/urbdrc_main.c
+@@ -648,7 +648,7 @@
+ }
+ else
+ {
+- fprintf(stderr, "No Device from receive_device(). An error occured.\n");
++ fprintf(stderr, "No Device from receive_device(). An error occurred.\n");
+ }
+ }
+ }
diff --git a/1013_aligned_meminfo_alignment.patch b/1013_aligned_meminfo_alignment.patch
new file mode 100644
index 000000000000..3e1c24ad3b6a
--- /dev/null
+++ b/1013_aligned_meminfo_alignment.patch
@@ -0,0 +1,48 @@
+Description: Ensure the _aligned_meminfo pointer itself is sufficiently aligned
+Author: James Clarke <jrtc27@jrtc27.com>
+
+--- a/winpr/libwinpr/crt/alignment.c
++++ b/winpr/libwinpr/crt/alignment.c
+@@ -73,15 +73,20 @@ void* _aligned_offset_malloc(size_t size
+ if (alignment < sizeof(void*))
+ alignment = sizeof(void*);
+
+- /* malloc size + alignment to make sure we can align afterwards */
+- tmpptr = malloc(size + alignment + sizeof(struct _aligned_meminfo));
++ /* malloc size + alignment to make sure we can align afterwards.
++ * Include an extra sizeof(void*) to ensure there's always space to align
++ * ameminfo downwards, in case malloc doesn't align to sizeof(void*). This
++ * could be dropped if there was a portable way to get alignof(struct
++ * _aligned_meminfo), but instead we have to overestimate with
++ * sizeof(void*). */
++ tmpptr = malloc(size + alignment + sizeof(struct _aligned_meminfo) + sizeof(void*));
+ if (!tmpptr)
+ return NULL;
+
+
+- memptr = (void *)((((size_t)((PBYTE)tmpptr + alignment + offset + sizeof(struct _aligned_meminfo)) & ~(alignment - 1)) - offset));
++ memptr = (void *)((((size_t)((PBYTE)tmpptr + alignment + offset + sizeof(struct _aligned_meminfo) + sizeof(void*)) & ~(alignment - 1)) - offset));
+
+- ameminfo = (struct _aligned_meminfo *) (((size_t)((PBYTE)memptr - sizeof(struct _aligned_meminfo))));
++ ameminfo = (struct _aligned_meminfo *) (((size_t)((PBYTE)memptr - sizeof(struct _aligned_meminfo))) & ~(sizeof(void*)-1));
+ ameminfo->base_addr = tmpptr;
+ ameminfo->size = size;
+
+@@ -107,7 +112,7 @@ void* _aligned_offset_realloc(void* memb
+ if (!newmem)
+ return NULL;
+
+- ameminfo = (struct _aligned_meminfo *) (((size_t)((PBYTE)memblock - sizeof(struct _aligned_meminfo))));
++ ameminfo = (struct _aligned_meminfo *) (((size_t)((PBYTE)memblock - sizeof(struct _aligned_meminfo))) & ~(sizeof(void*)-1));
+ memcpy(newmem, memblock, ameminfo->size);
+ _aligned_free(memblock);
+ return newmem;
+@@ -129,7 +134,7 @@ void _aligned_free(void* memblock)
+ if (!memblock)
+ return;
+
+- ameminfo = (struct _aligned_meminfo *) (((size_t)((PBYTE)memblock - sizeof(struct _aligned_meminfo))));
++ ameminfo = (struct _aligned_meminfo *) (((size_t)((PBYTE)memblock - sizeof(struct _aligned_meminfo))) & ~(sizeof(void*)-1));
+
+ free(ameminfo->base_addr);
+ }
diff --git a/2001_detect-ffmpeg-on-Debian.patch b/2001_detect-ffmpeg-on-Debian.patch
new file mode 100644
index 000000000000..113216736990
--- /dev/null
+++ b/2001_detect-ffmpeg-on-Debian.patch
@@ -0,0 +1,23 @@
+Description: Use pkg-config to determine FFmpeg linker flags
+
+Author: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
+Last-Update: <2014-08-11>
+
+--- a/cmake/FindFFmpeg.cmake
++++ b/cmake/FindFFmpeg.cmake
+@@ -17,11 +17,13 @@
+
+ # avcodec
+ find_path(AVCODEC_INCLUDE_DIR libavcodec/avcodec.h PATHS ${AVCODEC_INCLUDE_DIRS})
+-find_library(AVCODEC_LIBRARY avcodec PATHS ${AVCODEC_LIBRARY_DIRS})
++string(REPLACE "-l" "" avc_name "${AVCODEC_LIBRARIES}")
++find_library(AVCODEC_LIBRARY ${avc_name} avcodec PATHS ${AVCODEC_LIBRARY_DIRS})
+
+ # avutil
+ find_path(AVUTIL_INCLUDE_DIR libavutil/avutil.h PATHS ${AVUTIL_INCLUDE_DIRS})
+-find_library(AVUTIL_LIBRARY avutil PATHS ${AVUTIL_LIBRARY_DIRS})
++string(REPLACE "-l" "" avu_name "${AVUTIL_LIBRARIES}")
++find_library(AVUTIL_LIBRARY ${avu_name} avutil PATHS ${AVUTIL_LIBRARY_DIRS})
+
+ if(AVCODEC_INCLUDE_DIR AND AVCODEC_LIBRARY)
+ set(AVCODEC_FOUND TRUE)
diff --git a/CVE-2014-0791.patch b/CVE-2014-0791.patch
new file mode 100644
index 000000000000..42939bc46b6a
--- /dev/null
+++ b/CVE-2014-0791.patch
@@ -0,0 +1,24 @@
+From f1d6afca6ae620f9855a33280bdc6f3ad9153be0 Mon Sep 17 00:00:00 2001
+From: Hardening <rdp.effort@gmail.com>
+Date: Wed, 8 Jan 2014 16:12:51 +0100
+Subject: [PATCH] Fix CVE-2014-0791
+
+This patch fixes CVE-2014-0791, the remaining length in the stream is checked
+before doing some malloc().
+---
+ libfreerdp/core/license.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+Index: freerdp-1.1.0~git20140921.1.440916e+dfsg1/libfreerdp/core/license.c
+===================================================================
+--- freerdp-1.1.0~git20140921.1.440916e+dfsg1.orig/libfreerdp/core/license.c 2017-08-23 11:07:13.453296923 -0400
++++ freerdp-1.1.0~git20140921.1.440916e+dfsg1/libfreerdp/core/license.c 2017-08-23 11:07:13.449296923 -0400
+@@ -677,6 +677,8 @@ BOOL license_read_scope_list(wStream* s,
+ return FALSE;
+
+ Stream_Read_UINT32(s, scopeCount); /* ScopeCount (4 bytes) */
++ if (scopeCount > Stream_GetRemainingLength(s) / 4) /* every blob is at least 4 bytes */
++ return FALSE;
+
+ scopeList->count = scopeCount;
+ scopeList->array = (LICENSE_BLOB*) malloc(sizeof(LICENSE_BLOB) * scopeCount);
diff --git a/CVE-2018-8786.patch b/CVE-2018-8786.patch
new file mode 100644
index 000000000000..e3ede30eff07
--- /dev/null
+++ b/CVE-2018-8786.patch
@@ -0,0 +1,25 @@
+Backport of:
+
+From 445a5a42c500ceb80f8fa7f2c11f3682538033f3 Mon Sep 17 00:00:00 2001
+From: Armin Novak <armin.novak@thincast.com>
+Date: Mon, 22 Oct 2018 16:25:13 +0200
+Subject: [PATCH] Fixed CVE-2018-8786
+
+Thanks to Eyal Itkin from Check Point Software Technologies.
+---
+ libfreerdp/core/update.c | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+Index: freerdp-1.1.0~git20140921.1.440916e+dfsg1/libfreerdp/core/update.c
+===================================================================
+--- freerdp-1.1.0~git20140921.1.440916e+dfsg1.orig/libfreerdp/core/update.c
++++ freerdp-1.1.0~git20140921.1.440916e+dfsg1/libfreerdp/core/update.c
+@@ -119,7 +119,7 @@ BOOL update_read_bitmap(rdpUpdate* updat
+
+ if (bitmap_update->number > bitmap_update->count)
+ {
+- UINT16 count;
++ UINT32 count;
+
+ count = bitmap_update->number * 2;
+
diff --git a/CVE-2018-8787.patch b/CVE-2018-8787.patch
new file mode 100644
index 000000000000..49b5c3959f79
--- /dev/null
+++ b/CVE-2018-8787.patch
@@ -0,0 +1,51 @@
+Backport of:
+
+From 09b9d4f1994a674c4ec85b4947aa656eda1aed8a Mon Sep 17 00:00:00 2001
+From: Armin Novak <armin.novak@thincast.com>
+Date: Mon, 22 Oct 2018 16:30:20 +0200
+Subject: [PATCH] Fixed CVE-2018-8787
+
+Thanks to Eyal Itkin from Check Point Software Technologies.
+---
+ libfreerdp/gdi/graphics.c | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+Index: freerdp-1.1.0~git20140921.1.440916e+dfsg1/libfreerdp/gdi/graphics.c
+===================================================================
+--- freerdp-1.1.0~git20140921.1.440916e+dfsg1.orig/libfreerdp/gdi/graphics.c
++++ freerdp-1.1.0~git20140921.1.440916e+dfsg1/libfreerdp/gdi/graphics.c
+@@ -23,6 +23,7 @@
+
+ #include <winpr/crt.h>
+
++#include <stdint.h>
+ #include <freerdp/gdi/dc.h>
+ #include <freerdp/gdi/brush.h>
+ #include <freerdp/gdi/shape.h>
+@@ -98,7 +99,7 @@ void gdi_Bitmap_Decompress(rdpContext* c
+ BYTE* data, int width, int height, int bpp, int length,
+ BOOL compressed, int codec_id)
+ {
+- UINT16 size;
++ UINT32 size;
+ RFX_MESSAGE* msg;
+ BYTE* src;
+ BYTE* dst;
+@@ -107,7 +108,16 @@ void gdi_Bitmap_Decompress(rdpContext* c
+ rdpGdi* gdi;
+ BOOL status;
+
+- size = width * height * ((bpp + 7) / 8);
++ size = width * height;
++
++ if (bpp <= 0 || width <= 0 || height <= 0 ||
++ width > (UINT32_MAX / height) ||
++ size > (UINT32_MAX / (bpp + 7) / 8))
++ {
++ printf("Invalid parameters, unable to decompress bitmap\n");
++ return;
++ }
++ size *= (bpp + 7) / 8;
+
+ if (bitmap->data == NULL)
+ bitmap->data = (BYTE*) malloc(size);
diff --git a/CVE-2018-8788.patch b/CVE-2018-8788.patch
new file mode 100644
index 000000000000..68ab84486736
--- /dev/null
+++ b/CVE-2018-8788.patch
@@ -0,0 +1,352 @@
+Backport of:
+
+From d1112c279bd1a327e8e4d0b5f371458bf2579659 Mon Sep 17 00:00:00 2001
+From: Armin Novak <armin.novak@thincast.com>
+Date: Mon, 22 Oct 2018 16:52:21 +0200
+Subject: [PATCH] Fixed CVE-2018-8788
+
+Thanks to Eyal Itkin from Check Point Software Technologies.
+---
+ include/freerdp/codec/nsc.h | 4 +-
+ libfreerdp/codec/nsc.c | 94 +++++++++++++++++++++++++++++------
+ libfreerdp/codec/nsc_encode.c | 62 ++++++++++++++++-------
+ libfreerdp/codec/nsc_encode.h | 2 +-
+ libfreerdp/codec/nsc_sse2.c | 4 +-
+ 5 files changed, 130 insertions(+), 36 deletions(-)
+
+Index: freerdp-1.1.0~git20140921.1.440916e+dfsg1/include/freerdp/codec/nsc.h
+===================================================================
+--- freerdp-1.1.0~git20140921.1.440916e+dfsg1.orig/include/freerdp/codec/nsc.h
++++ freerdp-1.1.0~git20140921.1.440916e+dfsg1/include/freerdp/codec/nsc.h
+@@ -59,8 +59,8 @@ struct _NSC_CONTEXT
+ /* color palette allocated by the application */
+ const BYTE* palette;
+
+- void (*decode)(NSC_CONTEXT* context);
+- void (*encode)(NSC_CONTEXT* context, BYTE* bmpdata, int rowstride);
++ BOOL (*decode)(NSC_CONTEXT* context);
++ BOOL (*encode)(NSC_CONTEXT* context, BYTE* bmpdata, int rowstride);
+
+ NSC_CONTEXT_PRIV* priv;
+ };
+Index: freerdp-1.1.0~git20140921.1.440916e+dfsg1/libfreerdp/codec/nsc.c
+===================================================================
+--- freerdp-1.1.0~git20140921.1.440916e+dfsg1.orig/libfreerdp/codec/nsc.c
++++ freerdp-1.1.0~git20140921.1.440916e+dfsg1/libfreerdp/codec/nsc.c
+@@ -43,7 +43,7 @@
+ #define NSC_INIT_SIMD(_nsc_context) do { } while (0)
+ #endif
+
+-static void nsc_decode(NSC_CONTEXT* context)
++static BOOL nsc_decode(NSC_CONTEXT* context)
+ {
+ UINT16 x;
+ UINT16 y;
+@@ -60,11 +60,18 @@ static void nsc_decode(NSC_CONTEXT* cont
+ INT16 g_val;
+ INT16 b_val;
+ BYTE* bmpdata;
++ size_t pos = 0;
++
++ if (!context)
++ return FALSE;
+
+ bmpdata = context->bmpdata;
+ rw = ROUND_UP_TO(context->width, 8);
+ shift = context->nsc_stream.ColorLossLevel - 1; /* colorloss recovery + YCoCg shift */
+
++ if (!bmpdata)
++ return FALSE;
++
+ for (y = 0; y < context->height; y++)
+ {
+ if (context->nsc_stream.ChromaSubSamplingLevel > 0)
+@@ -88,6 +95,11 @@ static void nsc_decode(NSC_CONTEXT* cont
+ r_val = y_val + co_val - cg_val;
+ g_val = y_val + cg_val;
+ b_val = y_val - co_val - cg_val;
++
++ if (pos + 4 > context->bmpdata_length)
++ return FALSE;
++
++ pos += 4;
+ *bmpdata++ = MINMAX(b_val, 0, 0xFF);
+ *bmpdata++ = MINMAX(g_val, 0, 0xFF);
+ *bmpdata++ = MINMAX(r_val, 0, 0xFF);
+@@ -98,9 +110,11 @@ static void nsc_decode(NSC_CONTEXT* cont
+ aplane++;
+ }
+ }
++
++ return TRUE;
+ }
+
+-static void nsc_rle_decode(BYTE* in, BYTE* out, UINT32 origsz)
++static BOOL nsc_rle_decode(BYTE* in, BYTE* out, UINT32 outSize, UINT32 origsz)
+ {
+ UINT32 len;
+ UINT32 left;
+@@ -113,6 +127,10 @@ static void nsc_rle_decode(BYTE* in, BYT
+
+ if (left == 5)
+ {
++ if (outSize < 1)
++ return FALSE;
++
++ outSize--;
+ *out++ = value;
+ left--;
+ }
+@@ -130,6 +148,10 @@ static void nsc_rle_decode(BYTE* in, BYT
+ len = *((UINT32*) in);
+ in += 4;
+ }
++ if (outSize < len)
++ return FALSE;
++
++ outSize -= len;
+ memset(out, value, len);
+ out += len;
+ left -= len;
+@@ -141,16 +163,24 @@ static void nsc_rle_decode(BYTE* in, BYT
+ }
+ }
+
+- *((UINT32*)out) = *((UINT32*)in);
++ if ((outSize < 4) || (left < 4))
++ return FALSE;
++
++ memcpy(out, in, 4);
++ return TRUE;
+ }
+
+-static void nsc_rle_decompress_data(NSC_CONTEXT* context)
++static BOOL nsc_rle_decompress_data(NSC_CONTEXT* context)
+ {
+ UINT16 i;
+ BYTE* rle;
+ UINT32 origsize;
+ UINT32 planesize;
+
++
++ if (!context)
++ return FALSE;
++
+ rle = context->nsc_stream.Planes;
+
+ for (i = 0; i < 4; i++)
+@@ -159,14 +189,30 @@ static void nsc_rle_decompress_data(NSC_
+ planesize = context->nsc_stream.PlaneByteCount[i];
+
+ if (planesize == 0)
++ {
++ if (context->priv->plane_buf_length < origsize)
++ return FALSE;
++
+ memset(context->priv->plane_buf[i], 0xff, origsize);
++ }
+ else if (planesize < origsize)
+- nsc_rle_decode(rle, context->priv->plane_buf[i], origsize);
++ {
++ if (!nsc_rle_decode(rle, context->priv->plane_buf[i], context->priv->plane_buf_length,
++ origsize))
++ return FALSE;
++ }
+ else
++ {
++ if (context->priv->plane_buf_length < origsize)
++ return FALSE;
++
+ memcpy(context->priv->plane_buf[i], rle, origsize);
++ }
+
+ rle += planesize;
+ }
++
++ return TRUE;
+ }
+
+ static void nsc_stream_initialize(NSC_CONTEXT* context, wStream* s)
+@@ -337,12 +383,24 @@ void nsc_process_message(NSC_CONTEXT* co
+ Stream_Free(s, FALSE);
+
+ /* RLE decode */
+- PROFILER_ENTER(context->priv->prof_nsc_rle_decompress_data);
+- nsc_rle_decompress_data(context);
+- PROFILER_EXIT(context->priv->prof_nsc_rle_decompress_data);
++ {
++ BOOL rc;
++ PROFILER_ENTER(context->priv->prof_nsc_rle_decompress_data);
++ rc = nsc_rle_decompress_data(context);
++ PROFILER_EXIT(context->priv->prof_nsc_rle_decompress_data);
++
++ if (!rc)
++ return;
++ }
+
+ /* Colorloss recover, Chroma supersample and AYCoCg to ARGB Conversion in one step */
+- PROFILER_ENTER(context->priv->prof_nsc_decode);
+- context->decode(context);
+- PROFILER_EXIT(context->priv->prof_nsc_decode);
++ {
++ BOOL rc;
++ PROFILER_ENTER(context->priv->prof_nsc_decode);
++ rc = context->decode(context);
++ PROFILER_EXIT(context->priv->prof_nsc_decode);
++
++ if (!rc)
++ return;
++ }
+ }
+Index: freerdp-1.1.0~git20140921.1.440916e+dfsg1/libfreerdp/codec/nsc_encode.c
+===================================================================
+--- freerdp-1.1.0~git20140921.1.440916e+dfsg1.orig/libfreerdp/codec/nsc_encode.c
++++ freerdp-1.1.0~git20140921.1.440916e+dfsg1/libfreerdp/codec/nsc_encode.c
+@@ -67,7 +67,7 @@ static void nsc_context_initialize_encod
+ }
+ }
+
+-static void nsc_encode_argb_to_aycocg(NSC_CONTEXT* context, BYTE* bmpdata, int rowstride)
++static BOOL nsc_encode_argb_to_aycocg(NSC_CONTEXT* context, BYTE* bmpdata, int rowstride)
+ {
+ UINT16 x;
+ UINT16 y;
+@@ -85,10 +85,20 @@ static void nsc_encode_argb_to_aycocg(NS
+ UINT32 tempWidth;
+ UINT32 tempHeight;
+
++ if (!context || bmpdata || (rowstride == 0))
++ return FALSE;
++
+ tempWidth = ROUND_UP_TO(context->width, 8);
+ tempHeight = ROUND_UP_TO(context->height, 2);
+ rw = (context->nsc_stream.ChromaSubSamplingLevel > 0 ? tempWidth : context->width);
+ ccl = context->nsc_stream.ColorLossLevel;
++
++ if (context->priv->plane_buf_length < rw * rowstride)
++ return FALSE;
++
++ if (rw < rowstride * 2)
++ return FALSE;
++
+ yplane = context->priv->plane_buf[0];
+ coplane = context->priv->plane_buf[1];
+ cgplane = context->priv->plane_buf[2];
+@@ -196,32 +206,38 @@ static void nsc_encode_argb_to_aycocg(NS
+ memcpy(coplane + rw, coplane, rw);
+ memcpy(cgplane + rw, cgplane, rw);
+ }
++
++ return TRUE;
+ }
+
+-static void nsc_encode_subsampling(NSC_CONTEXT* context)
++static BOOL nsc_encode_subsampling(NSC_CONTEXT* context)
+ {
+ UINT16 x;
+ UINT16 y;
+- BYTE* co_dst;
+- BYTE* cg_dst;
+- INT8* co_src0;
+- INT8* co_src1;
+- INT8* cg_src0;
+- INT8* cg_src1;
+ UINT32 tempWidth;
+ UINT32 tempHeight;
+
++
++ if (!context)
++ return FALSE;
++
+ tempWidth = ROUND_UP_TO(context->width, 8);
+ tempHeight = ROUND_UP_TO(context->height, 2);
+
++ if (tempHeight == 0)
++ return FALSE;
++
++ if (tempWidth > context->priv->plane_buf_length / tempHeight)
++ return FALSE;
++
+ for (y = 0; y < tempHeight >> 1; y++)
+ {
+- co_dst = context->priv->plane_buf[1] + y * (tempWidth >> 1);
+- cg_dst = context->priv->plane_buf[2] + y * (tempWidth >> 1);
+- co_src0 = (INT8*) context->priv->plane_buf[1] + (y << 1) * tempWidth;
+- co_src1 = co_src0 + tempWidth;
+- cg_src0 = (INT8*) context->priv->plane_buf[2] + (y << 1) * tempWidth;
+- cg_src1 = cg_src0 + tempWidth;
++ BYTE* co_dst = context->priv->plane_buf[1] + y * (tempWidth >> 1);
++ BYTE* cg_dst = context->priv->plane_buf[2] + y * (tempWidth >> 1);
++ const INT8* co_src0 = (INT8*) context->priv->plane_buf[1] + (y << 1) * tempWidth;
++ const INT8* co_src1 = co_src0 + tempWidth;
++ const INT8* cg_src0 = (INT8*) context->priv->plane_buf[2] + (y << 1) * tempWidth;
++ const INT8* cg_src1 = cg_src0 + tempWidth;
+ for (x = 0; x < tempWidth >> 1; x++)
+ {
+ *co_dst++ = (BYTE) (((INT16) *co_src0 + (INT16) *(co_src0 + 1) +
+@@ -234,18 +250,28 @@ static void nsc_encode_subsampling(NSC_C
+ cg_src1 += 2;
+ }
+ }
++
++ return TRUE;
+ }
+
+-void nsc_encode(NSC_CONTEXT* context, BYTE* bmpdata, int rowstride)
++BOOL nsc_encode(NSC_CONTEXT* context, BYTE* bmpdata, int rowstride)
+ {
+- nsc_encode_argb_to_aycocg(context, bmpdata, rowstride);
++ if (!context || !bmpdata || (rowstride == 0))
++ return FALSE;
++
++ if (!nsc_encode_argb_to_aycocg(context, bmpdata, rowstride))
++ return FALSE;
++
+ if (context->nsc_stream.ChromaSubSamplingLevel > 0)
+ {
+- nsc_encode_subsampling(context);
++ if (!nsc_encode_subsampling(context))
++ return FALSE;
+ }
++
++ return TRUE;
+ }
+
+-static UINT32 nsc_rle_encode(BYTE* in, BYTE* out, UINT32 origsz)
++static UINT32 nsc_rle_encode(const BYTE* in, BYTE* out, UINT32 origsz)
+ {
+ UINT32 left;
+ UINT32 runlength = 1;
+Index: freerdp-1.1.0~git20140921.1.440916e+dfsg1/libfreerdp/codec/nsc_sse2.c
+===================================================================
+--- freerdp-1.1.0~git20140921.1.440916e+dfsg1.orig/libfreerdp/codec/nsc_sse2.c
++++ freerdp-1.1.0~git20140921.1.440916e+dfsg1/libfreerdp/codec/nsc_sse2.c
+@@ -333,13 +333,15 @@ static void nsc_encode_subsampling_sse2(
+ }
+ }
+
+-static void nsc_encode_sse2(NSC_CONTEXT* context, BYTE* bmpdata, int rowstride)
++static BOOL nsc_encode_sse2(NSC_CONTEXT* context, BYTE* bmpdata, int rowstride)
+ {
+ nsc_encode_argb_to_aycocg_sse2(context, bmpdata, rowstride);
+ if (context->nsc_stream.ChromaSubSamplingLevel > 0)
+ {
+ nsc_encode_subsampling_sse2(context);
+ }
++
++ return TRUE;
+ }
+
+ void nsc_init_sse2(NSC_CONTEXT* context)
+Index: freerdp-1.1.0~git20140921.1.440916e+dfsg1/libfreerdp/codec/nsc_encode.h
+===================================================================
+--- freerdp-1.1.0~git20140921.1.440916e+dfsg1.orig/libfreerdp/codec/nsc_encode.h
++++ freerdp-1.1.0~git20140921.1.440916e+dfsg1/libfreerdp/codec/nsc_encode.h
+@@ -20,6 +20,6 @@
+ #ifndef __NSC_ENCODE_H
+ #define __NSC_ENCODE_H
+
+-void nsc_encode(NSC_CONTEXT* context, BYTE* bmpdata, int rowstride);
++BOOL nsc_encode(NSC_CONTEXT* context, BYTE* bmpdata, int rowstride);
+
+ #endif
diff --git a/CVE-2018-8789.patch b/CVE-2018-8789.patch
new file mode 100644
index 000000000000..1aec14058174
--- /dev/null
+++ b/CVE-2018-8789.patch
@@ -0,0 +1,27 @@
+Backport of:
+
+From 2ee663f39dc8dac3d9988e847db19b2d7e3ac8c6 Mon Sep 17 00:00:00 2001
+From: Armin Novak <armin.novak@thincast.com>
+Date: Mon, 22 Oct 2018 16:00:03 +0200
+Subject: [PATCH] Fixed CVE-2018-8789
+
+Thanks to Eyal Itkin from Check Point Software Technologies.
+---
+ winpr/libwinpr/sspi/NTLM/ntlm_message.c | 24 +++++++++++++-----------
+ 1 file changed, 13 insertions(+), 11 deletions(-)
+
+Index: freerdp-1.1.0~git20140921.1.440916e+dfsg1/winpr/libwinpr/sspi/NTLM/ntlm_message.c
+===================================================================
+--- freerdp-1.1.0~git20140921.1.440916e+dfsg1.orig/winpr/libwinpr/sspi/NTLM/ntlm_message.c
++++ freerdp-1.1.0~git20140921.1.440916e+dfsg1/winpr/libwinpr/sspi/NTLM/ntlm_message.c
+@@ -146,6 +146,10 @@ void ntlm_read_message_fields_buffer(wSt
+ {
+ if (fields->Len > 0)
+ {
++ const UINT64 offset = (UINT64)fields->BufferOffset + (UINT64)fields->Len;
++
++ if (offset > Stream_Length(s))
++ return;
+ fields->Buffer = malloc(fields->Len);
+ Stream_SetPosition(s, fields->BufferOffset);
+ Stream_Read(s, fields->Buffer, fields->Len);
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..9877090ca63c
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,126 @@
+# Maintainer: Vladislav Petrov <ejiek@mail.ru>
+pkgname=freerdp-1.1.0
+_pkgname=freerdp
+pkgver=1.1.0
+pkgrel=1
+pkgdesc="Free RDP client version 1.1.0 with patches applied by Canonical for Ubuntu bionic version of package"
+arch=('i686' 'x86_64')
+url="http://freerdp.sourceforge.net"
+license=('GPL')
+depends=('openssl-1.0' 'libxcursor' 'libcups' 'alsa-lib' 'libxext' 'libxdamage'
+ 'ffmpeg' 'libxkbfile' 'libxinerama' 'libxv' 'libpulse')
+makedepends=('krb5' 'cmake' 'damageproto' 'xmlto' 'docbook-xsl')
+conflicts=('freerdp' 'freerdp-git')
+provides=('freerdp')
+source=(git+https://github.com/FreeRDP/FreeRDP.git#commit=440916eae2e07463912d5fe507677e67096eb083
+ 0001_fix-cmdline-parser.patch
+ 0002_handle-old-style-cmdline-options.patch
+ 0003_copy-data-when-adding-glyph-to-cache.patch
+ 0004_build-cmake-3.1-compatibility.patch
+ 0005_release-keys-when-xfreerdp-is-unfocused-to-prevent-s.patch
+ 0006_fix-null-cert-that-is-not-an-error.patch
+ 0007_Fix-build-failure-on-x32.patch
+ 0008-Fix-multiple-security-issues.patch
+ 0009-enable-TLS-12.patch
+ 1001_hide-internal-symbols.patch
+ 1002_update-pkg-config-file.patch
+ 1003_multi-arch-include-path.patch
+ 1004_64-bit-architectures.patch
+ 1005_parse-buffer-endianess.patch
+ 1006_test-unicode-endianess.patch
+ 1007_detect-arm-arch-correctly.patch
+ 1008_gcc-fPIC-on-arm64.patch
+ 1009_libusb-debug.patch
+ 1010_libudev-link.patch
+ 1011_ffmpeg-2.9.patch
+ 1012_typo-fix.patch
+ 1013_aligned_meminfo_alignment.patch
+ 2001_detect-ffmpeg-on-Debian.patch
+ CVE-2014-0791.patch
+ CVE-2018-8786.patch
+ CVE-2018-8787.patch
+ CVE-2018-8788.patch
+ CVE-2018-8789.patch
+ tsmf_ffmpeg.patch)
+md5sums=('SKIP'
+ 'fac4007e3e7c23b97f93c705d3f2b318'
+ 'b07a139fb9fe6bb58fce28cb6652ad5b'
+ '685b9b4ec76e05e21c4c0139ff799424'
+ '7ad9df81edee2b0f50b31c632ed3115e'
+ 'ef594eee59363853c344ec264127dffe'
+ '68be4cb0387223439304dbb8260c8f10'
+ '7355210711d6b31eef62cca6dcfb47b3'
+ 'e6f05798bcd88dedc4088c33ce0550e8'
+ 'a2b13ddd61b21457493321d6cb2fdea3'
+ '4b234f9fd511784b5afc8b509f2a55ca'
+ 'e2e046945d90738180a0a74ed1f5716e'
+ 'f8ffb6e5892a9f4779035a643c28a69b'
+ 'f45f4ccbb75bc375b66c1f26516638e4'
+ '4d806b51c39fb31d151dd1ad2d0d7bef'
+ 'b00de13c7d72b7140fc7979636446aac'
+ 'c6e549c8ab2db539daf780e999d5defa'
+ '081bef0c3443f2abb4509e8827f18404'
+ 'b189033a55f32fe940f1643b5a848480'
+ '50ce07e227a119cc14f68b1e9da6e502'
+ '2849fc753e757b3e28242327c6e592db'
+ '7c373a53c8506fd14c836c45bbeefddd'
+ '9d1d6b827a0d6b3f8fa308b85e6917bc'
+ '1fcc55173b3921698b711cccc9b6594a'
+ '30ce3d4083ac14ca1e2d77980a0f1af7'
+ 'd698f5e4e65363c8a0afc6f8c3375c09'
+ 'eb5c448d229d5e7825e2cfc6a6bea8e5'
+ '5d3b8f0eb6f7c14cadc8006fd2f396ee'
+ '39e69a6d8932a45769f24a0c5c99e1ec'
+ 'ce69a20d193e9aec0a2dedd55253405f')
+
+prepare() {
+ cd $srcdir/FreeRDP
+ patch -Np1 -i ../0001_fix-cmdline-parser.patch
+ patch -Np1 -i ../0002_handle-old-style-cmdline-options.patch
+ patch -Np1 -i ../0003_copy-data-when-adding-glyph-to-cache.patch
+ patch -Np1 -i ../0004_build-cmake-3.1-compatibility.patch
+ patch -Np1 -i ../0005_release-keys-when-xfreerdp-is-unfocused-to-prevent-s.patch
+ patch -Np1 -i ../0006_fix-null-cert-that-is-not-an-error.patch
+ patch -Np1 -i ../0007_Fix-build-failure-on-x32.patch
+ patch -Np1 -i ../0008-Fix-multiple-security-issues.patch
+ patch -Np1 -i ../0009-enable-TLS-12.patch
+ patch -Np1 -i ../1001_hide-internal-symbols.patch
+ patch -Np1 -i ../1002_update-pkg-config-file.patch
+ patch -Np1 -i ../1003_multi-arch-include-path.patch
+ patch -Np1 -i ../1004_64-bit-architectures.patch
+ patch -Np1 -i ../1005_parse-buffer-endianess.patch
+ patch -Np1 -i ../1006_test-unicode-endianess.patch
+ patch -Np1 -i ../1007_detect-arm-arch-correctly.patch
+ patch -Np1 -i ../1008_gcc-fPIC-on-arm64.patch
+ patch -Np1 -i ../1009_libusb-debug.patch
+ patch -Np1 -i ../1010_libudev-link.patch
+ patch -Np1 -i ../1011_ffmpeg-2.9.patch
+ patch -Np1 -i ../1012_typo-fix.patch
+ patch -Np1 -i ../1013_aligned_meminfo_alignment.patch
+ patch -Np1 -i ../2001_detect-ffmpeg-on-Debian.patch
+ patch -Np1 -i ../CVE-2014-0791.patch
+ patch -Np1 -i ../CVE-2018-8786.patch
+ patch -Np1 -i ../CVE-2018-8787.patch
+ patch -Np1 -i ../CVE-2018-8788.patch
+ patch -Np1 -i ../CVE-2018-8789.patch
+ patch -Np1 -i ../tsmf_ffmpeg.patch
+}
+
+build() {
+ cd $srcdir/FreeRDP
+ cmake \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_INSTALL_LIBDIR=lib \
+ -DWITH_PULSEAUDIO=ON \
+ -DOPENSSL_ROOT_DIR=/usr/lib/openssl-1.0 \
+ -DOPENSSL_SSL_LIBRARY=/usr/lib/openssl-1.0/libssl.so \
+ -DOPENSSL_CRYPTO_LIBRARY=/usr/lib/openssl-1.0/libcrypto.so \
+ -DOPENSSL_INCLUDE_DIR=/usr/include/openssl-1.0 \
+ .
+ make
+}
+
+package() {
+ cd $srcdir/FreeRDP
+ make DESTDIR="${pkgdir}" install
+}
diff --git a/tsmf_ffmpeg.patch b/tsmf_ffmpeg.patch
new file mode 100644
index 000000000000..920410697fd2
--- /dev/null
+++ b/tsmf_ffmpeg.patch
@@ -0,0 +1,13 @@
+--- a/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c 2019-06-10 12:32:12.499771340 +0300
++++ b/channels/tsmf/client/ffmpeg/tsmf_ffmpeg.c 2019-06-10 12:55:29.606403855 +0300
+@@ -206,8 +206,8 @@
+ }
+ }
+
+- if (mdecoder->codec->capabilities & CODEC_CAP_TRUNCATED)
+- mdecoder->codec_context->flags |= CODEC_FLAG_TRUNCATED;
++ if (mdecoder->codec->capabilities & AV_CODEC_CAP_TRUNCATED)
++ mdecoder->codec_context->flags |= AV_CODEC_FLAG_TRUNCATED;
+
+ return TRUE;
+ }