diff options
| author | Russell Belfer <rb@github.com> | 2013-07-10 09:20:46 -0700 |
|---|---|---|
| committer | Russell Belfer <rb@github.com> | 2013-07-10 09:20:46 -0700 |
| commit | 68bc49a158eb905d541f853c913dfc20916ef665 (patch) | |
| tree | f9bbfaaf84f423272d3a62f1583857a2710a4094 /src | |
| parent | b8cd7aa9f6990b80730c1d7ab85a0443c054ca0b (diff) | |
| parent | 08bf80fa2bf95e17af79a1da5832aefb275d9565 (diff) | |
| download | libgit2-68bc49a158eb905d541f853c913dfc20916ef665.tar.gz | |
Merge branch 'ssh-cred-fix' of tiennou/libgit2
Conflicts:
src/transports/ssh.c
Diffstat (limited to 'src')
| -rw-r--r-- | src/transports/ssh.c | 60 |
1 files changed, 35 insertions, 25 deletions
diff --git a/src/transports/ssh.c b/src/transports/ssh.c index 3ae23cbbf..0155dd745 100644 --- a/src/transports/ssh.c +++ b/src/transports/ssh.c @@ -146,8 +146,8 @@ static void ssh_stream_free(git_smart_subtransport_stream *stream) if (s->channel) { libssh2_channel_close(s->channel); - libssh2_channel_free(s->channel); - s->channel = NULL; + libssh2_channel_free(s->channel); + s->channel = NULL; } if (s->session) { @@ -202,7 +202,7 @@ static int git_ssh_extract_url_parts( char *colon, *at; const char *start; - colon = strchr(url, ':'); + colon = strchr(url, ':'); if (colon == NULL) { giterr_set(GITERR_NET, "Malformed URL: missing :"); @@ -226,8 +226,7 @@ static int git_ssh_extract_url_parts( static int _git_ssh_authenticate_session( LIBSSH2_SESSION* session, const char *user, - git_cred* cred -) + git_cred* cred) { int rc; do { @@ -267,33 +266,31 @@ static int _git_ssh_authenticate_session( default: rc = LIBSSH2_ERROR_AUTHENTICATION_FAILED; } - } while (LIBSSH2_ERROR_EAGAIN == rc || LIBSSH2_ERROR_TIMEOUT == rc); + } while (LIBSSH2_ERROR_EAGAIN == rc || LIBSSH2_ERROR_TIMEOUT == rc); - return rc; + return rc; } -static int _git_ssh_session_create -( +static int _git_ssh_session_create( LIBSSH2_SESSION** session, - gitno_socket socket -) + gitno_socket socket) { if (!session) { return -1; } LIBSSH2_SESSION* s = libssh2_session_init(); - if (!s) - return -1; + if (!s) + return -1; - int rc = 0; - do { - rc = libssh2_session_startup(s, socket.socket); - } while (LIBSSH2_ERROR_EAGAIN == rc || LIBSSH2_ERROR_TIMEOUT == rc); + int rc = 0; + do { + rc = libssh2_session_startup(s, socket.socket); + } while (LIBSSH2_ERROR_EAGAIN == rc || LIBSSH2_ERROR_TIMEOUT == rc); if (0 != rc) { - goto on_error; - } + goto on_error; + } libssh2_session_set_blocking(s, 1); @@ -345,13 +342,16 @@ static int _git_ssh_setup_conn( if (user && pass) { if (git_cred_userpass_plaintext_new(&t->cred, user, pass) < 0) goto on_error; - } else { + } else if (t->owner->cred_acquire_cb) { if (t->owner->cred_acquire_cb(&t->cred, t->owner->url, user, GIT_CREDTYPE_USERPASS_PLAINTEXT | GIT_CREDTYPE_SSH_KEYFILE_PASSPHRASE, t->owner->cred_acquire_payload) < 0) - return -1; + goto on_error; + } else { + giterr_set(GITERR_NET, "Cannot set up SSH connection without credentials"); + goto on_error; } assert(t->cred); @@ -359,15 +359,21 @@ static int _git_ssh_setup_conn( user = git__strdup(default_user); } - if (_git_ssh_session_create(&session, s->socket) < 0) + if (_git_ssh_session_create(&session, s->socket) < 0) { + giterr_set(GITERR_NET, "Failed to initialize SSH session"); goto on_error; + } - if (_git_ssh_authenticate_session(session, user, t->cred) < 0) + if (_git_ssh_authenticate_session(session, user, t->cred) < 0) { + giterr_set(GITERR_NET, "Failed to authenticate SSH session"); goto on_error; + } channel = libssh2_channel_open_session(session); - if (!channel) - goto on_error; + if (!channel) { + giterr_set(GITERR_NET, "Failed to open SSH channel"); + goto on_error; + } libssh2_channel_set_blocking(channel, 1); @@ -383,6 +389,10 @@ static int _git_ssh_setup_conn( return 0; on_error: + s->session = NULL; + s->channel = NULL; + t->current_stream = NULL; + if (*stream) ssh_stream_free(*stream); |
