diff options
| author | Anderson Toshiyuki Sasaki <ansasaki@redhat.com> | 2020-04-22 14:36:31 +0200 | 
|---|---|---|
| committer | Daniel Stenberg <daniel@haxx.se> | 2020-04-25 00:53:11 +0200 | 
| commit | 7bc709f670237fbee49e24bc96ec3f190b8fc539 (patch) | |
| tree | 16f3644cd9d698d6a019e524a1b345e8ed35c9fa /lib | |
| parent | 11091cd4d2e86a47164604bf0b58781da9c1297b (diff) | |
libssh: avoid options override by configuration files
Previously, options set explicitly through command line options could be
overridden by the configuration files parsed automatically when
ssh_connect() was called.
By calling ssh_options_parse_config() explicitly, the configuration
files are parsed before setting the options, avoiding the options
override.  Once the configuration files are parsed, the automatic
configuration parsing is not executed.
Fixes #4972
Closes #5283
Signed-off-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/vssh/libssh.c | 61 | 
1 files changed, 47 insertions, 14 deletions
diff --git a/lib/vssh/libssh.c b/lib/vssh/libssh.c index 54bc5e019..8988e2392 100644 --- a/lib/vssh/libssh.c +++ b/lib/vssh/libssh.c @@ -2149,6 +2149,7 @@ static CURLcode myssh_connect(struct connectdata *conn, bool *done)    CURLcode result;    curl_socket_t sock = conn->sock[FIRSTSOCKET];    struct Curl_easy *data = conn->data; +  int rc;    /* initialize per-handle data if not already */    if(!data->req.protop) @@ -2175,38 +2176,70 @@ static CURLcode myssh_connect(struct connectdata *conn, bool *done)      return CURLE_FAILED_INIT;    } -  ssh_options_set(ssh->ssh_session, SSH_OPTIONS_FD, &sock); +  rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_HOST, conn->host.name); +  if(rc != SSH_OK) { +    failf(data, "Could not set remote host"); +    return CURLE_FAILED_INIT; +  } + +  rc = ssh_options_parse_config(ssh->ssh_session, NULL); +  if(rc != SSH_OK) { +    infof(data, "Could not parse SSH configuration files"); +    /* ignore */ +  } + +  rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_FD, &sock); +  if(rc != SSH_OK) { +    failf(data, "Could not set socket"); +    return CURLE_FAILED_INIT; +  } -  if(conn->user) { +  if(conn->user && conn->user[0] != '\0') {      infof(data, "User: %s\n", conn->user); -    ssh_options_set(ssh->ssh_session, SSH_OPTIONS_USER, conn->user); +    rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_USER, conn->user); +    if(rc != SSH_OK) { +      failf(data, "Could not set user"); +      return CURLE_FAILED_INIT; +    }    }    if(data->set.str[STRING_SSH_KNOWNHOSTS]) {      infof(data, "Known hosts: %s\n", data->set.str[STRING_SSH_KNOWNHOSTS]); -    ssh_options_set(ssh->ssh_session, SSH_OPTIONS_KNOWNHOSTS, -                    data->set.str[STRING_SSH_KNOWNHOSTS]); +    rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_KNOWNHOSTS, +                         data->set.str[STRING_SSH_KNOWNHOSTS]); +    if(rc != SSH_OK) { +      failf(data, "Could not set known hosts file path"); +      return CURLE_FAILED_INIT; +    }    } -  ssh_options_set(ssh->ssh_session, SSH_OPTIONS_HOST, conn->host.name); -  if(conn->remote_port) -    ssh_options_set(ssh->ssh_session, SSH_OPTIONS_PORT, -                    &conn->remote_port); +  if(conn->remote_port) { +    rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_PORT, +                         &conn->remote_port); +    if(rc != SSH_OK) { +      failf(data, "Could not set remote port"); +      return CURLE_FAILED_INIT; +    } +  }    if(data->set.ssh_compression) { -    ssh_options_set(ssh->ssh_session, SSH_OPTIONS_COMPRESSION, -                    "zlib,zlib@openssh.com,none"); +    rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_COMPRESSION, +                         "zlib,zlib@openssh.com,none"); +    if(rc != SSH_OK) { +      failf(data, "Could not set compression"); +      return CURLE_FAILED_INIT; +    }    }    ssh->privkey = NULL;    ssh->pubkey = NULL;    if(data->set.str[STRING_SSH_PUBLIC_KEY]) { -    int rc = ssh_pki_import_pubkey_file(data->set.str[STRING_SSH_PUBLIC_KEY], -                                        &ssh->pubkey); +    rc = ssh_pki_import_pubkey_file(data->set.str[STRING_SSH_PUBLIC_KEY], +                                    &ssh->pubkey);      if(rc != SSH_OK) {        failf(data, "Could not load public key file"); -      /* ignore */ +      return CURLE_FAILED_INIT;      }    }  | 
