On Tue, Feb 03, 2009 at 04:46:05PM -0800, Dan Nicholson wrote: > On Tue, Feb 3, 2009 at 4:30 PM, Peter Hutterer <[email protected]> > wrote: > > If we have a busted xkb setup, the XKB initialization on the core devices > > fails and leaves us with dev->key->xkbInfo == NULL. This in turn causes > > segfaults lateron. > > > > Return BadValue when the XKB configuration for a master device failed, and > > if > > that happens for the VCP/VCK, die semi-gracefully. > > Seems reasonable to me. I'd much rather die early than scratch my head > on some later crash. Would it also be a good idea to return BadValue > from CorePointerProc when InitPointerDeviceStruct fails? I don't know > what you'd put in the log in that situation, though.
IPDS seems to only fail if we run out of memory. What about adding hunk 2? Cheers, Peter >From 29b2848cecf1ccde8fba7d7b1bfafa03873753d8 Mon Sep 17 00:00:00 2001 From: Peter Hutterer <[email protected]> Date: Wed, 4 Feb 2009 10:11:13 +1000 Subject: [PATCH] dix: die if we can't activate or init the VCP/VCK. If we have a busted xkb setup, the XKB initialization on the core devices fails and leaves us with dev->key->xkbInfo == NULL. This in turn causes segfaults lateron. Return BadValue when the XKB configuration for a master device failed, and if that happens for the VCP/VCK, die semi-gracefully. The VCP init can only fail on OOM. Reported by Aaron Plattner. Signed-off-by: Peter Hutterer <[email protected]> --- dix/devices.c | 28 +++++++++++++++++++--------- 1 files changed, 19 insertions(+), 9 deletions(-) diff --git a/dix/devices.c b/dix/devices.c index 6578229..f301d98 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -488,8 +488,13 @@ CoreKeyboardProc(DeviceIntPtr pDev, int what) switch (what) { case DEVICE_INIT: XkbGetRulesDflts(&rmlvo); - InitKeyboardDeviceStruct(pDev, &rmlvo, CoreKeyboardBell, - CoreKeyboardCtl); + if (!InitKeyboardDeviceStruct(pDev, &rmlvo, CoreKeyboardBell, + CoreKeyboardCtl)) + { + ErrorF("Keyboard initialization failed. This could be a missing " + "or incorrect setup of xkeyboard-config.\n"); + return BadValue; + } return Success; case DEVICE_ON: @@ -519,9 +524,13 @@ CorePointerProc(DeviceIntPtr pDev, int what) case DEVICE_INIT: for (i = 1; i <= 32; i++) map[i] = i; - InitPointerDeviceStruct((DevicePtr)pDev, map, 32, + if (!InitPointerDeviceStruct((DevicePtr)pDev, map, 32, (PtrCtrlProcPtr)NoopDDA, - GetMotionHistorySize(), 2); + GetMotionHistorySize(), 2)) + { + ErrorF("Could not initialize device '%s'. OOM\n", pDev->name); + return BadAlloc; /* IPDS only fails on allocs */ + } pDev->valuator->axisVal[0] = screenInfo.screens[0]->width / 2; pDev->last.valuators[0] = pDev->valuator->axisVal[0]; pDev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2; @@ -554,11 +563,12 @@ InitCoreDevices(void) &inputInfo.keyboard) != Success) FatalError("Failed to allocate core devices"); - ActivateDevice(inputInfo.pointer); - ActivateDevice(inputInfo.keyboard); - EnableDevice(inputInfo.pointer); - EnableDevice(inputInfo.keyboard); - + if (ActivateDevice(inputInfo.pointer) != Success || + ActivateDevice(inputInfo.keyboard) != Success) + FatalError("Failed to activate core devices."); + if (!EnableDevice(inputInfo.pointer) || + !EnableDevice(inputInfo.keyboard)) + FatalError("Failed to enable core devices."); } /** -- 1.6.0.6 _______________________________________________ xorg mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/xorg
