agent: Fix saving with FORCE=1.
authorNIIBE Yutaka <gniibe@fsij.org>
Fri, 21 Oct 2016 01:57:29 +0000 (10:57 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Fri, 21 Oct 2016 01:57:29 +0000 (10:57 +0900)
* agent/findkey.c (agent_write_private_key): Recover from an error of
GPG_ERR_ENOENT when FORCE=1 and it is opened with "rb+".

--
Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
agent/findkey.c

index 23e94f0..162e8c2 100644 (file)
@@ -152,17 +152,30 @@ agent_write_private_key (const unsigned char *grip,
   if (!fp)
     {
       gpg_error_t tmperr = gpg_error_from_syserror ();
-      log_error ("can't create '%s': %s\n", fname, gpg_strerror (tmperr));
-      xfree (fname);
-      return tmperr;
-    }
 
-  /* See if an existing key is in extended format.  */
-  if (force)
+      if (force && gpg_err_code (tmperr) == GPG_ERR_ENOENT)
+        {
+          fp = es_fopen (fname, "wbx,mode=-rw");
+          if (!fp)
+            {
+              tmperr = gpg_error_from_syserror ();
+              goto error;
+            }
+        }
+      else
+        {
+        error:
+          log_error ("can't create '%s': %s\n", fname, gpg_strerror (tmperr));
+          xfree (fname);
+          return tmperr;
+        }
+    }
+  else if (force)
     {
       gpg_error_t rc;
       char first;
 
+      /* See if an existing key is in extended format.  */
       if (es_fread (&first, 1, 1, fp) != 1)
         {
           rc = gpg_error_from_syserror ();