diff mbox

[v3,4/7] Add error checking to vcard_emul_options.

Message ID 1426275924-1904-5-git-send-email-jwhite@codeweavers.com
State New
Headers show

Commit Message

Jeremy White March 13, 2015, 7:45 p.m. UTC
Also add an alias of 'nssemul' for the default card
of hw=yes hw_type=cac, and an alias of 'passthru' for
the new card type of hw=yes hw_type=passthru.

This allows the spice-gtk client to take a more human
friendly set of arguments and relay them through to this code.

Signed-off-by: Jeremy White <jwhite@codeweavers.com>
---
 libcacard/vcard_emul_nss.c |   49 ++++++++++++++++++++++++++++++++++----------
 1 file changed, 38 insertions(+), 11 deletions(-)

Comments

Marc-André Lureau March 25, 2015, 3:13 p.m. UTC | #1
ACK.

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

On Fri, Mar 13, 2015 at 8:45 PM, Jeremy White <jwhite@codeweavers.com> wrote:
> Also add an alias of 'nssemul' for the default card
> of hw=yes hw_type=cac, and an alias of 'passthru' for
> the new card type of hw=yes hw_type=passthru.
>
> This allows the spice-gtk client to take a more human
> friendly set of arguments and relay them through to this code.
>
> Signed-off-by: Jeremy White <jwhite@codeweavers.com>
> ---
>  libcacard/vcard_emul_nss.c |   49 ++++++++++++++++++++++++++++++++++----------
>  1 file changed, 38 insertions(+), 11 deletions(-)
>
> diff --git a/libcacard/vcard_emul_nss.c b/libcacard/vcard_emul_nss.c
> index 950edee..49f0bdf 100644
> --- a/libcacard/vcard_emul_nss.c
> +++ b/libcacard/vcard_emul_nss.c
> @@ -1113,17 +1113,13 @@ static VCardEmulOptions options;
>   * and its length in "token_length". "token" will not be nul-terminated.
>   * After calling the macro, "args" will be advanced to the beginning of
>   * the next token.
> - * This macro may call continue or break.
>   */
>  #define NEXT_TOKEN(token) \
>              (token) = args; \
>              args = strpbrk(args, ",)"); \
> -            if (*args == 0) { \
> -                break; \
> -            } \
> -            if (*args == ')') { \
> -                args++; \
> -                continue; \
> +            if (*args == 0 || *args == ')') { \
> +                fprintf(stderr, "Error: invalid soft specification.\n"); \
> +                return NULL; \
>              } \
>              (token##_length) = args - (token); \
>              args = strip(args+1);
> @@ -1141,6 +1137,7 @@ vcard_emul_options(const char *args)
>      do {
>          args = strip(args); /* strip off the leading spaces */
>          if (*args == ',') {
> +            args++;
>              continue;
>          }
>          /* soft=(slot_name,virt_name,emul_type,emul_flags,cert_1, (no eol)
> @@ -1159,7 +1156,8 @@ vcard_emul_options(const char *args)
>
>              args = strip(args + 5);
>              if (*args != '(') {
> -                continue;
> +                fprintf(stderr, "Error: invalid soft specification.\n");
> +                return NULL;
>              }
>              args = strip(args+1);
>
> @@ -1170,11 +1168,17 @@ vcard_emul_options(const char *args)
>              memcpy(type_str, type_params, type_params_length);
>              type_str[type_params_length] = '\0';
>              type = vcard_emul_type_from_string(type_str);
> +            if (type == VCARD_EMUL_NONE) {
> +                fprintf(stderr, "Error: invalid smartcard type '%s'.\n",
> +                        type_str);
> +                return NULL;
> +            }
>
>              NEXT_TOKEN(type_params)
>
>              if (*args == 0) {
> -                break;
> +                fprintf(stderr, "Error: missing cert specification.\n");
> +                return NULL;
>              }
>
>              if (opts->vreader_count >= reader_count) {
> @@ -1214,6 +1218,11 @@ vcard_emul_options(const char *args)
>          } else if (strncmp(args, "hw_type=", 8) == 0) {
>              args = strip(args+8);
>              opts->hw_card_type = vcard_emul_type_from_string(args);
> +            if (opts->hw_card_type == VCARD_EMUL_NONE) {
> +                fprintf(stderr, "Error: invalid smartcard type '%s'.\n",
> +                        args);
> +                return NULL;
> +            }
>              args = find_blank(args);
>          /* hw_params= */
>          } else if (strncmp(args, "hw_params=", 10) == 0) {
> @@ -1227,7 +1236,8 @@ vcard_emul_options(const char *args)
>              const char *db;
>              args = strip(args+3);
>              if (*args != '"') {
> -                continue;
> +                fprintf(stderr, "Error: you must quote the file path.\n");
> +                return NULL;
>              }
>              args++;
>              db = args;
> @@ -1236,8 +1246,21 @@ vcard_emul_options(const char *args)
>              if (*args != 0) {
>                  args++;
>              }
> +        } else if (strncmp(args, "nssemul", 7) == 0) {
> +            opts->hw_card_type = VCARD_EMUL_CAC;
> +            opts->use_hw = PR_TRUE;
> +            args = find_blank(args + 7);
> +        /* nssemul */
> +#if defined(CONFIG_SMARTCARD_PCSC)
> +        } else if (strncmp(args, "passthru", 8) == 0) {
> +            opts->hw_card_type = VCARD_EMUL_PASSTHRU;
> +            opts->use_hw = PR_TRUE;
> +            args = find_blank(args + 8);
> +        /* passthru */
> +#endif
>          } else {
> -            args = find_blank(args);
> +            fprintf(stderr, "Error: Unknown smartcard specification.\n");
> +            return NULL;
>          }
>      } while (*args != 0);
>
> @@ -1253,6 +1276,10 @@ vcard_emul_usage(void)
>  " use_hw=[yes|no]                 (default yes)\n"
>  " hw_type={card_type_to_emulate}  (default CAC)\n"
>  " hw_param={param_for_card}       (default \"\")\n"
> +" nssemul                         (alias for use_hw=yes, hw_type=CAC)\n"
> +#if defined(CONFIG_SMARTCARD_PCSC)
> +" passthru                        (alias for use_hw=yes, hw_type=PASSTHRU)\n"
> +#endif
>  " soft=({slot_name},{vreader_name},{card_type_to_emulate},{params_for_card},\n"
>  "       {cert1},{cert2},{cert3}    (default none)\n"
>  "\n"
> --
> 1.7.10.4
>
>
diff mbox

Patch

diff --git a/libcacard/vcard_emul_nss.c b/libcacard/vcard_emul_nss.c
index 950edee..49f0bdf 100644
--- a/libcacard/vcard_emul_nss.c
+++ b/libcacard/vcard_emul_nss.c
@@ -1113,17 +1113,13 @@  static VCardEmulOptions options;
  * and its length in "token_length". "token" will not be nul-terminated.
  * After calling the macro, "args" will be advanced to the beginning of
  * the next token.
- * This macro may call continue or break.
  */
 #define NEXT_TOKEN(token) \
             (token) = args; \
             args = strpbrk(args, ",)"); \
-            if (*args == 0) { \
-                break; \
-            } \
-            if (*args == ')') { \
-                args++; \
-                continue; \
+            if (*args == 0 || *args == ')') { \
+                fprintf(stderr, "Error: invalid soft specification.\n"); \
+                return NULL; \
             } \
             (token##_length) = args - (token); \
             args = strip(args+1);
@@ -1141,6 +1137,7 @@  vcard_emul_options(const char *args)
     do {
         args = strip(args); /* strip off the leading spaces */
         if (*args == ',') {
+            args++;
             continue;
         }
         /* soft=(slot_name,virt_name,emul_type,emul_flags,cert_1, (no eol)
@@ -1159,7 +1156,8 @@  vcard_emul_options(const char *args)
 
             args = strip(args + 5);
             if (*args != '(') {
-                continue;
+                fprintf(stderr, "Error: invalid soft specification.\n");
+                return NULL;
             }
             args = strip(args+1);
 
@@ -1170,11 +1168,17 @@  vcard_emul_options(const char *args)
             memcpy(type_str, type_params, type_params_length);
             type_str[type_params_length] = '\0';
             type = vcard_emul_type_from_string(type_str);
+            if (type == VCARD_EMUL_NONE) {
+                fprintf(stderr, "Error: invalid smartcard type '%s'.\n",
+                        type_str);
+                return NULL;
+            }
 
             NEXT_TOKEN(type_params)
 
             if (*args == 0) {
-                break;
+                fprintf(stderr, "Error: missing cert specification.\n");
+                return NULL;
             }
 
             if (opts->vreader_count >= reader_count) {
@@ -1214,6 +1218,11 @@  vcard_emul_options(const char *args)
         } else if (strncmp(args, "hw_type=", 8) == 0) {
             args = strip(args+8);
             opts->hw_card_type = vcard_emul_type_from_string(args);
+            if (opts->hw_card_type == VCARD_EMUL_NONE) {
+                fprintf(stderr, "Error: invalid smartcard type '%s'.\n",
+                        args);
+                return NULL;
+            }
             args = find_blank(args);
         /* hw_params= */
         } else if (strncmp(args, "hw_params=", 10) == 0) {
@@ -1227,7 +1236,8 @@  vcard_emul_options(const char *args)
             const char *db;
             args = strip(args+3);
             if (*args != '"') {
-                continue;
+                fprintf(stderr, "Error: you must quote the file path.\n");
+                return NULL;
             }
             args++;
             db = args;
@@ -1236,8 +1246,21 @@  vcard_emul_options(const char *args)
             if (*args != 0) {
                 args++;
             }
+        } else if (strncmp(args, "nssemul", 7) == 0) {
+            opts->hw_card_type = VCARD_EMUL_CAC;
+            opts->use_hw = PR_TRUE;
+            args = find_blank(args + 7);
+        /* nssemul */
+#if defined(CONFIG_SMARTCARD_PCSC)
+        } else if (strncmp(args, "passthru", 8) == 0) {
+            opts->hw_card_type = VCARD_EMUL_PASSTHRU;
+            opts->use_hw = PR_TRUE;
+            args = find_blank(args + 8);
+        /* passthru */
+#endif
         } else {
-            args = find_blank(args);
+            fprintf(stderr, "Error: Unknown smartcard specification.\n");
+            return NULL;
         }
     } while (*args != 0);
 
@@ -1253,6 +1276,10 @@  vcard_emul_usage(void)
 " use_hw=[yes|no]                 (default yes)\n"
 " hw_type={card_type_to_emulate}  (default CAC)\n"
 " hw_param={param_for_card}       (default \"\")\n"
+" nssemul                         (alias for use_hw=yes, hw_type=CAC)\n"
+#if defined(CONFIG_SMARTCARD_PCSC)
+" passthru                        (alias for use_hw=yes, hw_type=PASSTHRU)\n"
+#endif
 " soft=({slot_name},{vreader_name},{card_type_to_emulate},{params_for_card},\n"
 "       {cert1},{cert2},{cert3}    (default none)\n"
 "\n"