Added some more data length checks for config instructions to
authorFrank Mori Hess <fmhess@speakeasy.net>
Thu, 19 Oct 2006 20:56:40 +0000 (20:56 +0000)
committerFrank Mori Hess <fmhess@speakeasy.net>
Thu, 19 Oct 2006 20:56:40 +0000 (20:56 +0000)
comedi_fops.c

comedi/comedi_fops.c
comedi/drivers/amplc_dio200.c

index 07831732f6be85946c107770692c26aa35e3bf13..a14856a5a7e49802024ae53e7ac26c968c19aa8a 100644 (file)
@@ -635,17 +635,26 @@ static int check_insn_config_length(comedi_insn *insn, lsampl_t *data)
        case INSN_CONFIG_BLOCK_SIZE:
        case INSN_CONFIG_SERIAL_CLOCK:
        case INSN_CONFIG_BIDIRECTIONAL_DATA:
-       case INSN_CONFIG_SET_RTSI_CLOCK_MODE:
        case INSN_CONFIG_ALT_SOURCE:
-               if( insn->n == 2 ) return 0;
+       case INSN_CONFIG_8254_SET_MODE:
+       case INSN_CONFIG_8254_READ_STATUS:
+       case INSN_CONFIG_SET_GATE_SRC:
+       case INSN_CONFIG_GET_GATE_SRC:
+               if(insn->n == 2) return 0;
+               break;
+       case INSN_CONFIG_SET_CLOCK_SRC:
+       case INSN_CONFIG_GET_CLOCK_SRC:
+               if(insn->n == 3) return 0;
                break;
        case INSN_CONFIG_PWM_OUTPUT:
                if(insn->n == 5) return 0;
                break;
        //by default we allow the insn since we don't have checks for all possible cases yet
        default:
-               rt_printk("comedi: no check for data length of config insn id %i implemented.  Assuming n=%i is correct.\n",
-                               data[0], insn->n);
+               rt_printk("comedi: no check for data length of config insn id %i is implemented.\n"
+                       " Add a check to %s in %s.\n"
+                       " Assuming n=%i is correct.\n",
+                       data[0], __FUNCTION__, __FILE__, insn->n);
                return 0;
                break;
        }
index c4d33ba8dd975ea37e9ad13862bdf7efddd26285..85022b1236fb4671d4ee6aac4a9464ba7db09e66 100644 (file)
@@ -1072,8 +1072,6 @@ dio200_subdev_8254_config(comedi_device *dev, comedi_subdevice *s,
        int ret;
        int chan = CR_CHAN(insn->chanspec);
 
-       if (insn->n != 2) return -EINVAL;
-
        switch (data[0]) {
        case INSN_CONFIG_8254_SET_MODE:
                ret = i8254_set_mode(subpriv->iobase, chan, data[1]);
@@ -1104,7 +1102,7 @@ dio200_subdev_8254_config(comedi_device *dev, comedi_subdevice *s,
                return -EINVAL;
                break;
        }
-       return 2;
+       return insn->n;
 }
 
 /*