From 238e1e008ce4d2b76fcf4837910d16a20b092f0d Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Fri, 5 Oct 2007 01:53:20 +0000 Subject: [PATCH] Fixed coroutine caller to avoid crash in vinagre --- gtk-vnc-0.2.0-coroutine-caller.patch | 84 ++++++++++++++++++++++++++++ gtk-vnc.spec | 7 ++- 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 gtk-vnc-0.2.0-coroutine-caller.patch diff --git a/gtk-vnc-0.2.0-coroutine-caller.patch b/gtk-vnc-0.2.0-coroutine-caller.patch new file mode 100644 index 0000000..fb54f21 --- /dev/null +++ b/gtk-vnc-0.2.0-coroutine-caller.patch @@ -0,0 +1,84 @@ +changeset: 76:949312711737 +tag: tip +user: "Daniel P. Berrange " +date: Thu Oct 04 21:45:15 2007 -0400 +files: src/coroutine.c +description: +Fix to coroutine caller state management to avoid SEGV + + +diff -r ef58fe73ab0c -r 949312711737 src/coroutine.c +--- a/src/coroutine.c Thu Oct 04 10:30:40 2007 -0300 ++++ b/src/coroutine.c Thu Oct 04 21:45:15 2007 -0400 +@@ -11,6 +11,7 @@ + #include + #include + #include ++#include + #include "coroutine.h" + + int coroutine_release(struct coroutine *co) +@@ -57,25 +58,23 @@ int coroutine_init(struct coroutine *co) + } + + #if 0 +-static __thread struct coroutine system; ++static __thread struct coroutine leader; + static __thread struct coroutine *current; + #else +-static struct coroutine system; ++static struct coroutine leader; + static struct coroutine *current; + #endif + + struct coroutine *coroutine_self(void) + { + if (current == NULL) +- current = &system; ++ current = &leader; + return current; + } + + void *coroutine_swap(struct coroutine *from, struct coroutine *to, void *arg) + { + int ret; +- +- to->caller = from; + to->data = arg; + current = to; + ret = cc_swap(&from->cc, &to->cc); +@@ -83,7 +82,7 @@ void *coroutine_swap(struct coroutine *f + return from->data; + else if (ret == 1) { + coroutine_release(to); +- current = &system; ++ current = &leader; + to->exited = 1; + return to->data; + } +@@ -93,12 +92,23 @@ void *coroutine_swap(struct coroutine *f + + void *yieldto(struct coroutine *to, void *arg) + { ++ if (to->caller) { ++ fprintf(stderr, "Co-routine is re-entering itself\n"); ++ abort(); ++ } ++ to->caller = coroutine_self(); + return coroutine_swap(coroutine_self(), to, arg); + } + + void *yield(void *arg) + { +- return yieldto(coroutine_self()->caller, arg); ++ struct coroutine *to = coroutine_self()->caller; ++ if (!to) { ++ fprintf(stderr, "Co-routine is yielding to no one\n"); ++ abort(); ++ } ++ coroutine_self()->caller = NULL; ++ return coroutine_swap(coroutine_self(), to, arg); + } + /* + * Local variables: + diff --git a/gtk-vnc.spec b/gtk-vnc.spec index 1ec84c5..f0bbda4 100644 --- a/gtk-vnc.spec +++ b/gtk-vnc.spec @@ -3,11 +3,12 @@ Summary: A GTK widget for VNC clients Name: gtk-vnc Version: 0.2.0 -Release: 2%{?dist} +Release: 3%{?dist} License: LGPLv2+ Group: Development/Libraries Source: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz Patch1: %{name}-%{version}-execmem.patch +Patch2: %{name}-%{version}-coroutine-caller.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) URL: http://gtk-vnc.sf.net/ BuildRequires: gtk2-devel pygtk2-devel python-devel gnutls-devel @@ -43,6 +44,7 @@ A module allowing use of the GTK-VNC widget from python %prep %setup -q %patch1 -p1 +%patch2 -p1 %build %configure @@ -82,6 +84,9 @@ rm -fr %{buildroot} %{_libdir}/python*/site-packages/gtkvnc.so %changelog +* Thu Oct 4 2007 Daniel P. Berrange - 0.2.0-3.fc8 +- Fixed coroutine caller to avoid SEGV + * Wed Sep 26 2007 Daniel P. Berrange - 0.2.0-2.fc8 - Remove use of PROT_EXEC for coroutine stack (rhbz #307531 )