Merge pull request #1509 from akallabeth/smartcard_fixes
authorMarc-André Moreau <marcandre.moreau@gmail.com>
Wed, 25 Sep 2013 15:37:26 +0000 (08:37 -0700)
committerMarc-André Moreau <marcandre.moreau@gmail.com>
Wed, 25 Sep 2013 15:37:26 +0000 (08:37 -0700)
Smartcard fixes

1  2 
channels/smartcard/client/smartcard_main.c
client/common/cmdline.c

@@@ -112,16 -112,13 +112,16 @@@ struct _SMARTCARD_IRP_WORKE
  };
  typedef struct _SMARTCARD_IRP_WORKER SMARTCARD_IRP_WORKER;
   
 -static void smartcard_process_irp_thread_func(SMARTCARD_IRP_WORKER* irpWorker)
 +static void *smartcard_process_irp_thread_func(SMARTCARD_IRP_WORKER* irpWorker)
  {
        smartcard_process_irp(irpWorker->smartcard, irpWorker->irp);
  
        CloseHandle(irpWorker->thread);
  
        free(irpWorker);
 +
 +      ExitThread(0);
 +      return NULL;
  }
  
  static void* smartcard_thread_func(void* arg)
@@@ -315,7 -312,7 +315,7 @@@ int DeviceServiceEntry(PDEVICE_SERVICE_
  {
        char* name;
        char* path;
-       int i, length;
+       int i, length, ck;
        RDPDR_SMARTCARD* device;
        SMARTCARD_DEVICE* smartcard;
  
        name = device->Name;
        path = device->Path;
  
-       if (name)
-       {
-               /* TODO: check if server supports sc redirect (version 5.1) */
-               smartcard = (SMARTCARD_DEVICE*) malloc(sizeof(SMARTCARD_DEVICE));
-               ZeroMemory(smartcard, sizeof(SMARTCARD_DEVICE));
+       /* TODO: check if server supports sc redirect (version 5.1) */
+       smartcard = (SMARTCARD_DEVICE*) malloc(sizeof(SMARTCARD_DEVICE));
+       ZeroMemory(smartcard, sizeof(SMARTCARD_DEVICE));
  
-               smartcard->device.type = RDPDR_DTYP_SMARTCARD;
-               smartcard->device.name = "SCARD";
-               smartcard->device.IRPRequest = smartcard_irp_request;
-               smartcard->device.Free = smartcard_free;
+       smartcard->device.type = RDPDR_DTYP_SMARTCARD;
+       smartcard->device.name = "SCARD";
+       smartcard->device.IRPRequest = smartcard_irp_request;
+       smartcard->device.Free = smartcard_free;
  
-               length = strlen(smartcard->device.name);
-               smartcard->device.data = Stream_New(NULL, length + 1);
+       length = strlen(smartcard->device.name);
+       smartcard->device.data = Stream_New(NULL, length + 1);
  
-               for (i = 0; i <= length; i++)
-                       Stream_Write_UINT8(smartcard->device.data, name[i] < 0 ? '_' : name[i]);
+       Stream_Write(smartcard->device.data, "SCARD", 6);
  
+       smartcard->name = NULL;
+       smartcard->path = NULL;
+       if (path)
+       {
                smartcard->path = path;
+               smartcard->name = name;
+       }
+       else if (name)
+       {
+               if (1 == sscanf(name, "%d", &ck))
+                       smartcard->path = name;
+               else
+                       smartcard->name = name;
+       }
  
-               smartcard->pIrpList = (PSLIST_HEADER) _aligned_malloc(sizeof(SLIST_HEADER), MEMORY_ALLOCATION_ALIGNMENT);
-               InitializeSListHead(smartcard->pIrpList);
+       smartcard->pIrpList = (PSLIST_HEADER) _aligned_malloc(sizeof(SLIST_HEADER), MEMORY_ALLOCATION_ALIGNMENT);
+       InitializeSListHead(smartcard->pIrpList);
  
-               smartcard->irpEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
-               smartcard->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
-               smartcard->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) smartcard_thread_func,
-                               smartcard, CREATE_SUSPENDED, NULL);
+       smartcard->irpEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+       smartcard->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+       smartcard->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) smartcard_thread_func,
+                       smartcard, CREATE_SUSPENDED, NULL);
  
-               smartcard->CompletionIds = list_new();
-               smartcard->CompletionIdsMutex = CreateMutex(NULL, FALSE, NULL);
+       smartcard->CompletionIds = list_new();
+       smartcard->CompletionIdsMutex = CreateMutex(NULL, FALSE, NULL);
  
-               pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*) smartcard);
+       pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*) smartcard);
  
-               ResumeThread(smartcard->thread);
-       }
+       ResumeThread(smartcard->thread);
  
        return 0;
  }
diff --combined client/common/cmdline.c
@@@ -86,7 -86,7 +86,7 @@@ COMMAND_LINE_ARGUMENT_A args[] 
        { "clipboard", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL, "Redirect clipboard" },
        { "serial", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, "tty", "Redirect serial device" },
        { "parallel", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "Redirect parallel device" },
-       { "smartcard", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "Redirect smartcard device" },
+       { "smartcard", COMMAND_LINE_VALUE_OPTIONAL, NULL, NULL, NULL, -1, NULL, "Redirect smartcard device" },
        { "printer", COMMAND_LINE_VALUE_OPTIONAL, NULL, NULL, NULL, -1, NULL, "Redirect printer device" },
        { "usb", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "Redirect USB device" },
        { "multitouch", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL, "Redirect multitouch input" },
@@@ -319,15 -319,15 +319,15 @@@ int freerdp_client_add_device_channel(r
        {
                RDPDR_SMARTCARD* smartcard;
  
-               if (count < 2)
+               if (count < 1)
                        return -1;
  
                smartcard = (RDPDR_SMARTCARD*) malloc(sizeof(RDPDR_SMARTCARD));
                ZeroMemory(smartcard, sizeof(RDPDR_SMARTCARD));
  
                smartcard->Type = RDPDR_DTYP_SMARTCARD;
-               smartcard->Name = _strdup(params[1]);
+               if (count > 1)
+                       smartcard->Name = _strdup(params[1]);
                if (count > 2)
                        smartcard->Path = _strdup(params[2]);
  
        {
                RDPDR_SERIAL* serial;
  
-               if (count < 2)
+               if (count < 1)
                        return -1;
  
                serial = (RDPDR_SERIAL*) malloc(sizeof(RDPDR_SERIAL));
                ZeroMemory(serial, sizeof(RDPDR_SERIAL));
  
                serial->Type = RDPDR_DTYP_SERIAL;
-               serial->Name = _strdup(params[1]);
-               serial->Path = _strdup(params[2]);
+               if (count > 1)
+                       serial->Name = _strdup(params[1]);
+               if (count > 2)
+                       serial->Path = _strdup(params[2]);
  
                freerdp_device_collection_add(settings, (RDPDR_DEVICE*) serial);
                settings->DeviceRedirection = TRUE;
        {
                RDPDR_PARALLEL* parallel;
  
-               if (count < 2)
+               if (count < 1)
                        return -1;
  
                parallel = (RDPDR_PARALLEL*) malloc(sizeof(RDPDR_PARALLEL));
                ZeroMemory(parallel, sizeof(RDPDR_PARALLEL));
  
                parallel->Type = RDPDR_DTYP_PARALLEL;
-               parallel->Name = _strdup(params[1]);
-               parallel->Path = _strdup(params[2]);
+               if (count > 1)
+                       parallel->Name = _strdup(params[1]);
+               if (count > 1)
+                       parallel->Path = _strdup(params[2]);
  
                freerdp_device_collection_add(settings, (RDPDR_DEVICE*) parallel);
                settings->DeviceRedirection = TRUE;
@@@ -424,6 -428,9 +428,9 @@@ char** freerdp_command_line_parse_comma
  
        nArgs = nCommas = 0;
  
+       if (!list)
+               return NULL;
        for (index = 0; list[index]; index++)
                nCommas += (list[index] == ',') ? 1 : 0;
  
@@@ -856,26 -863,6 +863,26 @@@ int freerdp_map_keyboard_layout_name_to
        return 0;
  }
  
 +int freerdp_detect_command_line_pre_filter(void* context, int index, int argc, LPCSTR* argv)
 +{
 +      int length;
 +
 +      if (index == 1)
 +      {
 +              length = strlen(argv[index]);
 +
 +              if (length > 4)
 +              {
 +                      if (_stricmp(&(argv[index])[length - 4], ".rdp") == 0)
 +                      {
 +                              return 1;
 +                      }
 +              }
 +      }
 +
 +      return 0;
 +}
 +
  int freerdp_detect_windows_style_command_line_syntax(int argc, char** argv, int* count)
  {
        int status;
        *count = 0;
        detect_status = 0;
        CommandLineClearArgumentsA(args);
 -      status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags, NULL, NULL, NULL);
 +
 +      status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags,
 +                      NULL, freerdp_detect_command_line_pre_filter, NULL);
 +
 +      if (status < 0)
 +              return status;
  
        arg = args;
  
@@@ -927,12 -909,7 +934,12 @@@ int freerdp_detect_posix_style_command_
        *count = 0;
        detect_status = 0;
        CommandLineClearArgumentsA(args);
 -      status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags, NULL, NULL, NULL);
 +
 +      status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags,
 +                      NULL, freerdp_detect_command_line_pre_filter, NULL);
 +
 +      if (status < 0)
 +              return status;
  
        arg = args;
  
@@@ -975,10 -952,8 +982,10 @@@ BOOL freerdp_client_detect_command_line
                *flags = COMMAND_LINE_SEPARATOR_COLON;
                *flags |= COMMAND_LINE_SIGIL_SLASH | COMMAND_LINE_SIGIL_PLUS_MINUS;
        }
 -      else
 +      else if (old_cli_status >= 0)
        {
 +              /* Ignore legacy parsing in case there is an error in the command line. */
 +
                if ((old_cli_status == 1) || ((old_cli_count > posix_cli_count) && (old_cli_status != -1)))
                {
                        *flags = COMMAND_LINE_SEPARATOR_SPACE;
@@@ -998,7 -973,12 +1005,7 @@@ int freerdp_client_command_line_status_
  {
        COMMAND_LINE_ARGUMENT_A* arg;
  
 -      if (status == COMMAND_LINE_STATUS_PRINT_HELP)
 -      {
 -              freerdp_client_print_command_line_help(argc, argv);
 -              return COMMAND_LINE_STATUS_PRINT_HELP;
 -      }
 -      else if (status == COMMAND_LINE_STATUS_PRINT_VERSION)
 +      if (status == COMMAND_LINE_STATUS_PRINT_VERSION)
        {
                freerdp_client_print_version();
                return COMMAND_LINE_STATUS_PRINT_VERSION;
  
                return COMMAND_LINE_STATUS_PRINT;
        }
 +      else if (status < 0)
 +      {
 +              freerdp_client_print_command_line_help(argc, argv);
 +              return COMMAND_LINE_STATUS_PRINT_HELP;
 +      }
  
        return 0;
  }
@@@ -1061,6 -1036,8 +1068,6 @@@ int freerdp_client_parse_command_line_a
        BOOL compatibility;
        COMMAND_LINE_ARGUMENT_A* arg;
  
 -      freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0);
 -
        compatibility = freerdp_client_detect_command_line(argc, argv, &flags);
  
        if (compatibility)
        else
        {
                CommandLineClearArgumentsA(args);
 +
                status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags, settings,
                                freerdp_client_command_line_pre_filter, freerdp_client_command_line_post_filter);
 +
 +              if (status < 0)
 +                      return status;
        }
  
  
                        settings->RemoteFxCodec = TRUE;
                        settings->FastPathOutput = TRUE;
                        settings->ColorDepth = 32;
 -                      settings->PerformanceFlags = PERF_FLAG_NONE;
                        settings->LargePointerFlag = TRUE;
                        settings->FrameMarkerCommandEnabled = TRUE;
                }
                }
                CommandLineSwitchDefault(arg)
                {
 -
                }
  
                CommandLineSwitchEnd(arg)
        }
        while ((arg = CommandLineFindNextArgumentA(arg)) != NULL);
  
 -      settings->PerformanceFlags = PERF_FLAG_NONE;
 -
 -      if (settings->AllowFontSmoothing)
 -              settings->PerformanceFlags |= PERF_ENABLE_FONT_SMOOTHING;
 -
 -      if (settings->AllowDesktopComposition)
 -              settings->PerformanceFlags |= PERF_ENABLE_DESKTOP_COMPOSITION;
 -
 -      if (settings->DisableWallpaper)
 -              settings->PerformanceFlags |= PERF_DISABLE_WALLPAPER;
 -
 -      if (settings->DisableFullWindowDrag)
 -              settings->PerformanceFlags |= PERF_DISABLE_FULLWINDOWDRAG;
 -
 -      if (settings->DisableMenuAnims)
 -              settings->PerformanceFlags |= PERF_DISABLE_MENUANIMATIONS;
 -
 -      if (settings->DisableThemes)
 -              settings->PerformanceFlags |= PERF_DISABLE_THEMING;
 +      freerdp_performance_flags_make(settings);
  
        if (settings->GatewayEnabled)
        {