Fixed coroutine caller to avoid crash in vinagre
This commit is contained in:
parent
3bb127eceb
commit
238e1e008c
84
gtk-vnc-0.2.0-coroutine-caller.patch
Normal file
84
gtk-vnc-0.2.0-coroutine-caller.patch
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
changeset: 76:949312711737
|
||||||
|
tag: tip
|
||||||
|
user: "Daniel P. Berrange <berrange@redhat.com>"
|
||||||
|
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 <sys/types.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
#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:
|
||||||
|
|
@ -3,11 +3,12 @@
|
|||||||
Summary: A GTK widget for VNC clients
|
Summary: A GTK widget for VNC clients
|
||||||
Name: gtk-vnc
|
Name: gtk-vnc
|
||||||
Version: 0.2.0
|
Version: 0.2.0
|
||||||
Release: 2%{?dist}
|
Release: 3%{?dist}
|
||||||
License: LGPLv2+
|
License: LGPLv2+
|
||||||
Group: Development/Libraries
|
Group: Development/Libraries
|
||||||
Source: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz
|
Source: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz
|
||||||
Patch1: %{name}-%{version}-execmem.patch
|
Patch1: %{name}-%{version}-execmem.patch
|
||||||
|
Patch2: %{name}-%{version}-coroutine-caller.patch
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||||
URL: http://gtk-vnc.sf.net/
|
URL: http://gtk-vnc.sf.net/
|
||||||
BuildRequires: gtk2-devel pygtk2-devel python-devel gnutls-devel
|
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
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
%patch1 -p1
|
%patch1 -p1
|
||||||
|
%patch2 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%configure
|
%configure
|
||||||
@ -82,6 +84,9 @@ rm -fr %{buildroot}
|
|||||||
%{_libdir}/python*/site-packages/gtkvnc.so
|
%{_libdir}/python*/site-packages/gtkvnc.so
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Oct 4 2007 Daniel P. Berrange <berrange@redhat.com> - 0.2.0-3.fc8
|
||||||
|
- Fixed coroutine caller to avoid SEGV
|
||||||
|
|
||||||
* Wed Sep 26 2007 Daniel P. Berrange <berrange@redhat.com> - 0.2.0-2.fc8
|
* Wed Sep 26 2007 Daniel P. Berrange <berrange@redhat.com> - 0.2.0-2.fc8
|
||||||
- Remove use of PROT_EXEC for coroutine stack (rhbz #307531 )
|
- Remove use of PROT_EXEC for coroutine stack (rhbz #307531 )
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user