From ff389f91a2efec5184b56b8c717091d067f8fc46 Mon Sep 17 00:00:00 2001
From: Peter Hutterer <peter.hutterer@who-t.net>
Date: Tue, 19 Jul 2011 13:07:41 +1000
Subject: Don't free anything in PreInit, let the server call UnInit instead

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>

diff --git a/src/xf86PM.c b/src/xf86PM.c
index 97e2134..ef73164 100644
--- src/xf86PM.c
+++ src/xf86PM.c
@@ -79,7 +79,7 @@ _X_EXPORT InputDriverRec PENMOUNT = {
         "penmount",
         NULL,
         PenMountPreInit,
-        /*PenMountUnInit*/NULL,
+        PenMountUnInit,
         NULL,
         default_options
 };
@@ -275,6 +275,7 @@ ProcessDeviceClose(PenMountPrivatePtr priv, DeviceIntPtr dev, InputInfoPtr pInfo
 					priv->buffer = NULL;
 				}
 			xf86CloseSerial(pInfo->fd);
+			pInfo->fd = -1;
 		}
 	dev->public.on = FALSE;
 	return (Success);
@@ -454,6 +455,8 @@ PenMountPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
 		goto SetupProc_fail;
 	}
 	xf86CloseSerial(pInfo->fd);
+	pInfo->fd = -1;
+
 	/* 
 	 * Process the options for your device like this
 	 */
@@ -495,16 +498,21 @@ PenMountPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
 	return Success;
 
   SetupProc_fail:
-	if ((pInfo) && (pInfo->fd))
-		xf86CloseSerial (pInfo->fd);
-	if ((pInfo) && (pInfo->name))
-		free (pInfo->name);
+	return BadValue;
+}
+
+static void
+PenMountUnInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
+{
+	PenMountPrivatePtr priv = (PenMountPrivatePtr) (pInfo->private);
 
-	if ((priv) && (priv->buffer))
-		XisbFree (priv->buffer);
 	if (priv)
+	{
+		if (priv->buffer)
+			XisbFree (priv->buffer);
 		free (priv);
-	return BadValue;
+		pInfo->private = NULL;
+	}
 }
 
 static Bool
diff --git a/src/xf86PM.h b/src/xf86PM.h
index 5183f91..88da048 100644
--- src/xf86PM.h
+++ src/xf86PM.h
@@ -93,6 +93,8 @@ static Bool PenMountSendPacket (PenMountPrivatePtr priv, unsigned char *buf, int
 
 static int
 PenMountPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags);
+static void
+PenMountUnInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags);
 
 static void
 PenMountPtrCtrl(DeviceIntPtr device, PtrCtrl *ctrl);
-- 
cgit v0.10.2

