summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArtyom V. Poptsov <poptsov.artyom@gmail.com>2016-08-19 12:36:45 +0400
committerArtyom V. Poptsov <poptsov.artyom@gmail.com>2016-08-19 12:36:45 +0400
commita708e9c1121d9071fe1fae248468e5b780a3d96a (patch)
tree02e292802a52cdc214263906120b7ee1f62bf939
parentlibguile-ssh/key-type.c (free_key_smob): Bugfix: Check smob type (diff)
downloadguile-ssh-a708e9c1121d9071fe1fae248468e5b780a3d96a.tar.gz
libguile-ssh: Bugfix: Check if smobs are already freed
* libguile-ssh/message-type.c (free_message): Bugfix: Check if the smob is already freed, don't try to free it once more. * libguile-ssh/server-type.c (free_server): Likewise. * libguile-ssh/session-type.c (free_session): Likewise. * libguile-ssh/sftp-session-type.c (free_sftp_session): Likewise.
-rw-r--r--libguile-ssh/message-type.c5
-rw-r--r--libguile-ssh/server-type.c5
-rw-r--r--libguile-ssh/session-type.c5
-rw-r--r--libguile-ssh/sftp-session-type.c5
4 files changed, 20 insertions, 0 deletions
diff --git a/libguile-ssh/message-type.c b/libguile-ssh/message-type.c
index 83d32b1..46b91f1 100644
--- a/libguile-ssh/message-type.c
+++ b/libguile-ssh/message-type.c
@@ -41,6 +41,11 @@ mark_message (SCM message)
size_t
free_message (SCM message)
{
+ if (! SCM_SMOB_PREDICATE (message_tag, message))
+ {
+ _ssh_log (SSH_LOG_FUNCTIONS, "free_message", "%s", "already freed");
+ return 0;
+ }
struct message_data *msg_data = _scm_to_message_data (message);
ssh_message_free (msg_data->message);
return 0;
diff --git a/libguile-ssh/server-type.c b/libguile-ssh/server-type.c
index ed2402f..5bb5e2e 100644
--- a/libguile-ssh/server-type.c
+++ b/libguile-ssh/server-type.c
@@ -41,6 +41,11 @@ mark_server (SCM server)
size_t
free_server (SCM server)
{
+ if (! SCM_SMOB_PREDICATE (server_tag, server))
+ {
+ _ssh_log (SSH_LOG_FUNCTIONS, "free_server", "%s", "already freed");
+ return 0;
+ }
struct server_data *server_data = _scm_to_server_data (server);
ssh_bind_free (server_data->bind);
return 0;
diff --git a/libguile-ssh/session-type.c b/libguile-ssh/session-type.c
index f6d909f..a766329 100644
--- a/libguile-ssh/session-type.c
+++ b/libguile-ssh/session-type.c
@@ -41,6 +41,11 @@ mark_session (SCM session_smob)
size_t
free_session (SCM session_smob)
{
+ if (! SCM_SMOB_PREDICATE (session_tag, session_smob))
+ {
+ _ssh_log (SSH_LOG_FUNCTIONS, "free_session", "%s", "already freed");
+ return 0;
+ }
struct session_data *data = _scm_to_session_data (session_smob);
ssh_disconnect (data->ssh_session);
diff --git a/libguile-ssh/sftp-session-type.c b/libguile-ssh/sftp-session-type.c
index c3260e3..ae59c57 100644
--- a/libguile-ssh/sftp-session-type.c
+++ b/libguile-ssh/sftp-session-type.c
@@ -42,6 +42,11 @@ mark_sftp_session (SCM sftp_session)
static size_t
free_sftp_session (SCM sftp_session)
{
+ if (! SCM_SMOB_PREDICATE (sftp_session_tag, sftp_session))
+ {
+ _ssh_log (SSH_LOG_FUNCTIONS, "free_sftp_session", "%s", "already freed");
+ return 0;
+ }
struct sftp_session_data *sftp_sd = _scm_to_sftp_session_data (sftp_session);
sftp_free (sftp_sd->sftp_session);
return 0;