diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-04-02 09:31:02 +0000 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-04-02 09:31:02 +0000 |
commit | d60783eeb7cb53b08b96b12114b6d88bab1bbf8f (patch) | |
tree | dba58e58fa31c04976c45b8ece28072575e9e1c7 /libssh/client.c | |
parent | ae4265d3048b1bd5d417980aabf1c180ab2a81e1 (diff) | |
download | libssh-d60783eeb7cb53b08b96b12114b6d88bab1bbf8f.tar.gz libssh-d60783eeb7cb53b08b96b12114b6d88bab1bbf8f.tar.xz libssh-d60783eeb7cb53b08b96b12114b6d88bab1bbf8f.zip |
Improve ssh_send_banner() and add error checking of strdup.
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@342 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh/client.c')
-rw-r--r-- | libssh/client.c | 59 |
1 files changed, 40 insertions, 19 deletions
diff --git a/libssh/client.c b/libssh/client.c index 76645e5..eee7279 100644 --- a/libssh/client.c +++ b/libssh/client.c @@ -50,7 +50,11 @@ char *ssh_get_banner(SSH_SESSION *session){ buffer[i] = 0; if (buffer[i] == '\n') { buffer[i] = 0; - ret= strdup(buffer); + ret = strdup(buffer); + if (ret == NULL) { + leave_function(); + return NULL; + } leave_function(); return ret; } @@ -91,26 +95,43 @@ static int ssh_analyze_banner(SSH_SESSION *session, int *ssh1, int *ssh2){ return 0; } -/** \internal - * \brief ssh_send_banner sends a SSH banner to the server +/** @internal + * @brief Sends a SSH banner to the server. + * + * @param session The SSH session to use. + * + * @param server Send client or server banner. + * + * @return 0 on success, < 0 on error. */ +int ssh_send_banner(SSH_SESSION *session, int server) { + const char *banner; + char buffer[128] = {0}; -int ssh_send_banner(SSH_SESSION *session,int server){ - char *banner; - char buffer[128]; - enter_function(); - banner=session->version==1?CLIENTBANNER1:CLIENTBANNER2; - if(session->options->banner) - banner=session->options->banner; - if(server) - session->serverbanner=strdup(banner); - else - session->clientbanner=strdup(banner); - snprintf(buffer,128,"%s\r\n",banner); - ssh_socket_write(session->socket,buffer,strlen(buffer)); - ssh_socket_blocking_flush(session->socket); - leave_function(); - return 0; + enter_function(); + banner = session->version == 1 ? CLIENTBANNER1 : CLIENTBANNER2; + + if (session->options->banner) { + banner=session->options->banner; + } + + if (server) { + session->serverbanner = strdup(banner); + if (session->serverbanner == NULL) { + return -1; + } + } else { + session->clientbanner = strdup(banner); + if (session->clientbanner == NULL) { + return -1; + } + } + snprintf(buffer, 128, "%s\r\n", banner); + ssh_socket_write(session->socket, buffer, strlen(buffer)); + ssh_socket_blocking_flush(session->socket); + leave_function(); + + return 0; } #define DH_STATE_INIT 0 |