dix: don't alloc in ChangeMasterDeviceClasses.
We mustn't realloc as we are inside a signal handler. With SetMinimumEventSize, this code should never be hit anyway, as the event list should have the required memory before this code is hit. Signed-off-by: Peter Hutterer <peter.hutterer@redhat.com>
This commit is contained in:
parent
fb2a8d0e59
commit
aeff14d5f2
|
@ -753,6 +753,8 @@ ChangeMasterDeviceClasses(DeviceIntPtr device,
|
||||||
{
|
{
|
||||||
DeviceIntPtr master = device->u.master;
|
DeviceIntPtr master = device->u.master;
|
||||||
char* classbuff;
|
char* classbuff;
|
||||||
|
int len = sizeof(xEvent);
|
||||||
|
int namelen = 0; /* dummy */
|
||||||
|
|
||||||
if (device->isMaster)
|
if (device->isMaster)
|
||||||
return;
|
return;
|
||||||
|
@ -763,11 +765,14 @@ ChangeMasterDeviceClasses(DeviceIntPtr device,
|
||||||
dcce->deviceid = master->id;
|
dcce->deviceid = master->id;
|
||||||
dcce->num_classes = 0;
|
dcce->num_classes = 0;
|
||||||
|
|
||||||
|
SizeDeviceInfo(device, &namelen, &len);
|
||||||
|
dcce->length = (len - sizeof(xEvent))/4;
|
||||||
|
|
||||||
master->public.devicePrivate = device->public.devicePrivate;
|
master->public.devicePrivate = device->public.devicePrivate;
|
||||||
|
|
||||||
DeepCopyDeviceClasses(device, master);
|
DeepCopyDeviceClasses(device, master);
|
||||||
|
|
||||||
/* event is already correct size, see comment in GetPointerEvents */
|
/* event is already correct size, see SetMinimumEventSize */
|
||||||
classbuff = (char*)&dcce[1];
|
classbuff = (char*)&dcce[1];
|
||||||
|
|
||||||
/* we don't actually swap if there's a NullClient, swapping is done
|
/* we don't actually swap if there's a NullClient, swapping is done
|
||||||
|
|
|
@ -119,25 +119,6 @@ CreateClassesChangedEvent(EventList* event,
|
||||||
deviceClassesChangedEvent *dcce;
|
deviceClassesChangedEvent *dcce;
|
||||||
int len = sizeof(xEvent);
|
int len = sizeof(xEvent);
|
||||||
CARD32 ms = GetTimeInMillis();
|
CARD32 ms = GetTimeInMillis();
|
||||||
int namelen = 0; /* dummy */
|
|
||||||
|
|
||||||
/* XXX: ok, this is a bit weird. We need to alloc enough size for the
|
|
||||||
* event so it can be filled in in POE lateron. Reason being that if
|
|
||||||
* we realloc the event in POE we can get SIGABRT when we try to free
|
|
||||||
* or realloc the original pointer.
|
|
||||||
* We can only do it here as we don't have the EventList in the event
|
|
||||||
* processing any more.
|
|
||||||
*/
|
|
||||||
SizeDeviceInfo(slave, &namelen, &len);
|
|
||||||
|
|
||||||
if (event->evlen < len)
|
|
||||||
{
|
|
||||||
event->event = realloc(event->event, len);
|
|
||||||
if (!event->event)
|
|
||||||
FatalError("[dix] Cannot allocate memory for "
|
|
||||||
"DeviceClassesChangedEvent.\n");
|
|
||||||
event->evlen = len;
|
|
||||||
}
|
|
||||||
|
|
||||||
dcce = (deviceClassesChangedEvent*)event->event;
|
dcce = (deviceClassesChangedEvent*)event->event;
|
||||||
dcce->type = GenericEvent;
|
dcce->type = GenericEvent;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user