summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandy Dunlap <randy.dunlap@verizon.net>2003-07-13 18:49:38 -0700
committerJeff Garzik <jgarzik@redhat.com>2003-07-13 18:49:38 -0700
commitb87c49b1e6e83d29789965038eef257ee663ec14 (patch)
tree4c76cb844eccbd65563b9386c16157d21b5b62db
parent241d155783b2a4abc1d91ec193893a96026bf4a4 (diff)
[PATCH] busmouse: fix memory leak and misc_register failure
From Flavio B. Leitner. <fbl@netbank.com.br> Fix a memory leak and an unchecked return code in the busmouse driver.
-rw-r--r--drivers/char/busmouse.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/drivers/char/busmouse.c b/drivers/char/busmouse.c
index c574177b5418..ad6163f8d9ef 100644
--- a/drivers/char/busmouse.c
+++ b/drivers/char/busmouse.c
@@ -357,25 +357,23 @@ int register_busmouse(struct busmouse *ops)
{
unsigned int msedev = MINOR_TO_MOUSE(ops->minor);
struct busmouse_data *mse;
- int ret;
+ int ret = -EINVAL;
if (msedev >= NR_MICE) {
printk(KERN_ERR "busmouse: trying to allocate mouse on minor %d\n",
ops->minor);
- return -EINVAL;
+ goto out;
}
+ ret = -ENOMEM;
mse = kmalloc(sizeof(*mse), GFP_KERNEL);
if (!mse)
- return -ENOMEM;
+ goto out;
down(&mouse_sem);
+ ret = -EBUSY;
if (busmouse_data[msedev])
- {
- up(&mouse_sem);
- kfree(mse);
- return -EBUSY;
- }
+ goto freemem;
memset(mse, 0, sizeof(*mse));
@@ -386,14 +384,22 @@ int register_busmouse(struct busmouse *ops)
mse->lock = (spinlock_t)SPIN_LOCK_UNLOCKED;
init_waitqueue_head(&mse->wait);
- busmouse_data[msedev] = mse;
ret = misc_register(&mse->miscdev);
- if (!ret)
- ret = msedev;
+
+ if (ret < 0)
+ goto freemem;
+
+ busmouse_data[msedev] = mse;
+ ret = msedev;
+out:
up(&mouse_sem);
-
return ret;
+
+
+freemem:
+ kfree(mse);
+ goto out;
}
/**