diff options
| author | Randy Dunlap <randy.dunlap@verizon.net> | 2003-07-13 18:49:38 -0700 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@redhat.com> | 2003-07-13 18:49:38 -0700 |
| commit | b87c49b1e6e83d29789965038eef257ee663ec14 (patch) | |
| tree | 4c76cb844eccbd65563b9386c16157d21b5b62db | |
| parent | 241d155783b2a4abc1d91ec193893a96026bf4a4 (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.c | 30 |
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; } /** |
