]> granicus.if.org Git - curl/commitdiff
ssh: Handle successful SSH_USERAUTH_NONE
authorTyler Hall <tylerwhall@gmail.com>
Mon, 14 Oct 2013 20:24:17 +0000 (22:24 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 15 Oct 2013 18:53:09 +0000 (20:53 +0200)
According to the documentation for libssh2_userauth_list(), a NULL
return value is not necessarily an error. You must call
libssh2_userauth_authenticated() to determine if the SSH_USERAUTH_NONE
request was successful.

This fixes a segv when using sftp on a server that allows logins with an
empty password. When NULL was interpreted as an error, it would
free the session but not flag an error since the libssh2 errno would be
clear. This resulted in dereferencing a NULL session pointer.

Signed-off-by: Tyler Hall <tylerwhall@gmail.com>
lib/ssh.c

index c213225db4750a2c2fc36ca1166e7ed57b0d2001..79f58bbf3cc0842190bcb86af284cf01ef42699f 100644 (file)
--- a/lib/ssh.c
+++ b/lib/ssh.c
@@ -754,7 +754,13 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
                                              curlx_uztoui(strlen(conn->user)));
 
       if(!sshc->authlist) {
-        if((err = libssh2_session_last_errno(sshc->ssh_session)) ==
+        if(libssh2_userauth_authenticated(sshc->ssh_session)) {
+          sshc->authed = TRUE;
+          infof(data, "SSH user accepted with no authentication\n");
+          state(conn, SSH_AUTH_DONE);
+          break;
+        }
+        else if((err = libssh2_session_last_errno(sshc->ssh_session)) ==
            LIBSSH2_ERROR_EAGAIN) {
           rc = LIBSSH2_ERROR_EAGAIN;
           break;