adv_pci1710: don't access *data when insn->n == 0
authorIan Abbott <abbotti@mev.co.uk>
Thu, 15 Dec 2011 19:16:04 +0000 (19:16 +0000)
committerIan Abbott <abbotti@mev.co.uk>
Thu, 15 Dec 2011 19:16:04 +0000 (19:16 +0000)
Due to recent change to do_insnlist_ioctl() and do_insn_ioctl(), the
'data' pointer will be NULL when insn->n == 0.  Do not access *data
in this case.

Also, the INSN_WRITE handlers for AO subdevices were incorrectly storing
the data value past the end of the data array for read-back, instead of
the last data value (when insn->n > 0).

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
comedi/drivers/adv_pci1710.c

index ac0282bf43ac351acb9beaf12b767b665dc94512..7507653ebe4f84d1fa5c2700ecfc8783abc1b647 100644 (file)
@@ -412,7 +412,8 @@ static int pci171x_insn_write_ao(comedi_device * dev, comedi_subdevice * s,
        for (n = 0; n < insn->n; n++)
                outw(data[n], dev->iobase + ofs);
 
-       devpriv->ao_data[chan] = data[n];
+       if (n > 0)
+               devpriv->ao_data[chan] = data[n - 1];
 
        return n;
 
@@ -566,7 +567,8 @@ static int pci1720_insn_write_ao(comedi_device * dev, comedi_subdevice * s,
                outb(0, dev->iobase + PCI1720_SYNCOUT); // update outputs
        }
 
-       devpriv->ao_data[chan] = data[n];
+       if (n > 0)
+               devpriv->ao_data[chan] = data[n - 1];
 
        return n;
 }