staging: comedi: unioxx5: fix unioxx5_detach()
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Mon, 24 Jun 2013 23:23:00 +0000 (16:23 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 24 Jun 2013 23:43:40 +0000 (16:43 -0700)
During the attach of this driver, it's possible for the allocation
of the subdevice private data to fail. It's also possible that the
io region was not successfully requested.

Validate the pointer and iobase before trying to release the region.

For aesthetic reasons, rename the local variables.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/unioxx5.c

index d05d46d0a1f264fb685a8c1014e865e8256453dc..fc88b66f408d542dbbc533cc982fc924161e5de7 100644 (file)
@@ -474,15 +474,16 @@ static int unioxx5_attach(struct comedi_device *dev,
 
 static void unioxx5_detach(struct comedi_device *dev)
 {
+       struct comedi_subdevice *s;
+       struct unioxx5_subd_priv *spriv;
        int i;
-       struct comedi_subdevice *subdev;
-       struct unioxx5_subd_priv *usp;
 
        for (i = 0; i < dev->n_subdevices; i++) {
-               subdev = &dev->subdevices[i];
-               usp = subdev->private;
-               release_region(usp->usp_iobase, UNIOXX5_SIZE);
-               kfree(subdev->private);
+               s = &dev->subdevices[i];
+               spriv = s->private;
+               if (spriv && spriv->usp_iobase)
+                       release_region(spriv->usp_iobase, UNIOXX5_SIZE);
+               kfree(spriv);
        }
 }