diff options
author | Sean Young <sean@mess.org> | 2016-11-26 16:31:24 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2016-12-01 09:46:00 -0500 |
commit | b40769ee2ed09ed6c6da33b0cbdf423ff94f685b (patch) | |
tree | 1cde9fd2230e29b051db457b9b6b47f4ae130658 | |
parent | 003611334d5592984e319e08c6b66825aca00290 (diff) |
[media] lirc: fix error paths in lirc_cdev_add()
"c77d17c0 [media] lirc: use-after free" introduces two problems:
cdev_del() can be called with a NULL argument, and the kobject_put()
path will cause a double free.
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
-rw-r--r-- | drivers/media/rc/lirc_dev.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/drivers/media/rc/lirc_dev.c b/drivers/media/rc/lirc_dev.c index d3039efb4e7c..3854809e8531 100644 --- a/drivers/media/rc/lirc_dev.c +++ b/drivers/media/rc/lirc_dev.c | |||
@@ -157,13 +157,13 @@ static const struct file_operations lirc_dev_fops = { | |||
157 | 157 | ||
158 | static int lirc_cdev_add(struct irctl *ir) | 158 | static int lirc_cdev_add(struct irctl *ir) |
159 | { | 159 | { |
160 | int retval = -ENOMEM; | ||
161 | struct lirc_driver *d = &ir->d; | 160 | struct lirc_driver *d = &ir->d; |
162 | struct cdev *cdev; | 161 | struct cdev *cdev; |
162 | int retval; | ||
163 | 163 | ||
164 | cdev = cdev_alloc(); | 164 | cdev = cdev_alloc(); |
165 | if (!cdev) | 165 | if (!cdev) |
166 | goto err_out; | 166 | return -ENOMEM; |
167 | 167 | ||
168 | if (d->fops) { | 168 | if (d->fops) { |
169 | cdev->ops = d->fops; | 169 | cdev->ops = d->fops; |
@@ -177,10 +177,8 @@ static int lirc_cdev_add(struct irctl *ir) | |||
177 | goto err_out; | 177 | goto err_out; |
178 | 178 | ||
179 | retval = cdev_add(cdev, MKDEV(MAJOR(lirc_base_dev), d->minor), 1); | 179 | retval = cdev_add(cdev, MKDEV(MAJOR(lirc_base_dev), d->minor), 1); |
180 | if (retval) { | 180 | if (retval) |
181 | kobject_put(&cdev->kobj); | ||
182 | goto err_out; | 181 | goto err_out; |
183 | } | ||
184 | 182 | ||
185 | ir->cdev = cdev; | 183 | ir->cdev = cdev; |
186 | 184 | ||