diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c index a0ed085..3781e16 100644 --- a/src/radeon_dri2.c +++ b/src/radeon_dri2.c @@ -360,6 +360,41 @@ void radeon_dri2_frame_event_handler(unsigned int frame, unsigned int tv_sec, BoxRec box; RegionRec region; + if (event->client->index > MAXCLIENTS) { + ErrorF("radeon_dri2_frame_event_handler: ERROR : discard event as client index %d is above max %u\n",event->client->index, MAXCLIENTS); + free(event); + return; + } + if (event->client->index < 0) { + ErrorF("radeon_dri2_frame_event_handler: ERROR : discard event as client index %d is below 0\n",event->client->index); + free(event); + return; + } + + if (clients[event->client->index] == NULL) { + ErrorF("radeon_dri2_frame_event_handler: ERROR : discard event as clients indexed client is NULL\n"); + free(event); + return; + } + + if (clients[event->client->index]->errorValue == 0) { + ErrorF("radeon_dri2_frame_event_handler: ERROR : discard event as clients indexed client ierrorValue is 0\n"); + free(event); + return; + } + + if (clients[event->client->index]->errorValue != event->client->errorValue) { + ErrorF("radeon_dri2_frame_event_handler: ERROR : discard event as client error value do not match : clients %u event %u\n", clients[event->client->index]->errorValue, event->client->errorValue); + free(event); + return; + } + + if ( event->client->clientGone) { + ErrorF("radeon_dri2_frame_event_handler: ERROR : discard event as client is gone\n"); + free(event); + return; + } + status = dixLookupDrawable(&drawable, event->drawable_id, serverClient, M_ANY, DixWriteAccess); if (status != Success) {