[xorg-x11-server/f17] Make timers signal-safe (#814869)

Peter Hutterer whot at fedoraproject.org
Mon May 14 04:04:33 UTC 2012


commit 0134dbf64f460c42f963b61c6603fa530b6cef15
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon May 14 14:01:35 2012 +1000

    Make timers signal-safe (#814869)

 xorg-x11-server.spec                          |    8 ++-
 xserver-1.12-os-make-timers-signal-safe.patch |  131 +++++++++++++++++++++++++
 2 files changed, 138 insertions(+), 1 deletions(-)
---
diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec
index 7df20f6..f9049f0 100644
--- a/xorg-x11-server.spec
+++ b/xorg-x11-server.spec
@@ -48,7 +48,7 @@
 Summary:   X.Org X11 X server
 Name:      xorg-x11-server
 Version:   1.12.0
-Release:   4%{?gitdate:.%{gitdate}}%{dist}
+Release:   5%{?gitdate:.%{gitdate}}%{dist}
 URL:       http://www.x.org
 License:   MIT
 Group:     User Interface/X
@@ -102,6 +102,9 @@ Patch7007: xserver-1.10.99.1-test.patch
 # RedHat/Fedora-specific patch
 Patch7013: xserver-1.12-Xext-fix-selinux-build-failure.patch
 
+# 814869, fix from upstream 1.12 branch
+Patch7014: xserver-1.12-os-make-timers-signal-safe.patch
+
 %define moduledir	%{_libdir}/xorg/modules
 %define drimoduledir	%{_libdir}/dri
 %define sdkdir		%{_includedir}/xorg
@@ -563,6 +566,9 @@ rm -rf $RPM_BUILD_ROOT
 %{xserver_source_dir}
 
 %changelog
+* Mon May 14 2012 Peter Hutterer <peter.hutterer at redhat.com> 1.12.0-5
+- Make timers signal-safe (#814869)
+
 * Sun May 13 2012 Dennis Gilmore <dennis at ausil.us> 1.12.0-4
 - enable vbe on arm arches
 
diff --git a/xserver-1.12-os-make-timers-signal-safe.patch b/xserver-1.12-os-make-timers-signal-safe.patch
new file mode 100644
index 0000000..6b0ef5e
--- /dev/null
+++ b/xserver-1.12-os-make-timers-signal-safe.patch
@@ -0,0 +1,131 @@
+From 7089841a7e026799328e97292c2f81aa4aa01f57 Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer at who-t.net>
+Date: Fri, 27 Apr 2012 10:52:39 +1000
+Subject: [PATCH] os: make timers signal-safe
+
+If TimerSet() is called from a signal handler (synaptics tap handling code)
+may result in list corruption if we're currently inside TimerSet().
+
+See backtrace in
+https://bugzilla.redhat.com/show_bug.cgi?id=814869
+
+Block signals for all list manipulations in the timers.
+
+Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
+Reviewed-by: Chase Douglas <chase.douglas at canonical.com>
+(cherry picked from commit 08962951de969b9d8c870af8b6e47303dc0decfd)
+
+Conflicts:
+
+	os/WaitFor.c
+---
+ os/WaitFor.c |   18 ++++++++++++++++--
+ 1 file changed, 16 insertions(+), 2 deletions(-)
+
+diff --git a/os/WaitFor.c b/os/WaitFor.c
+index 867cb04..236406e 100644
+--- a/os/WaitFor.c
++++ b/os/WaitFor.c
+@@ -405,6 +405,7 @@ CheckAllTimers(void)
+     OsTimerPtr timer;
+     CARD32 now;
+ 
++    OsBlockSignals();
+ start:
+     now = GetTimeInMillis();
+ 
+@@ -414,6 +415,7 @@ start:
+             goto start;
+         }
+     }
++    OsReleaseSignals();
+ }
+ 
+ static void
+@@ -421,11 +423,13 @@ DoTimer(OsTimerPtr timer, CARD32 now, OsTimerPtr *prev)
+ {
+     CARD32 newTime;
+ 
++    OsBlockSignals();
+     *prev = timer->next;
+     timer->next = NULL;
+     newTime = (*timer->callback)(timer, now, timer->arg);
+     if (newTime)
+ 	TimerSet(timer, 0, newTime, timer->callback, timer->arg);
++    OsReleaseSignals();
+ }
+ 
+ OsTimerPtr
+@@ -443,6 +447,7 @@ TimerSet(OsTimerPtr timer, int flags, CARD32 millis,
+     }
+     else
+     {
++        OsBlockSignals();
+ 	for (prev = &timers; *prev; prev = &(*prev)->next)
+ 	{
+ 	    if (*prev == timer)
+@@ -453,6 +458,7 @@ TimerSet(OsTimerPtr timer, int flags, CARD32 millis,
+ 		break;
+ 	    }
+ 	}
++        OsReleaseSignals();
+     }
+     if (!millis)
+ 	return timer;
+@@ -473,29 +479,35 @@ TimerSet(OsTimerPtr timer, int flags, CARD32 millis,
+ 	if (!millis)
+ 	    return timer;
+     }
++    OsBlockSignals();
+     for (prev = &timers;
+ 	 *prev && (int) ((*prev)->expires - millis) <= 0;
+ 	 prev = &(*prev)->next)
+         ;
+     timer->next = *prev;
+     *prev = timer;
++    OsReleaseSignals();
+     return timer;
+ }
+ 
+ Bool
+ TimerForce(OsTimerPtr timer)
+ {
++    int rc = FALSE;
+     OsTimerPtr *prev;
+ 
++    OsBlockSignals();
+     for (prev = &timers; *prev; prev = &(*prev)->next)
+     {
+ 	if (*prev == timer)
+ 	{
+ 	    DoTimer(timer, GetTimeInMillis(), prev);
+-	    return TRUE;
++	    rc = TRUE;
++	    break;
+ 	}
+     }
+-    return FALSE;
++    OsReleaseSignals();
++    return rc;
+ }
+ 
+ 
+@@ -506,6 +518,7 @@ TimerCancel(OsTimerPtr timer)
+ 
+     if (!timer)
+ 	return;
++    OsBlockSignals();
+     for (prev = &timers; *prev; prev = &(*prev)->next)
+     {
+ 	if (*prev == timer)
+@@ -514,6 +527,7 @@ TimerCancel(OsTimerPtr timer)
+ 	    break;
+ 	}
+     }
++    OsReleaseSignals();
+ }
+ 
+ void
+-- 
+1.7.10.1
+


More information about the scm-commits mailing list