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