staging: comedi: drivers: properly validate cmd->scan_end_arg
When the async command 'scan_end_src' is TRIG_COUNT the 'scan_end_arg' is the cmd->chanlist_len. Fix a couple open-coded drivers. Add the check to the drivers that do not validate this command argument. The core validates that the cmd->chanlist_len is <= s->len_chanlist. During the post config after the attach the core also make sure that the s->len_chanlist is initialized. For clarity, initialize the s->len_chanlist in a couple drivers that are relying on the core to initialize it to '1'. 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>
This commit is contained in:
parent
860b7c398a
commit
f50cebb9ba
@ -231,7 +231,7 @@ static int subdev_8255_cmdtest(struct comedi_device *dev,
|
||||
err |= cfc_check_trigger_arg_is(&cmd->start_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_begin_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->convert_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, 1);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->stop_arg, 0);
|
||||
|
||||
if (err)
|
||||
@ -298,6 +298,7 @@ int subdev_8255_init_irq(struct comedi_device *dev, struct comedi_subdevice *s,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
s->len_chanlist = 1;
|
||||
s->do_cmdtest = subdev_8255_cmdtest;
|
||||
s->do_cmd = subdev_8255_cmd;
|
||||
s->cancel = subdev_8255_cancel;
|
||||
|
@ -778,6 +778,7 @@ static int apci3120_ai_cmdtest(struct comedi_device *dev,
|
||||
}
|
||||
|
||||
err |= cfc_check_trigger_arg_min(&cmd->chanlist_len, 1);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
|
||||
|
||||
if (cmd->stop_src == TRIG_COUNT)
|
||||
err |= cfc_check_trigger_arg_min(&cmd->stop_arg, 1);
|
||||
|
@ -2270,6 +2270,11 @@ static int apci3200_ai_cmdtest(struct comedi_device *dev,
|
||||
apci3200_reset(dev);
|
||||
return 2;
|
||||
}
|
||||
|
||||
/* Step 3: check if arguments are trivially valid */
|
||||
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
|
||||
|
||||
/* i_FirstChannel=cmd->chanlist[0]; */
|
||||
s_BoardInfos[dev->minor].i_FirstChannel = cmd->chanlist[0];
|
||||
/* i_LastChannel=cmd->chanlist[1]; */
|
||||
|
@ -198,7 +198,7 @@ static int apci1032_cos_cmdtest(struct comedi_device *dev,
|
||||
err |= cfc_check_trigger_arg_is(&cmd->start_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_begin_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->convert_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, 1);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->stop_arg, 0);
|
||||
|
||||
if (err)
|
||||
@ -332,6 +332,7 @@ static int apci1032_auto_attach(struct comedi_device *dev,
|
||||
s->range_table = &range_digital;
|
||||
s->insn_config = apci1032_cos_insn_config;
|
||||
s->insn_bits = apci1032_cos_insn_bits;
|
||||
s->len_chanlist = 1;
|
||||
s->do_cmdtest = apci1032_cos_cmdtest;
|
||||
s->do_cmd = apci1032_cos_cmd;
|
||||
s->cancel = apci1032_cos_cancel;
|
||||
|
@ -314,7 +314,7 @@ static int pc236_intr_cmdtest(struct comedi_device *dev,
|
||||
err |= cfc_check_trigger_arg_is(&cmd->start_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_begin_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->convert_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, 1);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->stop_arg, 0);
|
||||
|
||||
if (err)
|
||||
@ -402,6 +402,7 @@ static int pc236_common_attach(struct comedi_device *dev, unsigned long iobase,
|
||||
s->maxdata = 1;
|
||||
s->range_table = &range_digital;
|
||||
s->insn_bits = pc236_intr_insn;
|
||||
s->len_chanlist = 1;
|
||||
s->do_cmdtest = pc236_intr_cmdtest;
|
||||
s->do_cmd = pc236_intr_cmd;
|
||||
s->cancel = pc236_intr_cancel;
|
||||
|
@ -181,7 +181,7 @@ static int parport_intr_cmdtest(struct comedi_device *dev,
|
||||
err |= cfc_check_trigger_arg_is(&cmd->start_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_begin_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->convert_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, 1);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->stop_arg, 0);
|
||||
|
||||
if (err)
|
||||
@ -295,6 +295,7 @@ static int parport_attach(struct comedi_device *dev,
|
||||
s->maxdata = 1;
|
||||
s->range_table = &range_digital;
|
||||
s->insn_bits = parport_intr_insn_bits;
|
||||
s->len_chanlist = 1;
|
||||
s->do_cmdtest = parport_intr_cmdtest;
|
||||
s->do_cmd = parport_intr_cmd;
|
||||
s->cancel = parport_intr_cancel;
|
||||
|
@ -852,7 +852,7 @@ static int dt282x_ao_cmdtest(struct comedi_device *dev,
|
||||
err |= cfc_check_trigger_arg_is(&cmd->start_arg, 0);
|
||||
err |= cfc_check_trigger_arg_min(&cmd->scan_begin_arg, 5000);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->convert_arg, 0);
|
||||
err |= cfc_check_trigger_arg_max(&cmd->scan_end_arg, 2);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
|
||||
|
||||
if (cmd->stop_src == TRIG_COUNT) {
|
||||
/* any count is allowed */
|
||||
|
@ -253,7 +253,7 @@ static int ni6527_intr_cmdtest(struct comedi_device *dev,
|
||||
err |= cfc_check_trigger_arg_is(&cmd->start_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_begin_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->convert_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, 1);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->stop_arg, 0);
|
||||
|
||||
if (err)
|
||||
@ -421,6 +421,7 @@ static int ni6527_auto_attach(struct comedi_device *dev,
|
||||
s->range_table = &range_digital;
|
||||
s->insn_config = ni6527_intr_insn_config;
|
||||
s->insn_bits = ni6527_intr_insn_bits;
|
||||
s->len_chanlist = 1;
|
||||
s->do_cmdtest = ni6527_intr_cmdtest;
|
||||
s->do_cmd = ni6527_intr_cmd;
|
||||
s->cancel = ni6527_intr_cancel;
|
||||
|
@ -473,7 +473,7 @@ static int ni_65xx_intr_cmdtest(struct comedi_device *dev,
|
||||
err |= cfc_check_trigger_arg_is(&cmd->start_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_begin_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->convert_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, 1);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->stop_arg, 0);
|
||||
|
||||
if (err)
|
||||
@ -671,6 +671,7 @@ static int ni_65xx_auto_attach(struct comedi_device *dev,
|
||||
s->n_chan = 1;
|
||||
s->range_table = &range_unknown;
|
||||
s->maxdata = 1;
|
||||
s->len_chanlist = 1;
|
||||
s->do_cmdtest = ni_65xx_intr_cmdtest;
|
||||
s->do_cmd = ni_65xx_intr_cmd;
|
||||
s->cancel = ni_65xx_intr_cancel;
|
||||
|
@ -197,7 +197,7 @@ static int pcl726_intr_cmdtest(struct comedi_device *dev,
|
||||
err |= cfc_check_trigger_arg_is(&cmd->start_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_begin_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->convert_arg, 0);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, 1);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
|
||||
err |= cfc_check_trigger_arg_is(&cmd->stop_arg, 0);
|
||||
|
||||
if (err)
|
||||
@ -430,6 +430,7 @@ static int pcl726_attach(struct comedi_device *dev,
|
||||
s->maxdata = 1;
|
||||
s->range_table = &range_digital;
|
||||
s->insn_bits = pcl726_intr_insn_bits;
|
||||
s->len_chanlist = 1;
|
||||
s->do_cmdtest = pcl726_intr_cmdtest;
|
||||
s->do_cmd = pcl726_intr_cmd;
|
||||
s->cancel = pcl726_intr_cancel;
|
||||
|
@ -878,6 +878,8 @@ static int rtd_ai_cmdtest(struct comedi_device *dev,
|
||||
err |= cfc_check_trigger_arg_max(&cmd->convert_arg, 9);
|
||||
}
|
||||
|
||||
err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
|
||||
|
||||
if (cmd->stop_src == TRIG_COUNT) {
|
||||
/* TODO check for rounding error due to counter wrap */
|
||||
} else {
|
||||
|
Loading…
x
Reference in New Issue
Block a user