staging: comedi: 8255: fix I/O region leak on failure
The Comedi "8255" driver does not clean up properly on failure. It can leave requested I/O port regions unreleased. Specifically, the Comedi "attach" handler (`dev_8255_attach()`) requests a specified I/O port region before calling `subdev_8255_init()` to set up the subdevice. If that fails, the "attach" handler returns an error and the Comedi core will call the "detach" handler (`dev_8255_detach()`) to clean up. The "detach" handler is responsible for releasing the I/O port regions successfully requested by the "attach" handler. Unfortunately, it is unable to obtain the base address of the region if the call to `subdev_8255_init()` failed. Fix the I/O region leak by releasing the region in the "attach" handler directly if the call to `subdev_8255_init()` fails. Signed-off-by: Ian Abbott <abbotti@mev.co.uk> Reviewed-by: H Hartley Sweeten <hsweeten@visionengravers.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
613462e1e4
commit
7e0b1b60cb
@ -306,8 +306,15 @@ static int dev_8255_attach(struct comedi_device *dev,
|
||||
s->type = COMEDI_SUBD_UNUSED;
|
||||
} else {
|
||||
ret = subdev_8255_init(dev, s, NULL, iobase);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
/*
|
||||
* Release the I/O port region here, as the
|
||||
* "detach" handler cannot find it.
|
||||
*/
|
||||
release_region(iobase, I8255_SIZE);
|
||||
s->type = COMEDI_SUBD_UNUSED;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user