Unfortunately libssh2 doesn't support all types of host keys that can be
saved in the known_hosts file. Also it does not report that parsing of
the file failed. This results into truncated known_hosts files where the
standard client stores keys also in other formats (eg.
ecdsa-sha2-nistp256).
This patch changes the default location of the known_hosts file into the
libvirt private configuration directory, where it will be only written
by the libssh2 layer itself. This prevents thrashing user's files.
---
src/rpc/virnetclient.c | 17 ++++++++++-------
1 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c
index 8ff5e09..4ecc703 100644
--- a/src/rpc/virnetclient.c
+++ b/src/rpc/virnetclient.c
@@ -417,23 +417,25 @@ virNetClientPtr virNetClientNewLibSSH2(const char *host,
char *command = NULL;
char *homedir = virGetUserDirectory();
+ char *confdir = virGetUserConfigDirectory();
char *knownhosts = NULL;
char *privkey = NULL;
/* Use default paths for known hosts an public keys if not provided */
- if (homedir) {
+ if (confdir) {
if (!knownHostsPath) {
- virBufferAsprintf(&buf, "%s/.ssh/known_hosts", homedir);
- if (!(knownhosts = virBufferContentAndReset(&buf)))
- goto no_memory;
-
- if (!(virFileExists(knownhosts)))
- VIR_FREE(knownhosts);
+ if (virFileExists(confdir)) {
+ virBufferAsprintf(&buf, "%s/known_hosts", confdir);
+ if (!(knownhosts = virBufferContentAndReset(&buf)))
+ goto no_memory;
+ }
} else {
if (!(knownhosts = strdup(knownHostsPath)))
goto no_memory;
}
+ }
+ if (homedir) {
if (!privkeyPath) {
/* RSA */
virBufferAsprintf(&buf, "%s/.ssh/id_rsa", homedir);
@@ -501,6 +503,7 @@ cleanup:
VIR_FREE(privkey);
VIR_FREE(knownhosts);
VIR_FREE(homedir);
+ VIR_FREE(confdir);
VIR_FREE(nc);
virObjectUnref(sock);
return ret;
--
1.7.8.6