diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-04-07 19:37:45 +0000 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-04-07 19:37:45 +0000 |
commit | 586ed9103f4bc125acb7868b1242d971bdf6d7ef (patch) | |
tree | 2463e4d0253c1bf79e8ef53753c24e2969bf7edc /libssh/kex.c | |
parent | d51dc0d80eba186a9439dade695a5169261366cd (diff) | |
download | libssh-586ed9103f4bc125acb7868b1242d971bdf6d7ef.tar.gz libssh-586ed9103f4bc125acb7868b1242d971bdf6d7ef.tar.xz libssh-586ed9103f4bc125acb7868b1242d971bdf6d7ef.zip |
Add return value and error checks to ssh_send_kex().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@422 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh/kex.c')
-rw-r--r-- | libssh/kex.c | 73 |
1 files changed, 53 insertions, 20 deletions
diff --git a/libssh/kex.c b/libssh/kex.c index 0d89f305..82b29db5 100644 --- a/libssh/kex.c +++ b/libssh/kex.c @@ -368,29 +368,62 @@ int set_kex(SSH_SESSION *session){ } /* this function only sends the predefined set of kex methods */ -/* TODO add return value! */ -void ssh_send_kex(SSH_SESSION *session, int server_kex){ - STRING *str; - int i=0; - KEX *kex=(server_kex ? &session->server_kex : &session->client_kex); - enter_function(); - buffer_add_u8(session->out_buffer,SSH2_MSG_KEXINIT); - buffer_add_data(session->out_buffer,kex->cookie,16); - if (hashbufout_add_cookie(session) < 0) { - return; +int ssh_send_kex(SSH_SESSION *session, int server_kex) { + KEX *kex = (server_kex ? &session->server_kex : &session->client_kex); + STRING *str = NULL; + int i; + + enter_function(); + + if (buffer_add_u8(session->out_buffer, SSH2_MSG_KEXINIT) < 0) { + goto error; + } + if (buffer_add_data(session->out_buffer, kex->cookie, 16) < 0) { + goto error; + } + + if (hashbufout_add_cookie(session) < 0) { + goto error; + } + + ssh_list_kex(session, kex); + + for (i = 0; i < 10; i++) { + str = string_from_char(kex->methods[i]); + if (str == NULL) { + goto error; + } + + if (buffer_add_ssh_string(session->out_hashbuf, str) < 0) { + goto error; } - ssh_list_kex(session, kex); - for(i=0;i<10;i++){ - str=string_from_char(kex->methods[i]); - buffer_add_ssh_string(session->out_hashbuf,str); - buffer_add_ssh_string(session->out_buffer,str); - free(str); + if (buffer_add_ssh_string(session->out_buffer, str) < 0) { + goto error; } - i=0; - buffer_add_u8(session->out_buffer,0); - buffer_add_u32(session->out_buffer,0); - packet_send(session); + string_free(str); + } + + if (buffer_add_u8(session->out_buffer, 0) < 0) { + goto error; + } + if (buffer_add_u32(session->out_buffer, 0) < 0) { + goto error; + } + + if (packet_send(session) != SSH_OK) { leave_function(); + return -1; + } + + leave_function(); + return 0; +error: + buffer_free(session->out_buffer); + buffer_free(session->out_hashbuf); + string_free(str); + + leave_function(); + return -1; } /* returns 1 if at least one of the name algos is in the default algorithms table */ |