aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDirkjan Bussink <d.bussink@gmail.com>2020-12-10 14:14:11 +0000
committerJakub Jelen <jjelen@redhat.com>2021-08-17 15:46:53 +0200
commit098ae8c4bdeab132caf1522ccf5ec72f450600f6 (patch)
tree75bf21c7134eaa6f24ec48bcbc1ac1b31e753873
parent04824e2f5e8d7681f6888fb786af3aad926d05ac (diff)
downloadlibssh-098ae8c4bdeab132caf1522ccf5ec72f450600f6.tar.gz
libssh-098ae8c4bdeab132caf1522ccf5ec72f450600f6.tar.xz
libssh-098ae8c4bdeab132caf1522ccf5ec72f450600f6.zip
Always check return value of ssh_list_new()
Another item identified during code review was cases where the return value of ssh_list_new() was not properly checked and handled. This updates all cases that were missing this to handle failure to allocate a new list. Signed-off-by: Dirkjan Bussink <d.bussink@gmail.com> Reviewed-by: Jakub Jelen <jjelen@redhat.com> Reviewed-by: Andreas Schneider <asn@cryptomilk.org> (cherry picked from commit 0987e6065c86f2f52b3c8835a0ad73d7ad082121)
-rw-r--r--src/channels.c7
-rw-r--r--src/knownhosts.c1
-rw-r--r--src/messages.c38
-rw-r--r--src/packet.c12
-rw-r--r--tests/unittests/torture_callbacks.c5
5 files changed, 42 insertions, 21 deletions
diff --git a/src/channels.c b/src/channels.c
index 4eea885b..77229abf 100644
--- a/src/channels.c
+++ b/src/channels.c
@@ -117,6 +117,13 @@ ssh_channel ssh_channel_new(ssh_session session)
if (session->channels == NULL) {
session->channels = ssh_list_new();
+ if (session->channels == NULL) {
+ ssh_set_error_oom(session);
+ SSH_BUFFER_FREE(channel->stdout_buffer);
+ SSH_BUFFER_FREE(channel->stderr_buffer);
+ SAFE_FREE(channel);
+ return NULL;
+ }
}
ssh_list_prepend(session->channels, channel);
diff --git a/src/knownhosts.c b/src/knownhosts.c
index fed75f90..f2ef088c 100644
--- a/src/knownhosts.c
+++ b/src/knownhosts.c
@@ -372,6 +372,7 @@ struct ssh_list *ssh_known_hosts_get_algorithms(ssh_session session)
list = ssh_list_new();
if (list == NULL) {
+ ssh_set_error_oom(session);
SAFE_FREE(host_port);
return NULL;
}
diff --git a/src/messages.c b/src/messages.c
index 25683b23..c7fcc887 100644
--- a/src/messages.c
+++ b/src/messages.c
@@ -513,24 +513,30 @@ static int ssh_message_termination(void *s){
* @warning This function blocks until a message has been received. Betterset up
* a callback if this behavior is unwanted.
*/
-ssh_message ssh_message_get(ssh_session session) {
- ssh_message msg = NULL;
- int rc;
+ssh_message ssh_message_get(ssh_session session)
+{
+ ssh_message msg = NULL;
+ int rc;
- msg=ssh_message_pop_head(session);
- if(msg) {
- return msg;
- }
- if(session->ssh_message_list == NULL) {
- session->ssh_message_list = ssh_list_new();
- }
- rc = ssh_handle_packets_termination(session, SSH_TIMEOUT_USER,
- ssh_message_termination, session);
- if(rc || session->session_state == SSH_SESSION_STATE_ERROR)
- return NULL;
- msg=ssh_list_pop_head(ssh_message, session->ssh_message_list);
+ msg = ssh_message_pop_head(session);
+ if (msg != NULL) {
+ return msg;
+ }
+ if (session->ssh_message_list == NULL) {
+ session->ssh_message_list = ssh_list_new();
+ if (session->ssh_message_list == NULL) {
+ ssh_set_error_oom(session);
+ return NULL;
+ }
+ }
+ rc = ssh_handle_packets_termination(session, SSH_TIMEOUT_USER,
+ ssh_message_termination, session);
+ if (rc || session->session_state == SSH_SESSION_STATE_ERROR) {
+ return NULL;
+ }
+ msg = ssh_list_pop_head(ssh_message, session->ssh_message_list);
- return msg;
+ return msg;
}
/**
diff --git a/src/packet.c b/src/packet.c
index 0b784828..fcaace4a 100644
--- a/src/packet.c
+++ b/src/packet.c
@@ -1422,12 +1422,14 @@ void ssh_packet_register_socket_callback(ssh_session session, ssh_socket s){
* @brief sets the callbacks for the packet layer
*/
void ssh_packet_set_callbacks(ssh_session session, ssh_packet_callbacks callbacks){
- if(session->packet_callbacks == NULL){
- session->packet_callbacks = ssh_list_new();
- }
- if (session->packet_callbacks != NULL) {
+ if (session->packet_callbacks == NULL) {
+ session->packet_callbacks = ssh_list_new();
+ if (session->packet_callbacks == NULL) {
+ ssh_set_error_oom(session);
+ return;
+ }
+ }
ssh_list_append(session->packet_callbacks, callbacks);
- }
}
/** @internal
diff --git a/tests/unittests/torture_callbacks.c b/tests/unittests/torture_callbacks.c
index f5f7e4da..85f4d1f4 100644
--- a/tests/unittests/torture_callbacks.c
+++ b/tests/unittests/torture_callbacks.c
@@ -138,6 +138,9 @@ static void torture_callbacks_execute_list(void **state){
};
(void)state;
+
+ assert_non_null(list);
+
ssh_callbacks_init(&c1);
ssh_callbacks_init(&c2);
ssh_callbacks_init(&c3);
@@ -213,6 +216,8 @@ static void torture_callbacks_iterate(void **state){
(void)state; /* unused */
+ assert_non_null(list);
+
ssh_callbacks_init(&c1);
ssh_callbacks_init(&c2);