From 8ee8d4f9135a08f391d8cfdeae3823f75c18b4cd Mon Sep 17 00:00:00 2001 From: milo Date: Tue, 22 Feb 2011 14:03:20 +0100 Subject: [PATCH] Check for NULL channel pointers --- src/channels.c | 124 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 116 insertions(+), 8 deletions(-) diff --git a/src/channels.c b/src/channels.c index f0cc84a4..6a4c98b2 100644 --- a/src/channels.c +++ b/src/channels.c @@ -1128,7 +1128,7 @@ int channel_write_common(ssh_channel channel, const void *data, size_t effectivelen; size_t maxpacketlen; - if(channel == NULL || data == NULL) { + if(channel == NULL) { return -1; } session = channel->session; @@ -1257,7 +1257,10 @@ int ssh_channel_write(ssh_channel channel, const void *data, uint32_t len) { * @see channel_is_closed() */ int ssh_channel_is_open(ssh_channel channel) { - return (channel->state == SSH_CHANNEL_STATE_OPEN && channel->session->alive != 0); + if(channel == NULL) { + return 0; + } + return (channel->state == SSH_CHANNEL_STATE_OPEN && channel->session->alive != 0); } /** @@ -1270,7 +1273,10 @@ int ssh_channel_is_open(ssh_channel channel) { * @see channel_is_open() */ int ssh_channel_is_closed(ssh_channel channel) { - return (channel->state != SSH_CHANNEL_STATE_OPEN || channel->session->alive == 0); + if(channel == NULL) { + return SSH_ERROR; + } + return (channel->state != SSH_CHANNEL_STATE_OPEN || channel->session->alive == 0); } /** @@ -1281,6 +1287,9 @@ int ssh_channel_is_closed(ssh_channel channel) { * @return 0 if there is no EOF, nonzero otherwise. */ int ssh_channel_is_eof(ssh_channel channel) { + if(channel == NULL) { + return SSH_ERROR; + } if ((channel->stdout_buffer && buffer_get_rest_len(channel->stdout_buffer) > 0) || (channel->stderr_buffer && @@ -1302,6 +1311,9 @@ int ssh_channel_is_eof(ssh_channel channel) { * doesn't work correctly. */ void ssh_channel_set_blocking(ssh_channel channel, int blocking) { + if(channel == NULL) { + return; + } channel->blocking = (blocking == 0 ? 0 : 1); } @@ -1476,6 +1488,14 @@ int ssh_channel_request_pty_size(ssh_channel channel, const char *terminal, ssh_buffer buffer = NULL; int rc = SSH_ERROR; + if(channel == NULL) { + return SSH_ERROR; + } + if(terminal == NULL) { + ssh_set_error_invalid(channel->session, __FUNCTION__); + return rc; + } + enter_function(); #ifdef WITH_SSH1 if (channel->version==1) { @@ -1589,6 +1609,9 @@ error: * @return SSH_OK on success, SSH_ERROR if an error occured. */ int ssh_channel_request_shell(ssh_channel channel) { + if(channel == NULL) { + return SSH_ERROR; + } #ifdef WITH_SSH1 if (channel->version == 1) { return channel_request_shell1(channel); @@ -1613,6 +1636,14 @@ int ssh_channel_request_subsystem(ssh_channel channel, const char *subsys) { ssh_string subsystem = NULL; int rc = SSH_ERROR; + if(channel == NULL) { + return SSH_ERROR; + } + if(subsys == NULL) { + ssh_set_error_invalid(channel->session, __FUNCTION__); + return rc; + } + buffer = ssh_buffer_new(); if (buffer == NULL) { ssh_set_error_oom(channel->session); @@ -1639,6 +1670,9 @@ error: } int ssh_channel_request_sftp( ssh_channel channel){ + if(channel == NULL) { + return SSH_ERROR; + } return ssh_channel_request_subsystem(channel, "sftp"); } @@ -1684,6 +1718,10 @@ int ssh_channel_request_x11(ssh_channel channel, int single_connection, const ch ssh_string c = NULL; int rc = SSH_ERROR; + if(channel == NULL) { + return SSH_ERROR; + } + buffer = ssh_buffer_new(); if (buffer == NULL) { ssh_set_error_oom(channel->session); @@ -2060,6 +2098,14 @@ int ssh_channel_request_env(ssh_channel channel, const char *name, const char *v ssh_string str = NULL; int rc = SSH_ERROR; + if(channel == NULL) { + return SSH_ERROR; + } + if(name == NULL || value == NULL) { + ssh_set_error_invalid(channel->session, __FUNCTION__); + return rc; + } + buffer = ssh_buffer_new(); if (buffer == NULL) { ssh_set_error_oom(channel->session); @@ -2129,6 +2175,14 @@ int ssh_channel_request_exec(ssh_channel channel, const char *cmd) { ssh_string command = NULL; int rc = SSH_ERROR; + if(channel == NULL) { + return SSH_ERROR; + } + if(cmd == NULL) { + ssh_set_error_invalid(channel->session, __FUNCTION__); + return rc; + } + #ifdef WITH_SSH1 if (channel->version == 1) { return channel_request_exec1(channel, cmd); @@ -2181,6 +2235,14 @@ int ssh_channel_request_send_signal(ssh_channel channel, const char *sig) { ssh_string encoded_signal = NULL; int rc = SSH_ERROR; + if(channel == NULL) { + return SSH_ERROR; + } + if(sig == NULL) { + ssh_set_error_invalid(channel->session, __FUNCTION__); + return rc; + } + #ifdef WITH_SSH1 if (channel->version == 1) { return SSH_ERROR; // TODO: Add support for SSH-v1 if possible. @@ -2237,6 +2299,14 @@ int channel_read_buffer(ssh_channel channel, ssh_buffer buffer, uint32_t count, int r; uint32_t total=0; + if(channel == NULL) { + return SSH_ERROR; + } + if(buffer == NULL) { + ssh_set_error_invalid(channel->session, __FUNCTION__); + return SSH_ERROR; + } + enter_function(); buffer_reinit(buffer); if(count==0){ @@ -2310,10 +2380,20 @@ int channel_read_buffer(ssh_channel channel, ssh_buffer buffer, uint32_t count, * channel_read_buffer(). */ int ssh_channel_read(ssh_channel channel, void *dest, uint32_t count, int is_stderr) { - ssh_session session = channel->session; - ssh_buffer stdbuf = channel->stdout_buffer; + ssh_session session; + ssh_buffer stdbuf; uint32_t len; + if(channel == NULL) { + return SSH_ERROR; + } + if(dest == NULL) { + ssh_set_error_invalid(channel->session, __FUNCTION__); + return SSH_ERROR; + } + + session = channel->session; + stdbuf = channel->stdout_buffer; enter_function(); if (count == 0) { @@ -2404,10 +2484,19 @@ int ssh_channel_read(ssh_channel channel, void *dest, uint32_t count, int is_std */ int ssh_channel_read_nonblocking(ssh_channel channel, void *dest, uint32_t count, int is_stderr) { - ssh_session session = channel->session; + ssh_session session; uint32_t to_read; int rc; + if(channel == NULL) { + return SSH_ERROR; + } + if(dest == NULL) { + ssh_set_error_invalid(channel->session, __FUNCTION__); + return SSH_ERROR; + } + + session = channel->session; enter_function(); to_read = ssh_channel_poll(channel, is_stderr); @@ -2441,9 +2530,15 @@ int ssh_channel_read_nonblocking(ssh_channel channel, void *dest, uint32_t count * @see channel_is_eof() */ int ssh_channel_poll(ssh_channel channel, int is_stderr){ - ssh_session session = channel->session; - ssh_buffer stdbuf = channel->stdout_buffer; + ssh_session session; + ssh_buffer stdbuf; + if(channel == NULL) { + return SSH_ERROR; + } + + session = channel->session; + stdbuf = channel->stdout_buffer; enter_function(); if (is_stderr) { @@ -2479,6 +2574,10 @@ int ssh_channel_poll(ssh_channel channel, int is_stderr){ * @return The session pointer. */ ssh_session ssh_channel_get_session(ssh_channel channel) { + if(channel == NULL) { + return NULL; + } + return channel->session; } @@ -2492,6 +2591,10 @@ ssh_session ssh_channel_get_session(ssh_channel channel) { * or eof not sent. */ int ssh_channel_get_exit_status(ssh_channel channel) { + if(channel == NULL) { + return SSH_ERROR; + } + if (channel->local_eof == 0) { return -1; } @@ -2775,6 +2878,11 @@ int ssh_channel_open_reverse_forward(ssh_channel channel, const char *remotehost if(channel == NULL) { return rc; } + if(remotehost == NULL || sourcehost == NULL) { + ssh_set_error_invalid(channel->session, __FUNCTION__); + return rc; + } + session = channel->session;