Currently the XKB options duplicated in EvdevAddKeyClass are never
released. For example, connecting and disconnecting a bluetooth
keyboard repeatedly causes a steadily growing memory leak.

Signed-off-by: Rami Ylimäki <[email protected]>
Reviewed-by: Erkki Seppälä <[email protected]>
---
 src/evdev.c |   16 ++++++++++++++--
 1 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/src/evdev.c b/src/evdev.c
index 45873c1..18b7246 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -2162,6 +2162,18 @@ EvdevOpenDevice(InputInfoPtr pInfo)
     return Success;
 }
 
+static void
+EvdevUnInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
+{
+    EvdevPtr pEvdev = pInfo ? pInfo->private : NULL;
+    if (pEvdev)
+    {
+        /* Release strings allocated in EvdevAddKeyClass. */
+        XkbFreeRMLVOSet(&pEvdev->rmlvo, FALSE);
+    }
+    xf86DeleteInput(pInfo, flags);
+}
+
 #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 12
 static int NewEvdevPreInit(InputDriverPtr, InputInfoPtr, int);
 
@@ -2198,7 +2210,7 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
     }
 
 
-    xf86DeleteInput(pInfo, 0);
+    EvdevUnInit(drv, pInfo, 0);
     return NULL;
 }
 
@@ -2277,7 +2289,7 @@ _X_EXPORT InputDriverRec EVDEV = {
     "evdev",
     NULL,
     EvdevPreInit,
-    NULL,
+    EvdevUnInit,
     NULL,
 #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12
     evdevDefaults
-- 
1.6.3.3

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to