g10: Fix use-after-free.
[gnupg.git] / g10 / migrate.c
index 9a21cfe..6ff1014 100644 (file)
@@ -14,7 +14,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
-#include <assert.h>
+#include <unistd.h>
 
 #include "gpg.h"
 #include "options.h"
 #include "keydb.h"
 #include "util.h"
 #include "main.h"
+#include "call-agent.h"
 
 
 #ifdef HAVE_DOSISH_SYSTEM
@@ -46,11 +47,12 @@ migrate_secring (ctrl_t ctrl)
   dotlock_t lockhd = NULL;
   char *secring = NULL;
   char *flagfile = NULL;
+  char *agent_version = NULL;
 
-  secring = make_filename (opt.homedir, "secring" EXTSEP_S "gpg", NULL);
+  secring = make_filename (gnupg_homedir (), "secring" EXTSEP_S "gpg", NULL);
   if (access (secring, F_OK))
     goto leave; /* Does not exist or is not readable.  */
-  flagfile = make_filename (opt.homedir, V21_MIGRATION_FNAME, NULL);
+  flagfile = make_filename (gnupg_homedir (), V21_MIGRATION_FNAME, NULL);
   if (!access (flagfile, F_OK))
     goto leave; /* Does exist - fine.  */
 
@@ -72,6 +74,28 @@ migrate_secring (ctrl_t ctrl)
       goto leave;
     }
 
+  if (!agent_get_version (ctrl, &agent_version))
+    {
+      if (!gnupg_compare_version (agent_version, "2.1.0"))
+        {
+          log_error ("error: GnuPG agent version \"%s\" is too old. ",
+                     agent_version);
+          log_info ("Please make sure that a recent gpg-agent is running.\n");
+          log_info ("(restarting the user session may achieve this.)\n");
+          log_info ("migration aborted\n");
+          xfree (agent_version);
+          goto leave;
+        }
+      xfree (agent_version);
+    }
+  else
+    {
+      log_error ("error: GnuPG agent unusable. "
+                 "Please check that a GnuPG agent can be started.\n");
+      log_error ("migration aborted\n");
+      goto leave;
+    }
+
   log_info ("porting secret keys from '%s' to gpg-agent\n", secring);
   if (!import_old_secring (ctrl, secring))
     {