don't record duplicate IdentityFiles
authordjm <djm@openbsd.org>
Wed, 23 Apr 2014 12:42:34 +0000 (12:42 +0000)
committerdjm <djm@openbsd.org>
Wed, 23 Apr 2014 12:42:34 +0000 (12:42 +0000)
usr.bin/ssh/readconf.c

index 35dbd59..453a21c 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: readconf.c,v 1.218 2014/02/23 20:11:36 djm Exp $ */
+/* $OpenBSD: readconf.c,v 1.219 2014/04/23 12:42:34 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -336,6 +336,7 @@ add_identity_file(Options *options, const char *dir, const char *filename,
     int userprovided)
 {
        char *path;
+       int i;
 
        if (options->num_identity_files >= SSH_MAX_IDENTITY_FILES)
                fatal("Too many identity files specified (max %d)",
@@ -346,6 +347,16 @@ add_identity_file(Options *options, const char *dir, const char *filename,
        else
                (void)xasprintf(&path, "%.100s%.100s", dir, filename);
 
+       /* Avoid registering duplicates */
+       for (i = 0; i < options->num_identity_files; i++) {
+               if (options->identity_file_userprovided[i] == userprovided &&
+                   strcmp(options->identity_files[i], path) == 0) {
+                       debug2("%s: ignoring duplicate key %s", __func__, path);
+                       free(path);
+                       return;
+               }
+       }
+
        options->identity_file_userprovided[options->num_identity_files] =
            userprovided;
        options->identity_files[options->num_identity_files++] = path;