diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2011-12-19 14:52:41 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2011-12-21 14:16:37 +1000 |
commit | 552de314bf0c8e4de5d002bdd1c12388c2f42283 (patch) | |
tree | 2264cb654f7ab425fa328387e2ea5b96df5b3ad3 | |
parent | 76c11e0872dedcd360cbe02cf62bb9de3b212957 (diff) |
dix: don't retrieve the syncEvents tail on an empty list
An empty list points to itself but syncEvents has the list head only and is
of a different format than the elements. Thus, casting it to a QdEventPtr
gives us garbage.
Segfaults with XTS test case Xlib13/XGrabKeyboard
Introduced in 7af23259d88f4c28ed21140f82cc03b3724c06bb.
Reported-by: Aaron Plattner <aplattner@nvidia.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
-rw-r--r-- | dix/events.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/dix/events.c b/dix/events.c index 48cf7a244..d80290360 100644 --- a/dix/events.c +++ b/dix/events.c @@ -1116,13 +1116,14 @@ NoticeEventTime(InternalEvent *ev) void EnqueueEvent(InternalEvent *ev, DeviceIntPtr device) { - QdEventPtr tail; + QdEventPtr tail = NULL; QdEventPtr qe; SpritePtr pSprite = device->spriteInfo->sprite; int eventlen; DeviceEvent *event = &ev->device_event; - tail = list_last_entry(&syncEvents.pending, QdEventRec, next); + if (!list_is_empty(&syncEvents.pending)) + tail = list_last_entry(&syncEvents.pending, QdEventRec, next); NoticeTime((InternalEvent*)event); |