diff --git a/Xi/exevents.c b/Xi/exevents.c index 29dceca0e..89adf4f30 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -891,6 +891,8 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device) DeviceIntPtr mouse = NULL, kbd = NULL; DeviceEvent *event = (DeviceEvent*)ev; + CHECKEVENT(ev); + if (IsPointerDevice(device)) { kbd = GetPairedDevice(device); diff --git a/dix/events.c b/dix/events.c index 5702d2f21..c21e57ebe 100644 --- a/dix/events.c +++ b/dix/events.c @@ -2247,6 +2247,8 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab, xEvent *xE = NULL; int rc, count = 0; + CHECKEVENT(event); + /* XXX: In theory, we could pass the internal events through to everything * and only convert just before hitting the wire. We can't do that yet, so * DDE is the last stop for internal events. From here onwards, we deal @@ -2527,6 +2529,8 @@ CheckMotion(DeviceEvent *ev, DeviceIntPtr pDev) WindowPtr prevSpriteWin; SpritePtr pSprite = pDev->spriteInfo->sprite; + CHECKEVENT(ev); + prevSpriteWin = pSprite->win; if (ev && !syncEvents.playingEvents) diff --git a/include/events.h b/include/events.h index b09116741..7bc83a6d7 100644 --- a/include/events.h +++ b/include/events.h @@ -62,6 +62,10 @@ enum { ET_Internal = 0xFF /* First byte */ } EventType; +#define CHECKEVENT(ev) if (ev && ((InternalEvent*)(ev))->u.any.header != 0xFF) \ + FatalError("Wrong event type %d.\n", \ + ((InternalEvent*)(ev))->u.any.header); + /** * Used for ALL input device events internal in the server until * copied into the matching protocol event. diff --git a/mi/mieq.c b/mi/mieq.c index 084660263..efec55a63 100644 --- a/mi/mieq.c +++ b/mi/mieq.c @@ -162,6 +162,8 @@ mieqEnqueue(DeviceIntPtr pDev, InternalEvent *e) pthread_mutex_lock(&miEventQueueMutex); #endif + CHECKEVENT(e); + /* avoid merging events from different devices */ if (e->u.any.type == ET_Motion) isMotion = pDev->id; @@ -285,6 +287,8 @@ static void FixUpEventForMaster(DeviceIntPtr mdev, DeviceIntPtr sdev, InternalEvent* original, InternalEvent *master) { + CHECKEVENT(original); + CHECKEVENT(master); /* Ensure chained button mappings, i.e. that the detail field is the * value of the mapped button on the SD, not the physical button */ if (original->u.any.type == ET_ButtonPress || @@ -312,6 +316,8 @@ CopyGetMasterEvent(DeviceIntPtr mdev, DeviceIntPtr sdev, int len = original->u.any.length; InternalEvent *mevent; + CHECKEVENT(original); + if (master->evlen < len) SetMinimumEventSize(master, 1, len); @@ -337,6 +343,8 @@ mieqProcessDeviceEvent(DeviceIntPtr dev, int x = 0, y = 0; DeviceIntPtr master; + CHECKEVENT(event); + /* Custom event handler */ handler = miEventQueue.handlers[event->u.any.type];