Merge branch 'ssh-cred-fix' of tiennou/libgit2 Conflicts: src/transports/ssh.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
diff --git a/src/transports/ssh.c b/src/transports/ssh.c
index 3ae23cb..0155dd7 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);