core: Fix status parsing for decrypt + verify
authorAndre Heinecke <aheinecke@intevation.de>
Thu, 27 Jul 2017 12:20:58 +0000 (14:20 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Thu, 27 Jul 2017 12:23:25 +0000 (14:23 +0200)
* src/decrypt.c (parse_status_error): Don't modify args.

--
Otherwise chained status handlers will not see the full args
which resulted in a parse error in the verify status handler.

GnuPG-Bug-Id: T3310

src/decrypt.c

index aa17771..eb7ec4d 100644 (file)
@@ -145,10 +145,18 @@ parse_status_error (char *args, op_data_t opd)
   gpgme_error_t err;
   char *field[3];
   int nfields;
+  char *args2;
 
-  nfields = _gpgme_split_fields (args, field, DIM (field));
+  if (!args)
+    return trace_gpg_error (GPG_ERR_INV_ENGINE);
+
+  args2 = strdup (args); /* Split modifies the input string. */
+  nfields = _gpgme_split_fields (args2, field, DIM (field));
   if (nfields < 1)
-    return trace_gpg_error (GPG_ERR_INV_ENGINE); /* Required arg missing.  */
+    {
+      free (args2);
+      return trace_gpg_error (GPG_ERR_INV_ENGINE); /* Required arg missing.  */
+    }
   err = nfields < 2 ? 0 : atoi (field[1]);
 
   if (!strcmp (field[0], "decrypt.algorithm"))
@@ -159,7 +167,10 @@ parse_status_error (char *args, op_data_t opd)
         {
           opd->result.unsupported_algorithm = strdup (field[2]);
           if (!opd->result.unsupported_algorithm)
-            return gpg_error_from_syserror ();
+            {
+              free (args2);
+              return gpg_error_from_syserror ();
+            }
         }
     }
   else if (!strcmp (field[0], "decrypt.keyusage"))
@@ -193,6 +204,7 @@ parse_status_error (char *args, op_data_t opd)
     }
 
 
+  free (args2);
   return 0;
 }