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