Staging: comedi: usbdux: buffer overflow error handling
authorBernd Porr <BerndPorr@f2s.com>
Sun, 24 May 2009 19:36:09 +0000 (20:36 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 19 Jun 2009 18:00:34 +0000 (11:00 -0700)
These changes guarantee that the URBs are not resubmitted in case of a
comedi buffer overflow.  Otherwise this runs in the background even when
the userspace program has terminated.

From: Bernd Porr <BerndPorr@f2s.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/comedi/drivers/usbdux.c
drivers/staging/comedi/drivers/usbduxfast.c

index eea7dbdde0be051d058529c1e84e31ee55532acd..171a6f2ff74f2e51d9e8251a878343901d1b4a42 100644 (file)
@@ -509,14 +509,19 @@ static void usbduxsub_ai_IsocIrq(struct urb *urb)
        for (i = 0; i < n; i++) {
                /* transfer data */
                if (CR_RANGE(s->async->cmd.chanlist[i]) <= 1) {
-                       comedi_buf_put
+                       err = comedi_buf_put
                                (s->async,
-                               le16_to_cpu(this_usbduxsub->
-                                       inBuffer[i]) ^ 0x800);
+                                le16_to_cpu(this_usbduxsub->
+                                            inBuffer[i]) ^ 0x800);
                } else {
-                       comedi_buf_put
+                       err = comedi_buf_put
                                (s->async,
-                               le16_to_cpu(this_usbduxsub->inBuffer[i]));
+                                le16_to_cpu(this_usbduxsub->inBuffer[i]));
+               }
+               if (unlikely(err == 0)) {
+                       /* buffer overflow */
+                       usbdux_ai_stop(this_usbduxsub, 0);
+                       return;
                }
        }
        /* tell comedi that data is there */
index 5862078bfbb955f2d26815df096a0089a66a1adf..939b53fa569c5d85b2dbc82bb6b587e4eb365e68 100644 (file)
@@ -406,7 +406,7 @@ static void usbduxfastsub_ai_Irq(struct urb *urb)
                                        udfs->ai_sample_count
                                        * sizeof(uint16_t));
                                usbduxfast_ai_stop(udfs, 0);
-                               /* say comedi that the acquistion is over */
+                               /* tell comedi that the acquistion is over */
                                s->async->events |= COMEDI_CB_EOA;
                                comedi_event(udfs->comedidev, s);
                                return;
@@ -414,8 +414,13 @@ static void usbduxfastsub_ai_Irq(struct urb *urb)
                        udfs->ai_sample_count -= n;
                }
                /* write the full buffer to comedi */
-               cfc_write_array_to_buffer(s, urb->transfer_buffer,
-                                         urb->actual_length);
+               err = cfc_write_array_to_buffer(s, urb->transfer_buffer,
+                                               urb->actual_length);
+               if (unlikely(err == 0)) {
+                       /* buffer overflow */
+                       usbduxfast_ai_stop(udfs, 0);
+                       return;
+               }
 
                /* tell comedi that data is there */
                comedi_event(udfs->comedidev, s);