summaryrefslogtreecommitdiff
path: root/src
AgeCommit message (Collapse)Author
2013-05-23memory corruption in _XIPassiveGrabDevice() [CVE-2013-1998 2/3]Alan Coopersmith
If the server returned more modifiers than the caller asked for, we'd just keep copying past the end of the array provided by the caller, writing over who-knows-what happened to be there. Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
2013-05-23Stack buffer overflow in XGetDeviceButtonMapping() [CVE-2013-1998 1/3]Alan Coopersmith
We copy the entire reply sent by the server into the fixed size mapping[] array on the stack, even if the server says it's a larger size than the mapping array can hold. HULK SMASH STACK! Reported-by: Ilja Van Sprundel <ivansprundel@ioactive.com> Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
2013-05-23Use _XEatDataWords to avoid overflow of rep.length bit shiftingAlan Coopersmith
rep.length is a CARD32, so rep.length << 2 could overflow in 32-bit builds Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
2013-05-20Copy the sequence number into the target event too (#64687)Peter Hutterer
X.Org Bug 64687 <http://bugs.freedesktop.org/show_bug.cgi?id=64687> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Jasper St. Pierre <jstpierre@mecheye.net>
2013-04-30Expand comment on the memory vs. reply ordering in XIGetSelectedEvents()Alan Coopersmith
Unpacking from the wire involves un-interleaving the structs & masks, which wasn't obvious to me the first time I read it, so make notes before I forget again. Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2013-04-05Require XFixes for PointerBarrier, remove duplicate typedefPeter Hutterer
The PointerBarrier typedef is duplicate if a client includes both Xfixes.h and XInput2.h. gcc 4.6 won't complain about that, but earlier versions do: http://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=ce3765bf44e49ef0568a1ad4a0b7f807591d6412 gcc 4.6 with -pedantic-errors shows: /opt/xorg/include/X11/extensions/XInput2.h:172:13: error: redefinition of typedef ‘PointerBarrier’ [-pedantic] In file included from test.c:1:0: /opt/xorg/include/X11/extensions/Xfixes.h:255:13: note: previous declaration of ‘PointerBarrier’ was here Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Julien Cristau <jcristau@debian.org>
2013-01-15Add missing XI_RawTouch* in XInputCopyCookieBenjamin Tissoires
Looks like XI_RawTouch* events are missing in the big switch in this function. When running XIT tests for multitouch devices, several following errors appears: XInputCopyCookie: Failed to copy evtype 22 XInputCopyCookie: Failed to copy evtype 23 XInputCopyCookie: Failed to copy evtype 24 Signed-off-by: Benjamin Tissoires <benjamin.tissoires@gmail.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2012-12-09Add support for pointer barrier eventsJasper St. Pierre
Signed-off-by: Jasper St. Pierre <jstpierre@mecheye.net> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2012-12-10Fix const compiler warningsPeter Hutterer
XExtInt.c:80:38: warning: initialization discards 'const' qualifier from pointer target type [enabled by default] XExtInt.c:150:5: warning: initialization discards 'const' qualifier from pointer target type [enabled by default] XExtInt.c:151:5: warning: initialization discards 'const' qualifier from pointer target type [enabled by default] XExtInt.c:152:5: warning: initialization discards 'const' qualifier from pointer target type [enabled by default] XExtInt.c:153:5: warning: initialization discards 'const' qualifier from pointer target type [enabled by default] XExtInt.c:154:5: warning: initialization discards 'const' qualifier from pointer target type [enabled by default] Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Dan Nicholson <dbn.lists@gmail.com>
2012-12-10Fix compiler warningsPeter Hutterer
XIQueryVersion.c: In function '_xiQueryVersion': XIQueryVersion.c:63:26: warning: declaration of 'info' shadows a parameter [-Wshadow] XIQueryVersion.c:53:73: warning: shadowed declaration is here [-Wshadow] XExtInt.c: In function 'XInputWireToEvent': XExtInt.c:823:25: warning: declaration of 'i' shadows a previous local [-Wshadow] XExtInt.c:502:18: warning: shadowed declaration is here [-Wshadow] XExtInt.c:850:25: warning: declaration of 'i' shadows a previous local [-Wshadow] XExtInt.c:502:18: warning: shadowed declaration is here [-Wshadow] In file included from XExtInt.c:64:0: ../include/X11/extensions/XInput.h:166:17: note: previous declaration of '_xidevicebusy' was here XExtInt.c:101:12: warning: redundant redeclaration of '_XiGetDevicePresenceNotifyEvent' [-Wredundant-decls] XExtInt.c:76:13: warning: redundant redeclaration of '_xibaddevice' [-Wredundant-decls] In file included from XExtInt.c:64:0: ../include/X11/extensions/XInput.h:162:17: note: previous declaration of '_xibaddevice' was here XExtInt.c:81:13: warning: redundant redeclaration of '_xibadclass' [-Wredundant-decls] In file included from XExtInt.c:64:0: ../include/X11/extensions/XInput.h:163:17: note: previous declaration of '_xibadclass' was here XExtInt.c:86:13: warning: redundant redeclaration of '_xibadevent' [-Wredundant-decls] In file included from XExtInt.c:64:0: ../include/X11/extensions/XInput.h:164:17: note: previous declaration of '_xibadevent' was here XExtInt.c:91:13: warning: redundant redeclaration of '_xibadmode' [-Wredundant-decls] In file included from XExtInt.c:64:0: ../include/X11/extensions/XInput.h:165:17: note: previous declaration of '_xibadmode' was here XExtInt.c:96:13: warning: redundant redeclaration of '_xidevicebusy' [-Wredundant-decls] In file included from XExtInt.c:64:0: ../include/X11/extensions/XInput.h:166:17: note: previous declaration of '_xidevicebusy' was here XListDev.c: In function 'ParseClassInfo': XListDev.c:116:33: warning: declaration of 'k' shadows a previous local [-Wshadow] XListDev.c:109:12: warning: shadowed declaration is here [-Wshadow] XGetFCtl.c: In function 'XGetFeedbackControl': XGetFCtl.c:184:26: warning: declaration of 'i' shadows a previous local [-Wshadow] XGetFCtl.c:72:17: warning: shadowed declaration is here [-Wshadow] Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Dan Nicholson <dbn.lists@gmail.com>
2012-04-23Destroy extension record after last display is removedChase Douglas
The extension record is currently leaked and never freed. Signed-off-by: Chase Douglas <chase.douglas@canonical.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2012-03-26Set the RawEvent sourceid (#34240)Peter Hutterer
XI 2.2 and later include the sourceid in raw events. X.Org Bug 34240 <http://bugs.freedesktop.org/show_bug.cgi?id=34240> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
2012-03-26Move version comparison into a helper function.Peter Hutterer
No functional changes, this simply introduces a version helper function that returns -1, 0 or 1 depending on the version comparison result. To be used internally only. Needed for fix to #34240 Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
2012-03-15Fix wrong button label and mask copy on OS XPeter Hutterer
Regression introduced in c1a5a70b51f12dedf354102217c7cd4247ed3a4b. If double-padding is applied, the length of the mask on the wire may be smaller than libXi's mask_len. When copying, only the wire length must be copied, with the remainder set to 0. When advancing to the button labels, the wire length matters, not libXi's internal length. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com> Tested-by: Jeremy Huddleston <jeremyhu@apple.com>
2012-03-08Fix XIScrollClass increment value on 32-bit machinesChase Douglas
This fixes scroll class increment values on 32-bit machines. Performing 1UL << 32 shifts the bit off the end of a 32-bit unsigned long value. By expanding to 1ULL, we have the full 64-bits of an unsigned long long including on 32-bit machines. Before this change, xinput list --long would output scroll increment values of -nan. Signed-off-by: Chase Douglas <chase.douglas@canonical.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2012-02-23Fix bus error on MIPS N32 for bug #38331.Michał Masłowski
XIValuatorClassInfo and XIScrollClassInfo might have an address of 4 bytes modulo 8, while they contain doubles which need 8 byte alignment. This is fixed by adding extra padding after each structure or array in sizeDeviceClassType and adding helper functions to determine sizes and padding only in one place. Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=38331 Signed-off-by: Michał Masłowski <mtjm@mtjm.eu> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2012-02-09Handle new XIAllowEvent request sizePeter Hutterer
inputproto 2.1.99.6 restored the previous request for ABI compatibility reasons, and it introduced a new XI 2.2 specific define. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Keith Packard <keithp@keithp.com>
2012-01-18Force class alignment to a multiple of sizeof(XID).Peter Hutterer
Calculate length field to a multiples of sizeof(XID). XIDs are typedefs to ulong and thus may be 8 bytes on some platforms. This can trigger a SIGBUS if a class ends up not being 8-aligned (e.g. after XAxisInfo). Reported-by: Nicolai Stange <nicolai.stange@zmaw.de> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Matthieu Herrb <matthieu.herrb@laas.fr>
2011-12-21Implement support for XI 2.2Peter Hutterer
Adds support for the new TouchClass for multitouch-capable servers/devices. New events: XITouchOwnershipEvent New event types handled: XITouchBegin, XITouchUpdate, XITouchEnd XIRawTouchBegin, XIRawTouchUpdate, XIRawTouchEnd New functions: XIGrabTouchBegin ... passive grabs on touches XIUngrabTouchBegin XIAllowTouchEvents ... Allow/reject touch event sequences New XIQueryDevice classes: XITouchClassInfo Requires libX11 1.5 for GetReqSized Co-authored by: Chase Douglas <chase.douglas@canonical.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2011-11-12Include config.h from source filesPeter Hutterer
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Gaetan Nadon <memsize@videotron.ca> Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
2011-11-12Stop unnecessary calls to size_classesPeter Hutterer
Xmalloc is a macro evaluating its argument twice. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
2011-11-12Fix duplicate sizeof in copy_classesPeter Hutterer
sizeof(bla * sizeof()) is'nt right. Plus add some () to the next_block call too to emphasise that *nclasses is the multiplicator. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
2011-10-10Remove superfluous assignment of lib->classes in XIQueryDevices.Peter Hutterer
A few lines south from here we malloc lib->classes, this assignment is a leftover from 225071e2e67fb65a0258397212f9826c9b25e078. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
2011-09-28Use a separate nclasses variable in XIQueryDevicePeter Hutterer
No functional changes, just clarifying the code. If we skip over unknown classes, lib->num_classes != wire->num_classe. Use a separate variable to make that change more explicit and align the code closer with wireToDeviceChangedEvent. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Daniel Stone <daniel@fooishbar.org>
2011-09-18Use AM_CPPFLAGS to use in tree headers before installed headersJeremy Huddleston
This addresses a build failure found by the tinderbox. Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com> Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
2011-09-17Support XI 2.1 XIScrollClassPeter Hutterer
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2011-09-17Support XI 2.1 internallyPeter Hutterer
Add the required constants to pretend to support XI 2.1. Having named constants for 2.1 seems a bit pointless, so let's just use the numbers directly. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
2011-08-19Handle unknown device classes.Peter Hutterer
If the server sends an unknown device class in response to an XIQueryDevice call, no memory is allocated for these classes but we still write type and sourceid as well as setting to->classes[i]. The latter causes multiple classes to point to the same memory field. Move the common code of assigning these three into the respective class type handlers so to automatically skip any unknown classes. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2011-08-12Don't use the protocol defines for 2.0 versioning.Peter Hutterer
Otherwise we run into the old problem again: recompiling libXi against newer inputproto headers will appear to change the version support, potentially causing errors or other misbehaviours. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
2011-08-02Add XI2 library-internal array offsets to XIint.hPeter Hutterer
These defines are currently defined in XI.h and XI2.h. Their only use is as offset into a library-internal array. Add them to XIint.h to have them where they belong. These defines do not have any effect on the protocol. They are simply offsets into an array for libXi-specific version checking. The defines are added to this header for readability, given that we cannot remove them from the protocol without potentially breaking clients (who should never use these anyway, but...) means they will never get hit. Future defines for these offsets will only be added to libXi, not the protocol. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2011-06-03Use Data, not Data32 in XIPassiveGrabDevicePeter Hutterer
Data32 takes and iterates over an array of longs, thus skipping every 4 bytes on LP64. Here we only have arrays of ints, use the normal Data macro instead. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
2011-05-19Silence compiler warning due to differnent event conversion procsPeter Hutterer
XExtInt.c:161:5: warning: initialization from incompatible pointer type XSndExEv.c: In function 'XSendExtensionEvent': XSndExEv.c:84:8: warning: assignment from incompatible pointer type Xlib and libXi differ in the conversion functions. libXi takes an xEvent** and a num_events parameter since it may split an event into multiple xEvents. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2011-05-19Silence compiler warning in XListDProp.cPeter Hutterer
XListDProp.c: In function 'XListDeviceProperties': XListDProp.c:72:9: warning: pointer targets in passing argument 2 of '_XRead32' differ in signedness /usr/include/X11/Xlibint.h:652:13: note: expected 'long int *' but argument is of type 'Atom *' Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2011-05-05Remove a few unused assignments.Peter Hutterer
Found by static analyzer. Reported-by: Jeremy Huddleston <jeremyhu@apple.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
2011-05-05XIChangeHierarchy: Return Success early if no actual changes are requested.Peter Hutterer
Do the same for negative num_changes. Found by static analyzer. Reported-by: Jeremy Huddleston <jeremyhu@apple.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
2011-05-05Allocate enough memory for raw events + extra data.Peter Hutterer
Necessary space was calculated, but not actually used to allocate memory. As a result, valuator data would overwrite the allocated memory. ==4166== Invalid write of size 1 ==4166== at 0x4C29F04: memcpy (mc_replace_strmem.c:497) ==4166== by 0x8F39180: ??? (in /usr/lib/libXi.so.6.1.0) ==4166== by 0x7433D48: _XCopyEventCookie (in /usr/lib/libX11.so.6.3.0) ==4166== by 0x7425166: XPeekEvent (in /usr/lib/libX11.so.6.3.0) ==4166== by 0x49C3E3: process_key (x11_be.c:1065) ==4166== by 0x49EA5C: event_key_release (x11_be.c:2201) ==4166== by 0x49DD6E: x11_be_process_events (x11_be.c:1892) ==4166== by 0x4A38F4: x11_be_main_loop (x11_be.c:4353) ==4166== by 0x4A39E1: x11_be_thread_main (x11_be.c:4385) ==4166== by 0x87549C9: start_thread (pthread_create.c:300) ==4166== by 0x8A516FC: clone (clone.S:112) ==4166== Address 0x168afe80 is 0 bytes after a block of size 96 alloc'd ==4166== at 0x4C284A8: malloc (vg_replace_malloc.c:236) ==4166== by 0x8F390BD: ??? (in /usr/lib/libXi.so.6.1.0) ==4166== by 0x7433D48: _XCopyEventCookie (in /usr/lib/libX11.so.6.3.0) ==4166== by 0x7425166: XPeekEvent (in /usr/lib/libX11.so.6.3.0) ==4166== by 0x49C3E3: process_key (x11_be.c:1065) ==4166== by 0x49EA5C: event_key_release (x11_be.c:2201) ==4166== by 0x49DD6E: x11_be_process_events (x11_be.c:1892) ==4166== by 0x4A38F4: x11_be_main_loop (x11_be.c:4353) ==4166== by 0x4A39E1: x11_be_thread_main (x11_be.c:4385) ==4166== by 0x87549C9: start_thread (pthread_create.c:300) Reported-by: Roger Cruz <roger.cruz@virtualcomputer.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com> Reviewed-by: Daniel Stone <daniel@fooishbar.org>
2011-05-03Fix XISelectEvents on 64 bits, strict alignement architectures.Matthieu Herrb
Use Data() to send the struct xXIEventMask on the wire instead of Data32() which expects a pointer to a 64bits value on LP64 architectures. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2011-03-17Force alignment with sizeof(Atom) for XIButtonClassInfoPeter Hutterer
The memory layout of an XIButtonClassInfo is [struct XIButtonClassInfo][mask][labels] With the mask being currently 4-byte aligned and labels a list of Atoms. On LP64, Atoms are 8 byte, leading to unaligned access for some mask lengths. Force the alignment to be sizeof(Atom). Reported-by: Christian Weisgerber <naddy@mips.inka.de> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Tested-by: Christian Weisgerber <naddy@mips.inka.de> Reviewed-by: Adam Jackson <ajax@redhat.com>
2011-03-08Don't discard extra data for passive grabs.Peter Hutterer
Failed modifier data was discarded, causing assertions inside xcb. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2011-03-03Rename XSetCPtr.c to XISetCPtr.c.Peter Hutterer
XISetClientPointer is an XI2.0 call and should be named accordingly. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Daniel Stone <daniel@fooishbar.org>
2011-03-03Require XI 2 for all XI 2 calls.Peter Hutterer
Each XI2 call should check _XiCheckExtInit for XI version 2.0 or higher. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Daniel Stone <daniel@fooishbar.org>
2011-02-23Fix typo in comment.Peter Hutterer
Reported-by: Julien Cristau <jcristau@debian.org> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2011-02-23Fix invalid read in XIGrabDevice.Peter Hutterer
Miscalculation of length caused Data() to memcpy too many bytes. ==2865== Invalid read of size 1 ==2865== at 0x4A07480: memcpy (mc_replace_strmem.c:602) ==2865== by 0x544271E: XIGrabDevice (XIGrabDevice.c:69) ==2865== by 0x400B0A: main (gnome642481.c:56) ==2865== Address 0x642f614 is 0 bytes after a block of size 20 alloc'd ==2865== at 0x4A04896: calloc (vg_replace_malloc.c:418) ==2865== by 0x54425D3: XIGrabDevice (XIGrabDevice.c:65) ==2865== by 0x400B0A: main (gnome642481.c:56) SetReqLen() expects 4-byte units. Data() expects bytes. Gnome Bug 642481 <https://bugzilla.gnome.org/show_bug.cgi?id=642481> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2011-02-23Mark sourceid in Raw events as bug and force to 0..Peter Hutterer
The protocol does not provide a source ID for raw events, so this value is always 0. It shouldn't really be there, but the past is so hard to change. Reported-by: Mark Dokter <dokter@icg.tugraz.at> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2011-01-26Fill in mods/group->effective in XIQueryPointer()Carlos Garnacho
the other XIModifierState/XIGroupState fields are being set correctly, but the "effective" field was being left as undefined memory. Signed-off-by: Carlos Garnacho <carlosg@gnome.org> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2011-01-11Fix passive grabs.Philipp Reh
_XIPassiveGrabDevice, which is called by alle the passive grab functions, wrongly returns an error when it shouldn't. The attached patch adds the missing "not" to properly test the error condition of _XReply. Signed-off-by: Philipp Reh <sefi@s-e-f-i.de> Reviewed-by: Daniel Stone <daniel@fooishbar.org> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
2010-12-14WireToEvent: Set display member of all events as wellDaniel Stone
All events were getting random uninitialised garbage for display; fix that. Signed-off-by: Daniel Stone <daniel@fooishbar.org>
2010-10-06Purge cvs tags.Jesse Adkins
Signed-off-by: Jesse Adkins <jesserayadkins@gmail.com> Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
2010-10-07Fix typo when converting raw events from the wire.Carlos Garnacho
The raw values were being miscalculated, containing only the integral part of the FP3232, meanwhile normal valuators were mistakenly added the fractional part of its corresponding raw value. Signed-off-by: Carlos Garnacho <carlosg@gnome.org> Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2010-08-26Fix build with gcc 2.95Matthieu Herrb
Signed-off-by: Matthieu Herrb <matthieu.herrb@laas.fr> Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com> Reviewed-by: Matt Turner <mattst88@gmail.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>