Skip to content

Commit

Permalink
Staging: lirc, fix lock imbalance
Browse files Browse the repository at this point in the history
[2nd version -- melded all three together]

1) There is a missing return or goto statement in one fail path in
sasem_probe, so that the code contiues its normal execution (and
unlocks a mutex twice). Fix that by jumping to the right place.

Anyway the code is very broken on its fail paths and there are many
leaks. But that's a different story.

2) There is an omitted unlock in one fail path in vfd_write, jump to
the right place to unlock the lock.

3) In the probe function, there is one more error where the lock is
not unlocked. Fix that by jumping to the proper place.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Cc: Jarod Wilson <jarod@redhat.com>
Cc: Mauro Carvalho Chehab <mchehab@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Jiri Slaby authored and Greg Kroah-Hartman committed Sep 5, 2010
1 parent cc92ac2 commit ff7d368
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions drivers/staging/lirc/lirc_sasem.c
Original file line number Diff line number Diff line change
Expand Up @@ -386,8 +386,10 @@ static ssize_t vfd_write(struct file *file, const char *buf,
}

data_buf = memdup_user(buf, n_bytes);
if (PTR_ERR(data_buf))
return PTR_ERR(data_buf);
if (PTR_ERR(data_buf)) {
retval = PTR_ERR(data_buf);
goto exit;
}

memcpy(context->tx.data_buf, data_buf, n_bytes);

Expand Down Expand Up @@ -803,7 +805,8 @@ static int sasem_probe(struct usb_interface *interface,
if (lirc_minor < 0) {
err("%s: lirc_register_driver failed", __func__);
alloc_status = 7;
mutex_unlock(&context->ctx_lock);
retval = lirc_minor;
goto unlock;
} else
printk(KERN_INFO "%s: Registered Sasem driver (minor:%d)\n",
__func__, lirc_minor);
Expand All @@ -828,7 +831,7 @@ static int sasem_probe(struct usb_interface *interface,
context = NULL;
case 1:
retval = -ENOMEM;
goto exit;
goto unlock;
}

/* Needed while unregistering! */
Expand Down Expand Up @@ -859,7 +862,7 @@ static int sasem_probe(struct usb_interface *interface,

printk(KERN_INFO "%s: Sasem device on usb<%d:%d> initialized\n",
__func__, dev->bus->busnum, dev->devnum);

unlock:
mutex_unlock(&context->ctx_lock);
exit:
return retval;
Expand Down

0 comments on commit ff7d368

Please sign in to comment.