Module Name: xsrc Committed By: snj Date: Sat Jul 8 17:14:58 UTC 2017
Modified Files: xsrc/external/mit/xorg-server/dist/Xi [netbsd-7-1]: sendexev.c xsrc/external/mit/xorg-server/dist/dix [netbsd-7-1]: events.c swapreq.c xsrc/xfree/xc/programs/Xserver/Xi [netbsd-7-1]: sendexev.c Log Message: Apply patch (requested by mrg in ticket #1446): Fix CVE-2017-10971 and CVE-2017-10972. To generate a diff of this commit: cvs rdiff -u -r1.1.1.3.10.1 -r1.1.1.3.10.1.4.1 \ xsrc/external/mit/xorg-server/dist/Xi/sendexev.c cvs rdiff -u -r1.1.1.8 -r1.1.1.8.8.1 \ xsrc/external/mit/xorg-server/dist/dix/events.c cvs rdiff -u -r1.1.1.2 -r1.1.1.2.14.1 \ xsrc/external/mit/xorg-server/dist/dix/swapreq.c cvs rdiff -u -r1.1.1.4.38.1 -r1.1.1.4.38.1.4.1 \ xsrc/xfree/xc/programs/Xserver/Xi/sendexev.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: xsrc/external/mit/xorg-server/dist/Xi/sendexev.c diff -u xsrc/external/mit/xorg-server/dist/Xi/sendexev.c:1.1.1.3.10.1 xsrc/external/mit/xorg-server/dist/Xi/sendexev.c:1.1.1.3.10.1.4.1 --- xsrc/external/mit/xorg-server/dist/Xi/sendexev.c:1.1.1.3.10.1 Tue Dec 9 19:36:57 2014 +++ xsrc/external/mit/xorg-server/dist/Xi/sendexev.c Sat Jul 8 17:14:58 2017 @@ -79,7 +79,7 @@ SProcXSendExtensionEvent(ClientPtr clien char n; CARD32 *p; int i; - xEvent eventT; + xEvent eventT = { .u.u.type = 0 }; xEvent *eventP; EventSwapPtr proc; @@ -95,9 +95,17 @@ SProcXSendExtensionEvent(ClientPtr clien eventP = (xEvent *) & stuff[1]; for (i = 0; i < stuff->num_events; i++, eventP++) { + if (eventP->u.u.type == GenericEvent) { + client->errorValue = eventP->u.u.type; + return BadValue; + } + proc = EventSwapVector[eventP->u.u.type & 0177]; - if (proc == NotImplemented) /* no swapping proc; invalid event type? */ + /* no swapping proc; invalid event type? */ + if (proc == NotImplemented) { + client->errorValue = eventP->u.u.type; return BadValue; + } (*proc) (eventP, &eventT); *eventP = eventT; } @@ -117,7 +125,7 @@ SProcXSendExtensionEvent(ClientPtr clien int ProcXSendExtensionEvent(ClientPtr client) { - int ret; + int ret, i; DeviceIntPtr dev; xEvent *first; XEventClass *list; @@ -140,10 +148,12 @@ ProcXSendExtensionEvent(ClientPtr client /* The client's event type must be one defined by an extension. */ first = ((xEvent *) & stuff[1]); - if (!((EXTENSION_EVENT_BASE <= first->u.u.type) && - (first->u.u.type < lastEvent))) { - client->errorValue = first->u.u.type; - return BadValue; + for (i = 0; i < stuff->num_events; i++) { + if (!((EXTENSION_EVENT_BASE <= first[i].u.u.type) && + (first[i].u.u.type < lastEvent))) { + client->errorValue = first[i].u.u.type; + return BadValue; + } } list = (XEventClass *) (first + stuff->num_events); Index: xsrc/external/mit/xorg-server/dist/dix/events.c diff -u xsrc/external/mit/xorg-server/dist/dix/events.c:1.1.1.8 xsrc/external/mit/xorg-server/dist/dix/events.c:1.1.1.8.8.1 --- xsrc/external/mit/xorg-server/dist/dix/events.c:1.1.1.8 Mon Jun 3 07:34:19 2013 +++ xsrc/external/mit/xorg-server/dist/dix/events.c Sat Jul 8 17:14:58 2017 @@ -5021,6 +5021,12 @@ ProcSendEvent(ClientPtr client) client->errorValue = stuff->event.u.u.type; return BadValue; } + /* Generic events can have variable size, but SendEvent request holds + exactly 32B of event data. */ + if (stuff->event.u.u.type == GenericEvent) { + client->errorValue = stuff->event.u.u.type; + return BadValue; + } if (stuff->event.u.u.type == ClientMessage && stuff->event.u.u.detail != 8 && stuff->event.u.u.detail != 16 && Index: xsrc/external/mit/xorg-server/dist/dix/swapreq.c diff -u xsrc/external/mit/xorg-server/dist/dix/swapreq.c:1.1.1.2 xsrc/external/mit/xorg-server/dist/dix/swapreq.c:1.1.1.2.14.1 --- xsrc/external/mit/xorg-server/dist/dix/swapreq.c:1.1.1.2 Tue Nov 23 05:21:00 2010 +++ xsrc/external/mit/xorg-server/dist/dix/swapreq.c Sat Jul 8 17:14:58 2017 @@ -315,6 +315,13 @@ SProcSendEvent(ClientPtr client) swapl(&stuff->destination, n); swapl(&stuff->eventMask, n); + /* Generic events can have variable size, but SendEvent request holds + exactly 32B of event data. */ + if (stuff->event.u.u.type == GenericEvent) { + client->errorValue = stuff->event.u.u.type; + return BadValue; + } + /* Swap event */ proc = EventSwapVector[stuff->event.u.u.type & 0177]; if (!proc || proc == NotImplemented) /* no swapping proc; invalid event type? */ Index: xsrc/xfree/xc/programs/Xserver/Xi/sendexev.c diff -u xsrc/xfree/xc/programs/Xserver/Xi/sendexev.c:1.1.1.4.38.1 xsrc/xfree/xc/programs/Xserver/Xi/sendexev.c:1.1.1.4.38.1.4.1 --- xsrc/xfree/xc/programs/Xserver/Xi/sendexev.c:1.1.1.4.38.1 Thu Dec 11 13:33:15 2014 +++ xsrc/xfree/xc/programs/Xserver/Xi/sendexev.c Sat Jul 8 17:14:58 2017 @@ -89,6 +89,7 @@ SProcXSendExtensionEvent(client) xEvent *eventP; EventSwapPtr proc; + memset(&eventT, 0, sizeof eventT); REQUEST(xSendExtensionEventReq); swaps(&stuff->length, n); REQUEST_AT_LEAST_SIZE(xSendExtensionEventReq); @@ -98,8 +99,11 @@ SProcXSendExtensionEvent(client) for (i=0; i<stuff->num_events; i++,eventP++) { proc = EventSwapVector[eventP->u.u.type & 0177]; - if (proc == NotImplemented) /* no swapping proc; invalid event type? */ + /* no swapping proc; invalid event type? */ + if (proc == NotImplemented) { + client->errorValue = eventP->u.u.type; return (BadValue); + } (*proc)(eventP, &eventT); *eventP = eventT; } @@ -124,7 +128,7 @@ int ProcXSendExtensionEvent (client) register ClientPtr client; { - int ret; + int ret, i; DeviceIntPtr dev; xEvent *first; XEventClass *list; @@ -155,14 +159,13 @@ ProcXSendExtensionEvent (client) /* The client's event type must be one defined by an extension. */ first = ((xEvent *) &stuff[1]); - if ( ! ((EXTENSION_EVENT_BASE <= first->u.u.type) && - (first->u.u.type < lastEvent)) ) - { - client->errorValue = first->u.u.type; - SendErrorToClient(client, IReqCode, X_SendExtensionEvent, 0, - BadValue); - return Success; - } + for (i = 0; i < stuff->num_events; i++) { + if (!((EXTENSION_EVENT_BASE <= first[i].u.u.type) && + (first[i].u.u.type < lastEvent))) { + client->errorValue = first[i].u.u.type; + return BadValue; + } + } list = (XEventClass *) (first + stuff->num_events); if ((ret = CreateMaskFromList (client, list, stuff->count, tmp, dev,