Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock
Please consider unblocking planned upload of package freerdp. + [ Bernhard Miklautz ] + * debian/patches: + + Add patch 0001_fix-cmdline-parser.patch (picked from upstream). + Fix and improve command line parser. (Closes: #759361). -> Bernhard Miklautz (upstream freerdp) was so kind to provide a patch for getting the reported Segfault behaviour (#759361) resolved for Debian jessie. I hope for acceptance of this patch. + [ Mike Gabriel ] + * debian/copyright: + + Mention new file client/common/test/TestClientCmdLine.c. + The patch adds a new test file, that I added to the file lists in debian/changelog. light+love, Mike unblock freerdp/1.1.0~git20140921.1.440916e+dfsg1-3 -- System Information: Debian Release: 8.0 APT prefers stable APT policy: (990, 'stable'), (500, 'testing-updates'), (500, 'testing-proposed-updates'), (500, 'testing') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 3.16.0-4-amd64 (SMP w/4 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: sysvinit (via /sbin/init)
diff -Nru freerdp-1.1.0~git20140921.1.440916e+dfsg1/debian/changelog freerdp-1.1.0~git20140921.1.440916e+dfsg1/debian/changelog --- freerdp-1.1.0~git20140921.1.440916e+dfsg1/debian/changelog 2014-10-07 22:43:05.000000000 +0200 +++ freerdp-1.1.0~git20140921.1.440916e+dfsg1/debian/changelog 2015-02-13 06:02:21.000000000 +0100 @@ -1,3 +1,16 @@ +freerdp (1.1.0~git20140921.1.440916e+dfsg1-3) unstable; urgency=medium + + [ Bernhard Miklautz ] + * debian/patches: + + Add patch 0001_fix-cmdline-parser.patch (picked from upstream). + Fix and improve command line parser. (Closes: #759361). + + [ Mike Gabriel ] + * debian/copyright: + + Mention new file client/common/test/TestClientCmdLine.c. + + -- Mike Gabriel <sunwea...@debian.org> Fri, 13 Feb 2015 05:30:13 +0100 + freerdp (1.1.0~git20140921.1.440916e+dfsg1-2) unstable; urgency=medium * debian/control: diff -Nru freerdp-1.1.0~git20140921.1.440916e+dfsg1/debian/copyright freerdp-1.1.0~git20140921.1.440916e+dfsg1/debian/copyright --- freerdp-1.1.0~git20140921.1.440916e+dfsg1/debian/copyright 2014-09-22 21:58:42.000000000 +0200 +++ freerdp-1.1.0~git20140921.1.440916e+dfsg1/debian/copyright 2015-02-13 05:28:29.000000000 +0100 @@ -836,6 +836,7 @@ channels/sample/client/server_chan_test.cpp client/X11/generate_argument_docbook.c client/common/test/TestClientChannels.c + client/common/test/TestClientCmdLine.c client/common/test/TestClientRdpFile.c libfreerdp/dummy.c libfreerdp/gdi/test/TestGdiRop3.c diff -Nru freerdp-1.1.0~git20140921.1.440916e+dfsg1/debian/patches/0001_fix-cmdline-parser.patch freerdp-1.1.0~git20140921.1.440916e+dfsg1/debian/patches/0001_fix-cmdline-parser.patch --- freerdp-1.1.0~git20140921.1.440916e+dfsg1/debian/patches/0001_fix-cmdline-parser.patch 1970-01-01 01:00:00.000000000 +0100 +++ freerdp-1.1.0~git20140921.1.440916e+dfsg1/debian/patches/0001_fix-cmdline-parser.patch 2015-02-13 05:23:40.000000000 +0100 @@ -0,0 +1,360 @@ +Description: Command line parser fixes. +Author: Bernhard Miklautz <bernhard.mikla...@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 -Nru freerdp-1.1.0~git20140921.1.440916e+dfsg1/debian/patches/series freerdp-1.1.0~git20140921.1.440916e+dfsg1/debian/patches/series --- freerdp-1.1.0~git20140921.1.440916e+dfsg1/debian/patches/series 2014-10-07 22:42:12.000000000 +0200 +++ freerdp-1.1.0~git20140921.1.440916e+dfsg1/debian/patches/series 2015-02-13 05:21:05.000000000 +0100 @@ -7,3 +7,4 @@ 1007_detect-arm-arch-correctly.patch 1008_gcc-fPIC-on-arm64.patch 2001_detect-ffmpeg-on-Debian.patch +0001_fix-cmdline-parser.patch