From 45c4a70c70978d3b5d6a02b27bcdf501da8185e4 Mon Sep 17 00:00:00 2001 From: Pino Toscano Date: Tue, 10 Jan 2017 19:43:19 +0100 Subject: [PATCH] remote: fix logic for known_hosts and keyfile checks If any of them is specified for the libssh and libssh2 drivers, there is no need to depend on checks based on other paths: in particular, a specified path for known_hosts was ignored if the local config directory could not be determined, and the path for keyfile was ignored if the home could not be determined. Instead, lazily determine and use these two paths only in case they are needed. --- src/rpc/virnetclient.c | 52 +++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index 34475d9277..9c781e3713 100644 --- a/src/rpc/virnetclient.c +++ b/src/rpc/virnetclient.c @@ -450,32 +450,34 @@ virNetClientPtr virNetClientNewLibSSH2(const char *host, char *nc = NULL; char *command = NULL; - char *homedir = virGetUserDirectory(); - char *confdir = virGetUserConfigDirectory(); + char *homedir = NULL; + char *confdir = NULL; char *knownhosts = NULL; char *privkey = NULL; /* Use default paths for known hosts an public keys if not provided */ - if (confdir) { - if (!knownHostsPath) { + if (knownHostsPath) { + if (VIR_STRDUP(knownhosts, knownHostsPath) < 0) + goto cleanup; + } else { + confdir = virGetUserConfigDirectory(); + if (confdir) { if (virFileExists(confdir)) { virBufferAsprintf(&buf, "%s/known_hosts", confdir); if (!(knownhosts = virBufferContentAndReset(&buf))) goto no_memory; } - } else { - if (VIR_STRDUP(knownhosts, knownHostsPath) < 0) - goto cleanup; } } - if (homedir) { - if (!privkeyPath) { + if (privkeyPath) { + if (VIR_STRDUP(privkey, privkeyPath) < 0) + goto cleanup; + } else { + homedir = virGetUserDirectory(); + if (homedir) { if (virNetClientFindDefaultSshKey(homedir, &privkey) < 0) goto no_memory; - } else { - if (VIR_STRDUP(privkey, privkeyPath) < 0) - goto cleanup; } } @@ -559,31 +561,33 @@ virNetClientPtr virNetClientNewLibssh(const char *host, char *nc = NULL; char *command = NULL; - char *homedir = virGetUserDirectory(); - char *confdir = virGetUserConfigDirectory(); + char *homedir = NULL; + char *confdir = NULL; char *knownhosts = NULL; char *privkey = NULL; /* Use default paths for known hosts an public keys if not provided */ - if (confdir) { - if (!knownHostsPath) { + if (knownHostsPath) { + if (VIR_STRDUP(knownhosts, knownHostsPath) < 0) + goto cleanup; + } else { + confdir = virGetUserConfigDirectory(); + if (confdir) { if (virFileExists(confdir)) { if (virAsprintf(&knownhosts, "%s/known_hosts", confdir) < 0) goto cleanup; } - } else { - if (VIR_STRDUP(knownhosts, knownHostsPath) < 0) - goto cleanup; } } - if (homedir) { - if (!privkeyPath) { + if (privkeyPath) { + if (VIR_STRDUP(privkey, privkeyPath) < 0) + goto cleanup; + } else { + homedir = virGetUserDirectory(); + if (homedir) { if (virNetClientFindDefaultSshKey(homedir, &privkey) < 0) goto no_memory; - } else { - if (VIR_STRDUP(privkey, privkeyPath) < 0) - goto cleanup; } } -- GitLab