fix smartcard argument parsing
authordodo040 <dorian.ducournau@gmail.com>
Tue, 20 Jun 2017 15:59:58 +0000 (17:59 +0200)
committerdodo040 <dorian.ducournau@gmail.com>
Wed, 19 Jul 2017 11:16:08 +0000 (13:16 +0200)
client/common/cmdline.c
winpr/libwinpr/smartcard/smartcard_pcsc.c

index bdd9b40..147b9f9 100644 (file)
@@ -863,18 +863,18 @@ static int freerdp_client_command_line_post_filter(void* context,
                {
                        char** p;
                        int count;
-                       p = freerdp_command_line_parse_comma_separated_values_offset(arg->Value, &count);
+                       p = freerdp_command_line_parse_comma_separated_values_offset(arg->Value,
+                               &count);
                        p[0] = "smartcard";
                        status = freerdp_client_add_device_channel(settings, count, p);
                        free(p);
                }
                else
                {
-                       char* p[2];
+                       char* p[1];
                        int count;
-                       count = 2;
+                       count = 1;
                        p[0] = "smartcard";
-                       p[1] = "";
                        status = freerdp_client_add_device_channel(settings, count, p);
                }
        }
index b1c4dce..70d5a6a 100644 (file)
@@ -768,27 +768,33 @@ int PCSC_RedirectReader(char* readerName)
                {
                        if (strcmp(name, "") == 0)
                        {
-                               return 0;
+                               return 1;
                        }
 
                        if (strncmp(readerName, name, strlen(readerName)) == 0)
                        {
-                               return 0;
+                               return 1;
                        }
                }
+               else
+               {
+                       return 2;
+               }
        }
 
-       return -1;
+       return 0;
 }
 
 char* PCSC_ConvertReaderNamesToWinSCard(const char* names, LPDWORD pcchReaders)
 {
+       int ret=0;
        int length;
        char* p, *q;
        DWORD cchReaders;
        char* nameWinSCard;
        char* namesWinSCard;
        BOOL endReaderName = FALSE;
+       BOOL allReaders=FALSE;
        p = (char*) names;
        cchReaders = *pcchReaders;
        namesWinSCard = (char*) malloc(cchReaders * 2);
@@ -807,11 +813,17 @@ char* PCSC_ConvertReaderNamesToWinSCard(const char* names, LPDWORD pcchReaders)
                {
                        length = strlen(nameWinSCard);
 
-                       if (PCSC_RedirectReader(nameWinSCard) == 0)
+                       ret = PCSC_RedirectReader(nameWinSCard);
+                       if ( ret == 1 )
                        {
                                CopyMemory(q, nameWinSCard, length);
                                endReaderName = TRUE;
                        }
+                       else if( ret == 2 )
+                       {
+                               CopyMemory(q, nameWinSCard, length);
+                               allReaders = TRUE;
+                       }
 
                        free(nameWinSCard);
                }
@@ -828,6 +840,12 @@ char* PCSC_ConvertReaderNamesToWinSCard(const char* names, LPDWORD pcchReaders)
                        q++;
                        endReaderName = FALSE;
                }
+               else if (allReaders)
+               {
+                       q += length;
+                       *q = '\0';
+                       q++;
+               }
 
                p += strlen(p) + 1;
        }