aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormilo <milo@r0ot.me>2011-02-22 14:03:20 +0100
committermilo <milo@r0ot.me>2011-02-22 14:11:19 +0100
commit8ee8d4f9135a08f391d8cfdeae3823f75c18b4cd (patch)
tree14008fc9227869070b757237309c33cf3219ec93
parent000d659ea2eb709bf99e27c4c76233032869294f (diff)
downloadlibssh-8ee8d4f9135a08f391d8cfdeae3823f75c18b4cd.tar.gz
libssh-8ee8d4f9135a08f391d8cfdeae3823f75c18b4cd.tar.xz
libssh-8ee8d4f9135a08f391d8cfdeae3823f75c18b4cd.zip
Check for NULL channel pointers
-rw-r--r--src/channels.c124
1 files changed, 116 insertions, 8 deletions
diff --git a/src/channels.c b/src/channels.c
index f0cc84a..6a4c98b 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;