The way XaceHook() mixes struct initializers and va_arg() is not portable and
gives bogus data on sparc and probably others leading to a crash. Fix: Don't use initializers, instead set each member directly to enforce order. Signed-off-by: Eamon Walsh <ewalsh@tycho.nsa.gov>
This commit is contained in:
parent
48a9d65b88
commit
36dc66ae79
116
Xext/xace.c
116
Xext/xace.c
|
@ -100,114 +100,104 @@ int XaceHook(int hook, ...)
|
||||||
switch (hook)
|
switch (hook)
|
||||||
{
|
{
|
||||||
case XACE_RESOURCE_ACCESS: {
|
case XACE_RESOURCE_ACCESS: {
|
||||||
XaceResourceAccessRec rec = {
|
XaceResourceAccessRec rec;
|
||||||
va_arg(ap, ClientPtr),
|
rec.client = va_arg(ap, ClientPtr);
|
||||||
va_arg(ap, XID),
|
rec.id = va_arg(ap, XID);
|
||||||
va_arg(ap, RESTYPE),
|
rec.rtype = va_arg(ap, RESTYPE);
|
||||||
va_arg(ap, pointer),
|
rec.res = va_arg(ap, pointer);
|
||||||
va_arg(ap, RESTYPE),
|
rec.ptype = va_arg(ap, RESTYPE);
|
||||||
va_arg(ap, pointer),
|
rec.parent = va_arg(ap, pointer);
|
||||||
va_arg(ap, Mask),
|
rec.access_mode = va_arg(ap, Mask);
|
||||||
Success /* default allow */
|
rec.status = Success; /* default allow */
|
||||||
};
|
|
||||||
calldata = &rec;
|
calldata = &rec;
|
||||||
prv = &rec.status;
|
prv = &rec.status;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case XACE_DEVICE_ACCESS: {
|
case XACE_DEVICE_ACCESS: {
|
||||||
XaceDeviceAccessRec rec = {
|
XaceDeviceAccessRec rec;
|
||||||
va_arg(ap, ClientPtr),
|
rec.client = va_arg(ap, ClientPtr);
|
||||||
va_arg(ap, DeviceIntPtr),
|
rec.dev = va_arg(ap, DeviceIntPtr);
|
||||||
va_arg(ap, Mask),
|
rec.access_mode = va_arg(ap, Mask);
|
||||||
Success /* default allow */
|
rec.status = Success; /* default allow */
|
||||||
};
|
|
||||||
calldata = &rec;
|
calldata = &rec;
|
||||||
prv = &rec.status;
|
prv = &rec.status;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case XACE_SEND_ACCESS: {
|
case XACE_SEND_ACCESS: {
|
||||||
XaceSendAccessRec rec = {
|
XaceSendAccessRec rec;
|
||||||
va_arg(ap, ClientPtr),
|
rec.client = va_arg(ap, ClientPtr);
|
||||||
va_arg(ap, DeviceIntPtr),
|
rec.dev = va_arg(ap, DeviceIntPtr);
|
||||||
va_arg(ap, WindowPtr),
|
rec.pWin = va_arg(ap, WindowPtr);
|
||||||
va_arg(ap, xEventPtr),
|
rec.events = va_arg(ap, xEventPtr);
|
||||||
va_arg(ap, int),
|
rec.count = va_arg(ap, int);
|
||||||
Success /* default allow */
|
rec.status = Success; /* default allow */
|
||||||
};
|
|
||||||
calldata = &rec;
|
calldata = &rec;
|
||||||
prv = &rec.status;
|
prv = &rec.status;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case XACE_RECEIVE_ACCESS: {
|
case XACE_RECEIVE_ACCESS: {
|
||||||
XaceReceiveAccessRec rec = {
|
XaceReceiveAccessRec rec;
|
||||||
va_arg(ap, ClientPtr),
|
rec.client = va_arg(ap, ClientPtr);
|
||||||
va_arg(ap, WindowPtr),
|
rec.pWin = va_arg(ap, WindowPtr);
|
||||||
va_arg(ap, xEventPtr),
|
rec.events = va_arg(ap, xEventPtr);
|
||||||
va_arg(ap, int),
|
rec.count = va_arg(ap, int);
|
||||||
Success /* default allow */
|
rec.status = Success; /* default allow */
|
||||||
};
|
|
||||||
calldata = &rec;
|
calldata = &rec;
|
||||||
prv = &rec.status;
|
prv = &rec.status;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case XACE_CLIENT_ACCESS: {
|
case XACE_CLIENT_ACCESS: {
|
||||||
XaceClientAccessRec rec = {
|
XaceClientAccessRec rec;
|
||||||
va_arg(ap, ClientPtr),
|
rec.client = va_arg(ap, ClientPtr);
|
||||||
va_arg(ap, ClientPtr),
|
rec.target = va_arg(ap, ClientPtr);
|
||||||
va_arg(ap, Mask),
|
rec.access_mode = va_arg(ap, Mask);
|
||||||
Success /* default allow */
|
rec.status = Success; /* default allow */
|
||||||
};
|
|
||||||
calldata = &rec;
|
calldata = &rec;
|
||||||
prv = &rec.status;
|
prv = &rec.status;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case XACE_EXT_ACCESS: {
|
case XACE_EXT_ACCESS: {
|
||||||
XaceExtAccessRec rec = {
|
XaceExtAccessRec rec;
|
||||||
va_arg(ap, ClientPtr),
|
rec.client = va_arg(ap, ClientPtr);
|
||||||
va_arg(ap, ExtensionEntry*),
|
rec.ext = va_arg(ap, ExtensionEntry*);
|
||||||
DixGetAttrAccess,
|
rec.access_mode = DixGetAttrAccess;
|
||||||
Success /* default allow */
|
rec.status = Success; /* default allow */
|
||||||
};
|
|
||||||
calldata = &rec;
|
calldata = &rec;
|
||||||
prv = &rec.status;
|
prv = &rec.status;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case XACE_SERVER_ACCESS: {
|
case XACE_SERVER_ACCESS: {
|
||||||
XaceServerAccessRec rec = {
|
XaceServerAccessRec rec;
|
||||||
va_arg(ap, ClientPtr),
|
rec.client = va_arg(ap, ClientPtr);
|
||||||
va_arg(ap, Mask),
|
rec.access_mode = va_arg(ap, Mask);
|
||||||
Success /* default allow */
|
rec.status = Success; /* default allow */
|
||||||
};
|
|
||||||
calldata = &rec;
|
calldata = &rec;
|
||||||
prv = &rec.status;
|
prv = &rec.status;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case XACE_SCREEN_ACCESS:
|
case XACE_SCREEN_ACCESS:
|
||||||
case XACE_SCREENSAVER_ACCESS: {
|
case XACE_SCREENSAVER_ACCESS: {
|
||||||
XaceScreenAccessRec rec = {
|
XaceScreenAccessRec rec;
|
||||||
va_arg(ap, ClientPtr),
|
rec.client = va_arg(ap, ClientPtr);
|
||||||
va_arg(ap, ScreenPtr),
|
rec.screen = va_arg(ap, ScreenPtr);
|
||||||
va_arg(ap, Mask),
|
rec.access_mode = va_arg(ap, Mask);
|
||||||
Success /* default allow */
|
rec.status = Success; /* default allow */
|
||||||
};
|
|
||||||
calldata = &rec;
|
calldata = &rec;
|
||||||
prv = &rec.status;
|
prv = &rec.status;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case XACE_AUTH_AVAIL: {
|
case XACE_AUTH_AVAIL: {
|
||||||
XaceAuthAvailRec rec = {
|
XaceAuthAvailRec rec;
|
||||||
va_arg(ap, ClientPtr),
|
rec.client = va_arg(ap, ClientPtr);
|
||||||
va_arg(ap, XID)
|
rec.authId = va_arg(ap, XID);
|
||||||
};
|
|
||||||
calldata = &rec;
|
calldata = &rec;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case XACE_KEY_AVAIL: {
|
case XACE_KEY_AVAIL: {
|
||||||
XaceKeyAvailRec rec = {
|
XaceKeyAvailRec rec;
|
||||||
va_arg(ap, xEventPtr),
|
rec.event = va_arg(ap, xEventPtr);
|
||||||
va_arg(ap, DeviceIntPtr),
|
rec.keybd = va_arg(ap, DeviceIntPtr);
|
||||||
va_arg(ap, int)
|
rec.count = va_arg(ap, int);
|
||||||
};
|
|
||||||
calldata = &rec;
|
calldata = &rec;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue