diff --git a/include/libssh/session.h b/include/libssh/session.h index 8b963066..88be7ff3 100644 --- a/include/libssh/session.h +++ b/include/libssh/session.h @@ -20,6 +20,8 @@ #ifndef SESSION_H_ #define SESSION_H_ +#include + #include "libssh/priv.h" #include "libssh/kex.h" #include "libssh/packet.h" @@ -217,6 +219,7 @@ struct ssh_session_struct { int gss_delegate_creds; int flags; int nodelay; + bool config_processed; } opts; /* counters */ ssh_counter socket_counter; diff --git a/src/client.c b/src/client.c index cfaacf8f..964251c0 100644 --- a/src/client.c +++ b/src/client.c @@ -526,6 +526,16 @@ int ssh_connect(ssh_session session) { return SSH_ERROR; } + /* If the system configuration files were not yet processed, do it now */ + if (!session->opts.config_processed) { + ret = ssh_options_parse_config(session, NULL); + if (ret != 0) { + ssh_set_error(session, SSH_FATAL, + "Failed to process system configuration files"); + return SSH_ERROR; + } + } + ret = ssh_options_apply(session); if (ret < 0) { ssh_set_error(session, SSH_FATAL, "Couldn't apply options"); diff --git a/src/options.c b/src/options.c index 576af075..a7bd4538 100644 --- a/src/options.c +++ b/src/options.c @@ -1335,6 +1335,8 @@ int ssh_options_parse_config(ssh_session session, const char *filename) { r = ssh_config_parse_file(session, "/etc/ssh/ssh_config"); } + /* Do not process the default configuration as part of connection again */ + session->opts.config_processed = true; out: free(expanded_filename); return r; diff --git a/tests/client/torture_connect.c b/tests/client/torture_connect.c index 23f14a96..71d0bf07 100644 --- a/tests/client/torture_connect.c +++ b/tests/client/torture_connect.c @@ -68,6 +68,7 @@ static int session_setup(void **state) assert_non_null(s->ssh.session); ssh_options_set(s->ssh.session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity); + ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, BLACKHOLE); return 0; }