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:
Michael Lorenz 2009-07-07 20:21:39 -04:00 committed by Eamon Walsh
parent 48a9d65b88
commit 36dc66ae79

View File

@ -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;
} }