From a708e9c1121d9071fe1fae248468e5b780a3d96a Mon Sep 17 00:00:00 2001 From: "Artyom V. Poptsov" Date: Fri, 19 Aug 2016 12:36:45 +0400 Subject: 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. --- libguile-ssh/message-type.c | 5 +++++ libguile-ssh/server-type.c | 5 +++++ libguile-ssh/session-type.c | 5 +++++ libguile-ssh/sftp-session-type.c | 5 +++++ 4 files changed, 20 insertions(+) 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; -- cgit v1.2.3