diff options
author | Simo Sorce <simo@redhat.com> | 2017-04-25 19:19:13 +0000 |
---|---|---|
committer | Lukas Slebodnik <lslebodn@redhat.com> | 2017-04-28 19:10:22 +0200 |
commit | 244adc327f7e29ba2c7ef60bc9f732d8fe3e68c9 (patch) | |
tree | 8b67e52dce03032d3c02037313d781aa2c4f22f7 | |
parent | 5f6232c7e6d9635c1d6b6b09f799309b6094b143 (diff) | |
download | sssd-244adc327f7e29ba2c7ef60bc9f732d8fe3e68c9.tar.gz sssd-244adc327f7e29ba2c7ef60bc9f732d8fe3e68c9.tar.xz sssd-244adc327f7e29ba2c7ef60bc9f732d8fe3e68c9.zip |
ssh tools: Split connect and communication phases
We can fallback after a connect error, but we cannot easily fall back
once we start sending data as we may have consumed part of the buffer so
reconnecting and sending what's left would not make sense.
Therefore we now fallback on connect errors, but we issue a hard fail if
error happens after communication has been established.
Resolves:
https://pagure.io/SSSD/sssd/issue/1498
Merges: https://pagure.io/SSSD/sssd/pull-request/3383
Signed-off-by: Simo Sorce <simo@redhat.com>
Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
-rw-r--r-- | src/sss_client/ssh/sss_ssh_knownhostsproxy.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/src/sss_client/ssh/sss_ssh_knownhostsproxy.c b/src/sss_client/ssh/sss_ssh_knownhostsproxy.c index b7b0c3bb6..976ba86b3 100644 --- a/src/sss_client/ssh/sss_ssh_knownhostsproxy.c +++ b/src/sss_client/ssh/sss_ssh_knownhostsproxy.c @@ -40,14 +40,10 @@ /* connect to server using socket */ static int -connect_socket(int family, struct sockaddr *addr, size_t addr_len) +connect_socket(int family, struct sockaddr *addr, size_t addr_len, int *sd) { int flags; int sock = -1; - struct pollfd fds[2]; - char buffer[BUFFER_SIZE]; - int i; - ssize_t res; int ret; /* set O_NONBLOCK on standard input */ @@ -85,6 +81,22 @@ connect_socket(int family, struct sockaddr *addr, size_t addr_len) goto done; } + *sd = sock; + +done: + if (ret != 0 && sock >= 0) close(sock); + return ret; +} + +static int proxy_data(int sock) +{ + int flags; + struct pollfd fds[2]; + char buffer[BUFFER_SIZE]; + int i; + ssize_t res; + int ret; + /* set O_NONBLOCK on the socket */ flags = fcntl(sock, F_GETFL); if (flags == -1) { @@ -158,8 +170,7 @@ connect_socket(int family, struct sockaddr *addr, size_t addr_len) } done: - if (sock >= 0) close(sock); - + close(sock); return ret; } @@ -297,8 +308,11 @@ int main(int argc, const char **argv) } else if (ai) { /* Try all IP addresses before giving up */ for (struct addrinfo *ti = ai; ti != NULL; ti = ti->ai_next) { - ret = connect_socket(ti->ai_family, ti->ai_addr, ti->ai_addrlen); + int socket_descriptor = -1; + ret = connect_socket(ti->ai_family, ti->ai_addr, ti->ai_addrlen, + &socket_descriptor); if (ret == 0) { + ret = proxy_data(socket_descriptor); break; } } |