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) | ||||
|     { | ||||
| 	case XACE_RESOURCE_ACCESS: { | ||||
| 	    XaceResourceAccessRec rec = { | ||||
| 		va_arg(ap, ClientPtr), | ||||
| 		va_arg(ap, XID), | ||||
| 		va_arg(ap, RESTYPE), | ||||
| 		va_arg(ap, pointer), | ||||
| 		va_arg(ap, RESTYPE), | ||||
| 		va_arg(ap, pointer), | ||||
| 		va_arg(ap, Mask), | ||||
| 		Success /* default allow */ | ||||
| 	    }; | ||||
| 	    XaceResourceAccessRec rec; | ||||
| 	    rec.client = va_arg(ap, ClientPtr); | ||||
| 	    rec.id = va_arg(ap, XID); | ||||
| 	    rec.rtype = va_arg(ap, RESTYPE); | ||||
| 	    rec.res = va_arg(ap, pointer); | ||||
| 	    rec.ptype = va_arg(ap, RESTYPE); | ||||
| 	    rec.parent = va_arg(ap, pointer); | ||||
| 	    rec.access_mode = va_arg(ap, Mask); | ||||
| 	    rec.status = Success; /* default allow */ | ||||
| 	    calldata = &rec; | ||||
| 	    prv = &rec.status; | ||||
| 	    break; | ||||
| 	} | ||||
| 	case XACE_DEVICE_ACCESS: { | ||||
| 	    XaceDeviceAccessRec rec = { | ||||
| 		va_arg(ap, ClientPtr), | ||||
| 		va_arg(ap, DeviceIntPtr), | ||||
| 		va_arg(ap, Mask), | ||||
| 		Success /* default allow */ | ||||
| 	    }; | ||||
| 	    XaceDeviceAccessRec rec; | ||||
| 	    rec.client = va_arg(ap, ClientPtr); | ||||
| 	    rec.dev = va_arg(ap, DeviceIntPtr); | ||||
| 	    rec.access_mode = va_arg(ap, Mask); | ||||
| 	    rec.status = Success; /* default allow */ | ||||
| 	    calldata = &rec; | ||||
| 	    prv = &rec.status; | ||||
| 	    break; | ||||
| 	} | ||||
| 	case XACE_SEND_ACCESS: { | ||||
| 	    XaceSendAccessRec rec = { | ||||
| 		va_arg(ap, ClientPtr), | ||||
| 		va_arg(ap, DeviceIntPtr), | ||||
| 		va_arg(ap, WindowPtr), | ||||
| 		va_arg(ap, xEventPtr), | ||||
| 		va_arg(ap, int), | ||||
| 		Success /* default allow */ | ||||
| 	    }; | ||||
| 	    XaceSendAccessRec rec; | ||||
| 	    rec.client = va_arg(ap, ClientPtr); | ||||
| 	    rec.dev = va_arg(ap, DeviceIntPtr); | ||||
| 	    rec.pWin = va_arg(ap, WindowPtr); | ||||
| 	    rec.events = va_arg(ap, xEventPtr); | ||||
| 	    rec.count = va_arg(ap, int); | ||||
| 	    rec.status = Success; /* default allow */ | ||||
| 	    calldata = &rec; | ||||
| 	    prv = &rec.status; | ||||
| 	    break; | ||||
| 	} | ||||
| 	case XACE_RECEIVE_ACCESS: { | ||||
| 	    XaceReceiveAccessRec rec = { | ||||
| 		va_arg(ap, ClientPtr), | ||||
| 		va_arg(ap, WindowPtr), | ||||
| 		va_arg(ap, xEventPtr), | ||||
| 		va_arg(ap, int), | ||||
| 		Success /* default allow */ | ||||
| 	    }; | ||||
| 	    XaceReceiveAccessRec rec; | ||||
| 	    rec.client = va_arg(ap, ClientPtr); | ||||
| 	    rec.pWin = va_arg(ap, WindowPtr); | ||||
| 	    rec.events = va_arg(ap, xEventPtr); | ||||
| 	    rec.count = va_arg(ap, int); | ||||
| 	    rec.status = Success; /* default allow */ | ||||
| 	    calldata = &rec; | ||||
| 	    prv = &rec.status; | ||||
| 	    break; | ||||
| 	} | ||||
| 	case XACE_CLIENT_ACCESS: { | ||||
| 	    XaceClientAccessRec rec = { | ||||
| 		va_arg(ap, ClientPtr), | ||||
| 		va_arg(ap, ClientPtr), | ||||
| 		va_arg(ap, Mask), | ||||
| 		Success /* default allow */ | ||||
| 	    }; | ||||
| 	    XaceClientAccessRec rec; | ||||
| 	    rec.client = va_arg(ap, ClientPtr); | ||||
| 	    rec.target = va_arg(ap, ClientPtr); | ||||
| 	    rec.access_mode = va_arg(ap, Mask); | ||||
| 	    rec.status = Success; /* default allow */ | ||||
| 	    calldata = &rec; | ||||
| 	    prv = &rec.status; | ||||
| 	    break; | ||||
| 	} | ||||
| 	case XACE_EXT_ACCESS: { | ||||
| 	    XaceExtAccessRec rec = { | ||||
| 		va_arg(ap, ClientPtr), | ||||
| 		va_arg(ap, ExtensionEntry*), | ||||
| 		DixGetAttrAccess, | ||||
| 		Success /* default allow */ | ||||
| 	    }; | ||||
| 	    XaceExtAccessRec rec; | ||||
| 	    rec.client = va_arg(ap, ClientPtr); | ||||
| 	    rec.ext = va_arg(ap, ExtensionEntry*); | ||||
| 	    rec.access_mode = DixGetAttrAccess; | ||||
| 	    rec.status = Success; /* default allow */ | ||||
| 	    calldata = &rec; | ||||
| 	    prv = &rec.status; | ||||
| 	    break; | ||||
| 	} | ||||
| 	case XACE_SERVER_ACCESS: { | ||||
| 	    XaceServerAccessRec rec = { | ||||
| 		va_arg(ap, ClientPtr), | ||||
| 		va_arg(ap, Mask), | ||||
| 		Success /* default allow */ | ||||
| 	    }; | ||||
| 	    XaceServerAccessRec rec; | ||||
| 	    rec.client = va_arg(ap, ClientPtr); | ||||
| 	    rec.access_mode = va_arg(ap, Mask); | ||||
| 	    rec.status = Success; /* default allow */ | ||||
| 	    calldata = &rec; | ||||
| 	    prv = &rec.status; | ||||
| 	    break; | ||||
| 	} | ||||
| 	case XACE_SCREEN_ACCESS: | ||||
| 	case XACE_SCREENSAVER_ACCESS: { | ||||
| 	    XaceScreenAccessRec rec = { | ||||
| 		va_arg(ap, ClientPtr), | ||||
| 		va_arg(ap, ScreenPtr), | ||||
| 		va_arg(ap, Mask), | ||||
| 		Success /* default allow */ | ||||
| 	    }; | ||||
| 	    XaceScreenAccessRec rec; | ||||
| 	    rec.client = va_arg(ap, ClientPtr); | ||||
| 	    rec.screen = va_arg(ap, ScreenPtr); | ||||
| 	    rec.access_mode = va_arg(ap, Mask); | ||||
| 	    rec.status = Success; /* default allow */ | ||||
| 	    calldata = &rec; | ||||
| 	    prv = &rec.status; | ||||
| 	    break; | ||||
| 	} | ||||
| 	case XACE_AUTH_AVAIL: { | ||||
| 	    XaceAuthAvailRec rec = { | ||||
| 		va_arg(ap, ClientPtr), | ||||
| 		va_arg(ap, XID) | ||||
| 	    }; | ||||
| 	    XaceAuthAvailRec rec; | ||||
| 	    rec.client = va_arg(ap, ClientPtr); | ||||
| 	    rec.authId = va_arg(ap, XID); | ||||
| 	    calldata = &rec; | ||||
| 	    break; | ||||
| 	} | ||||
| 	case XACE_KEY_AVAIL: { | ||||
| 	    XaceKeyAvailRec rec = { | ||||
| 		va_arg(ap, xEventPtr), | ||||
| 		va_arg(ap, DeviceIntPtr), | ||||
| 		va_arg(ap, int) | ||||
| 	    }; | ||||
| 	    XaceKeyAvailRec rec; | ||||
| 	    rec.event = va_arg(ap, xEventPtr); | ||||
| 	    rec.keybd = va_arg(ap, DeviceIntPtr); | ||||
| 	    rec.count = va_arg(ap, int); | ||||
| 	    calldata = &rec; | ||||
| 	    break; | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue