In this conditional statement, if (chan < 16), but the instruction passed in data[0] is INSN_CONFIG_DIO_QUERY, the function does not return early, but the else-branch does not get executed either. As a result, mask would be used uninitialized in the next line. We want comedi_dio_insn_config() to use a chan_mask based on the chanspec for the INSN_CONFIG_DIO_QUERY instruction, so mask should be initialized to 0. Then, if instead the instruction is INSN_CONFIG_DIO_{INPUT,OUTPUT}, we return an error if (chan < 16) as these are invalid instructions for ports 0 and 1, or update the mask otherwise, so all the io_bits are modified for port 2. This ensures that mask is always initialized by the time it is used. Signed-off-by: Chase Southwood <chase.southwood@xxxxxxxxx> --- 2: Addressed all of the comments provided by Hartley regarding correct structure of this patch. Hopefully everything looks better! drivers/staging/comedi/drivers/addi_apci_3xxx.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/staging/comedi/drivers/addi_apci_3xxx.c b/drivers/staging/comedi/drivers/addi_apci_3xxx.c index ceadf8e..1f3b668 100644 --- a/drivers/staging/comedi/drivers/addi_apci_3xxx.c +++ b/drivers/staging/comedi/drivers/addi_apci_3xxx.c @@ -680,7 +680,7 @@ static int apci3xxx_dio_insn_config(struct comedi_device *dev, unsigned int *data) { unsigned int chan = CR_CHAN(insn->chanspec); - unsigned int mask; + unsigned int mask = 0; int ret; /* @@ -688,12 +688,13 @@ static int apci3xxx_dio_insn_config(struct comedi_device *dev, * Port 1 (channels 8-15) are always outputs * Port 2 (channels 16-23) are programmable i/o */ - if (chan < 16) { - if (data[0] != INSN_CONFIG_DIO_QUERY) + if (data[0] != INSN_CONFIG_DIO_QUERY) { + /* ignore all other instructions for ports 0 and 1 */ + if (chan < 16) return -EINVAL; - } else { - /* changing any channel in port 2 changes the entire port */ - mask = 0xff0000; + else + /* changing any channel in port 2 changes the entire port */ + mask = 0xff0000; } ret = comedi_dio_insn_config(dev, s, insn, data, mask); -- 1.8.5.3 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel