diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-04-09 14:33:12 +0000 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-04-09 14:33:12 +0000 |
commit | 926375e8aa87902459a342c9fefcc81595f360cf (patch) | |
tree | e14b7970c50d1dcbefd29c3f3c8d0f1791905b3a /libssh/messages.c | |
parent | a8bb3024e809c37be8c9598387564672b954e1da (diff) | |
download | libssh-926375e8aa87902459a342c9fefcc81595f360cf.tar.gz libssh-926375e8aa87902459a342c9fefcc81595f360cf.tar.xz libssh-926375e8aa87902459a342c9fefcc81595f360cf.zip |
Add error checking to ssh_message_channel_request_open_reply_accept().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@446 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh/messages.c')
-rw-r--r-- | libssh/messages.c | 83 |
1 files changed, 54 insertions, 29 deletions
diff --git a/libssh/messages.c b/libssh/messages.c index 7721cbd..0af88cc 100644 --- a/libssh/messages.c +++ b/libssh/messages.c @@ -324,6 +324,7 @@ static SSH_MESSAGE *handle_channel_request_open(SSH_SESSION *session) { msg = message_new(session); if (msg == NULL) { + leave_function(); return NULL; } @@ -371,37 +372,61 @@ error: return NULL; } -CHANNEL *ssh_message_channel_request_open_reply_accept(SSH_MESSAGE *msg){ - SSH_SESSION *session=msg->session; - CHANNEL *chan; +CHANNEL *ssh_message_channel_request_open_reply_accept(SSH_MESSAGE *msg) { + SSH_SESSION *session = msg->session; + CHANNEL *chan = NULL; - enter_function(); - chan=channel_new(session); - if (chan == NULL) { - leave_function(); - return NULL; - } - chan->local_channel=ssh_channel_new_id(session); - chan->local_maxpacket=35000; - chan->local_window=32000; - chan->remote_channel=msg->channel_request_open.sender; - chan->remote_maxpacket=msg->channel_request_open.packet_size; - chan->remote_window=msg->channel_request_open.window; - chan->open=1; - buffer_add_u8(session->out_buffer,SSH2_MSG_CHANNEL_OPEN_CONFIRMATION); - buffer_add_u32(session->out_buffer,htonl(chan->remote_channel)); - buffer_add_u32(session->out_buffer,htonl(chan->local_channel)); - buffer_add_u32(session->out_buffer,htonl(chan->local_window)); - buffer_add_u32(session->out_buffer,htonl(chan->local_maxpacket)); - ssh_log(session, SSH_LOG_PACKET, - "Accepting a channel request_open for chan %d", chan->remote_channel); - if(packet_send(session)){ - channel_free(chan); - leave_function(); - return NULL; - } + enter_function(); + + if (msg == NULL) { leave_function(); - return chan; + return NULL; + } + + chan = channel_new(session); + if (chan == NULL) { + leave_function(); + return NULL; + } + + chan->local_channel = ssh_channel_new_id(session); + chan->local_maxpacket = 35000; + chan->local_window = 32000; + chan->remote_channel = msg->channel_request_open.sender; + chan->remote_maxpacket = msg->channel_request_open.packet_size; + chan->remote_window = msg->channel_request_open.window; + chan->open = 1; + + if (buffer_add_u8(session->out_buffer, SSH2_MSG_CHANNEL_OPEN_CONFIRMATION) < 0) { + goto error; + } + if (buffer_add_u32(session->out_buffer, htonl(chan->remote_channel)) < 0) { + goto error; + } + if (buffer_add_u32(session->out_buffer, htonl(chan->local_channel)) < 0) { + goto error; + } + if (buffer_add_u32(session->out_buffer, htonl(chan->local_window)) < 0) { + goto error; + } + if (buffer_add_u32(session->out_buffer, htonl(chan->local_maxpacket)) < 0) { + goto error; + } + + ssh_log(session, SSH_LOG_PACKET, + "Accepting a channel request_open for chan %d", chan->remote_channel); + + if (packet_send(session) != SSH_OK) { + goto error; + } + + leave_function(); + return chan; +error: + channel_free(chan); + + leave_function(); + return NULL; } static int ssh_message_channel_request_open_reply_default(SSH_MESSAGE *msg){ |