summaryrefslogtreecommitdiff
path: root/pcr/guile-ssh/guile-ssh-0.11.3-fix-segfault.patch
diff options
context:
space:
mode:
Diffstat (limited to 'pcr/guile-ssh/guile-ssh-0.11.3-fix-segfault.patch')
-rw-r--r--pcr/guile-ssh/guile-ssh-0.11.3-fix-segfault.patch104
1 files changed, 104 insertions, 0 deletions
diff --git a/pcr/guile-ssh/guile-ssh-0.11.3-fix-segfault.patch b/pcr/guile-ssh/guile-ssh-0.11.3-fix-segfault.patch
new file mode 100644
index 000000000..787dc04c9
--- /dev/null
+++ b/pcr/guile-ssh/guile-ssh-0.11.3-fix-segfault.patch
@@ -0,0 +1,104 @@
+From c468d9c2dc343446757360857a295736359b3024 Mon Sep 17 00:00:00 2001
+From: "Artyom V. Poptsov" <poptsov.artyom@gmail.com>
+Date: Tue, 7 Aug 2018 07:55:00 +0300
+Subject: [PATCH] libguile-ssh/channel-type.c (ptob_close): Bugfix: fix a
+ segfault
+
+'ptob_close' would always get a segfault when it tried to free a closed
+channel. This patch fixes that by adding a check if a channel is already
+closed.
+
+Reported by Michael Bowcutt <mbowcutt@case.edu> in
+ <https://github.com/artyom-poptsov/guile-ssh/issues/8>
+ and Njagi Mwaniki in a personal email.
+
+* libguile-ssh/channel-type.c (ptob_close): Check if a channel is already
+ closed before trying to close and free it. Improve logging.
+* libguile-ssh/log.c (_gssh_log_debug, _gssh_log_debug1): New procedures
+* libguile-ssh/log.h: Likewise.
+---
+ libguile-ssh/channel-type.c | 10 +++++++++-
+ libguile-ssh/log.c | 21 +++++++++++++++++++++
+ libguile-ssh/log.h | 3 +++
+ 3 files changed, 33 insertions(+), 1 deletion(-)
+
+diff --git a/libguile-ssh/channel-type.c b/libguile-ssh/channel-type.c
+index ffcca64..4b0b9ae 100644
+--- a/libguile-ssh/channel-type.c
++++ b/libguile-ssh/channel-type.c
+@@ -29,6 +29,7 @@
+ #include "channel-type.h"
+ #include "error.h"
+ #include "common.h"
++#include "log.h"
+
+
+ /* The channel port type. Guile 2.2 introduced a new port API, so we have a
+@@ -223,10 +224,17 @@ ptob_close (SCM channel)
+ ptob_flush (channel);
+ #endif
+
+- if (ch)
++ if (ch && ssh_channel_is_open (ch->ssh_channel))
+ {
++ _gssh_log_debug ("ptob_close", "closing and freeing the channel...",
++ channel);
+ ssh_channel_close (ch->ssh_channel);
+ ssh_channel_free (ch->ssh_channel);
++ _gssh_log_debug1 ("ptob_close", "closing and freeing the channel... done");
++ }
++ else
++ {
++ _gssh_log_debug1 ("ptob_close", "the channel is already freeed.");
+ }
+
+ SCM_SETSTREAM (channel, NULL);
+diff --git a/libguile-ssh/log.c b/libguile-ssh/log.c
+index 6588749..e0e3027 100644
+--- a/libguile-ssh/log.c
++++ b/libguile-ssh/log.c
+@@ -270,6 +270,27 @@ _gssh_log_warning (const char* function_name, const char* msg, SCM args)
+ scm_dynwind_end ();
+ }
+
++void
++_gssh_log_debug (const char* function_name, const char* msg, SCM args)
++{
++ char *c_str;
++ scm_dynwind_begin (0);
++
++ c_str = scm_to_locale_string (scm_object_to_string (args, SCM_UNDEFINED));
++ scm_dynwind_free (c_str);
++
++ _ssh_log (SSH_LOG_FUNCTIONS, function_name, "[GSSH DEBUG] %s: %s",
++ msg, c_str);
++
++ scm_dynwind_end ();
++}
++
++void
++_gssh_log_debug1 (const char* function_name, const char* msg)
++{
++ _ssh_log (SSH_LOG_FUNCTIONS, function_name, "[GSSH DEBUG] %s", msg);
++}
++
+
+ /* Initialization */
+
+diff --git a/libguile-ssh/log.h b/libguile-ssh/log.h
+index dd1424b..c3fe866 100644
+--- a/libguile-ssh/log.h
++++ b/libguile-ssh/log.h
+@@ -28,6 +28,9 @@ extern void _gssh_log_error (const char* function_name, const char* msg,
+
+ extern void _gssh_log_warning (const char* function_name, const char* msg,
+ SCM args);
++extern void _gssh_log_debug (const char* function_name, const char* msg,
++ SCM args);
++extern void _gssh_log_debug1 (const char* function_name, const char* msg);
+
+ extern void init_log_func (void);
+
+--
+2.20.1
+