Commit efe8d60a authored by Bernd Porr's avatar Bernd Porr Committed by Greg Kroah-Hartman
Browse files

Staging: comedi: usbdux: buffer overflow error handling



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: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 0b8f754a
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -509,15 +509,20 @@ 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);
		} else {
			comedi_buf_put
			err = comedi_buf_put
				(s->async,
				 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 */
	comedi_event(this_usbduxsub->comedidev, s);
+8 −3
Original line number Diff line number Diff line
@@ -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,
		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);