From ae4265d3048b1bd5d417980aabf1c180ab2a81e1 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 2 Apr 2009 09:24:46 +0000 Subject: [PATCH] Add a return value to ssh_userauth_kbdint_setanswer(). git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@341 7dcaeef0-15fb-0310-b436-a5af3365683c --- build/build_make.sh | 2 +- include/libssh/libssh.h | 3 ++- libssh/auth.c | 36 +++++++++++++++++++++++------------- 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); + return -1; } - if(session->kbdint->answers[i]){ - burn(session->kbdint->answers[i]); - free(session->kbdint->answers[i]); - } - 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; } /** @} */ diff --git a/sample.c b/sample.c index 002c326a..20b19c72 100644 --- a/sample.c +++ b/sample.c @@ -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);