staging: comedi: das16: tidy up user ai/ao range initialization
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Mon, 29 Jul 2013 21:07:53 +0000 (14:07 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Aug 2013 00:38:09 +0000 (17:38 -0700)
The allocation of the user range tables could fail. Make sure to check
for it.

Change the kmalloc()'s to kzalloc()'s to make sure the allocated range
tables are initialized to a known state.

Change the local variables so they can be used for both the ai and ao
range initialization and use shorter names to keep the lines < 80 chars.

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

index 00ecb3c010d76f6b43ebcd1376835fba1e9719c9..da640803d825df428661120479b98f10495824ab 100644 (file)
@@ -987,8 +987,8 @@ static int das16_attach(struct comedi_device *dev, struct comedi_devconfig *it)
        const struct das16_board *board = comedi_board(dev);
        struct das16_private_struct *devpriv;
        struct comedi_subdevice *s;
-       struct comedi_krange *user_ai_range;
-       struct comedi_krange *user_ao_range;
+       struct comedi_lrange *lrange;
+       struct comedi_krange *krange;
        unsigned int dma_chan = it->options[2];
        unsigned int status;
        int ret;
@@ -1077,32 +1077,37 @@ static int das16_attach(struct comedi_device *dev, struct comedi_devconfig *it)
                devpriv->timer.data = (unsigned long)dev;
        }
 
-       /*  get any user-defined input range */
+       /* get any user-defined input range */
        if (board->ai_pg == das16_pg_none &&
            (it->options[4] || it->options[5])) {
-               /*  allocate single-range range table */
-               devpriv->user_ai_range_table =
-                   kmalloc(sizeof(struct comedi_lrange) +
-                           sizeof(struct comedi_krange), GFP_KERNEL);
-               /*  initialize ai range */
-               devpriv->user_ai_range_table->length = 1;
-               user_ai_range = devpriv->user_ai_range_table->range;
-               user_ai_range->min = it->options[4];
-               user_ai_range->max = it->options[5];
-               user_ai_range->flags = UNIT_volt;
+               /* allocate single-range range table */
+               lrange = kzalloc(sizeof(*lrange) + sizeof(*krange), GFP_KERNEL);
+               if (!lrange)
+                       return -ENOMEM;
+
+               /* initialize ai range */
+               devpriv->user_ai_range_table = lrange;
+               lrange->length = 1;
+               krange = devpriv->user_ai_range_table->range;
+               krange->min = it->options[4];
+               krange->max = it->options[5];
+               krange->flags = UNIT_volt;
        }
-       /*  get any user-defined output range */
+
+       /* get any user-defined output range */
        if (it->options[6] || it->options[7]) {
-               /*  allocate single-range range table */
-               devpriv->user_ao_range_table =
-                   kmalloc(sizeof(struct comedi_lrange) +
-                           sizeof(struct comedi_krange), GFP_KERNEL);
-               /*  initialize ao range */
-               devpriv->user_ao_range_table->length = 1;
-               user_ao_range = devpriv->user_ao_range_table->range;
-               user_ao_range->min = it->options[6];
-               user_ao_range->max = it->options[7];
-               user_ao_range->flags = UNIT_volt;
+               /* allocate single-range range table */
+               lrange = kzalloc(sizeof(*lrange) + sizeof(*krange), GFP_KERNEL);
+               if (!lrange)
+                       return -ENOMEM;
+
+               /* initialize ao range */
+               devpriv->user_ao_range_table = lrange;
+               lrange->length = 1;
+               krange = devpriv->user_ao_range_table->range;
+               krange->min = it->options[6];
+               krange->max = it->options[7];
+               krange->flags = UNIT_volt;
        }
 
        ret = comedi_alloc_subdevices(dev, 4 + board->has_8255);