Deleting a property that was not set on a device leads to a null-pointer dereference. The protocol allows deleting those properties - it has to be a noop.
Reproducible: xinput --set-prop "My device" --type=int --format=8 "my property" 1 xinput --delete-prop "My other device" "my property" Signed-off-by: Peter Hutterer <[email protected]> --- Xi/xiproperty.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c index 024dc44..53c947f 100644 --- a/Xi/xiproperty.c +++ b/Xi/xiproperty.c @@ -643,6 +643,9 @@ XIDeleteDeviceProperty (DeviceIntPtr device, Atom property, Bool fromClient) if (prop->propertyName == property) break; + if (!prop) + return BadAtom; + if (fromClient && !prop->deletable) return BadAccess; @@ -934,6 +937,10 @@ ProcXDeleteDeviceProperty (ClientPtr client) } rc = XIDeleteDeviceProperty(dev, stuff->property, TRUE); + /* if the property doesn't exist on this device, it's a noop */ + if (rc == BadAtom) + rc = Success; + return rc; } @@ -1177,6 +1184,10 @@ ProcXIDeleteProperty(ClientPtr client) } rc = XIDeleteDeviceProperty(dev, stuff->property, TRUE); + /* if the property doesn't exist on this device, it's a noop */ + if (rc == BadAtom) + rc = Success; + return rc; } -- 1.6.5.2 _______________________________________________ xorg-devel mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-devel
