diff options
-rwxr-xr-x | build/build_make.sh | 2 | ||||
-rw-r--r-- | include/libssh/libssh.h | 3 | ||||
-rw-r--r-- | libssh/auth.c | 36 | ||||
-rw-r--r-- | sample.c | 8 |
4 files changed, 32 insertions, 17 deletions
diff --git a/build/build_make.sh b/build/build_make.sh index f9e7508c..04a310af 100755 --- a/build/build_make.sh +++ b/build/build_make.sh @@ -57,7 +57,7 @@ echo "Usage: `basename $0` [--prefix /install_prefix|--build [debug|final]|--cle cd ${BUILDDIR} -OPTIONS="--graphviz=${BUILDDIR}/libssh.dot -DUNIT_TESTING=ON -DWITH_STATIC_LIB=ON" +OPTIONS="--graphviz=${BUILDDIR}/libssh.dot -DUNIT_TESTING=ON" while test -n "$1"; do PARAM="$1" diff --git a/include/libssh/libssh.h b/include/libssh/libssh.h index c89e31b5..d6d02dfb 100644 --- a/include/libssh/libssh.h +++ b/include/libssh/libssh.h @@ -371,7 +371,8 @@ int ssh_userauth_kbdint_getnprompts(SSH_SESSION *session); char *ssh_userauth_kbdint_getname(SSH_SESSION *session); char *ssh_userauth_kbdint_getinstruction(SSH_SESSION *session); char *ssh_userauth_kbdint_getprompt(SSH_SESSION *session, unsigned int i, char *echo); -void ssh_userauth_kbdint_setanswer(SSH_SESSION *session, unsigned int i, const char *answer); +int ssh_userauth_kbdint_setanswer(SSH_SESSION *session, unsigned int i, + const char *answer); /* init.c */ diff --git a/libssh/auth.c b/libssh/auth.c index d449f711..75692a47 100644 --- a/libssh/auth.c +++ b/libssh/auth.c @@ -1017,23 +1017,33 @@ char *ssh_userauth_kbdint_getprompt(SSH_SESSION *session, unsigned int i, * \param session ssh session * \param i index number of the ith prompt * \param answer answer to give to server + * \return 0 on success, < 0 on error. */ +int ssh_userauth_kbdint_setanswer(SSH_SESSION *session, unsigned int i, + const char *answer) { + if (i > session->kbdint->nprompts) { + return -1; + } -void ssh_userauth_kbdint_setanswer(SSH_SESSION *session, unsigned int i, const char *answer){ - if (i>session->kbdint->nprompts) - return; + if (session->kbdint->answers == NULL) { + session->kbdint->answers = malloc(sizeof(char*) * session->kbdint->nprompts); if (session->kbdint->answers == NULL) { - session->kbdint->answers = malloc(sizeof(char*) * session->kbdint->nprompts); - if (session->kbdint->answers == NULL) { - return; - } - memset(session->kbdint->answers, 0, sizeof(char *) * session->kbdint->nprompts); - } - if(session->kbdint->answers[i]){ - burn(session->kbdint->answers[i]); - free(session->kbdint->answers[i]); + return -1; } - session->kbdint->answers[i]=strdup(answer); + memset(session->kbdint->answers, 0, sizeof(char *) * session->kbdint->nprompts); + } + + if (session->kbdint->answers[i]) { + burn(session->kbdint->answers[i]); + SAFE_FREE(session->kbdint->answers[i]); + } + + session->kbdint->answers[i] = strdup(answer); + if (session->kbdint->answers[i] == NULL) { + return -1; + } + + return 0; } /** @} */ @@ -385,11 +385,15 @@ static int auth_kbdint(SSH_SESSION *session){ buffer[sizeof(buffer)-1]=0; if((ptr=strchr(buffer,'\n'))) *ptr=0; - ssh_userauth_kbdint_setanswer(session,i,buffer); + if (ssh_userauth_kbdint_setanswer(session,i,buffer) < 0) { + return SSH_AUTH_ERROR; + } memset(buffer,0,strlen(buffer)); } else { ptr=getpass(prompt); - ssh_userauth_kbdint_setanswer(session,i,ptr); + if (ssh_userauth_kbdint_setanswer(session,i,ptr) < 0) { + return SSH_AUTH_ERROR; + } } } err=ssh_userauth_kbdint(session,NULL,NULL); |