aboutsummaryrefslogtreecommitdiff
path: root/libssh/kex.c
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2009-04-07 19:37:45 +0000
committerAndreas Schneider <mail@cynapses.org>2009-04-07 19:37:45 +0000
commit586ed9103f4bc125acb7868b1242d971bdf6d7ef (patch)
tree2463e4d0253c1bf79e8ef53753c24e2969bf7edc /libssh/kex.c
parentd51dc0d80eba186a9439dade695a5169261366cd (diff)
downloadlibssh-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.c73
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 */