Skip to content

Commit

Permalink
ALSA: snd-usb-caiaq: Correct offset fields of outbound iso_frame_desc
Browse files Browse the repository at this point in the history
This fixes faulty outbount packets in case the inbound packets
received from the hardware are fragmented and contain bogus input
iso frames. The bug has been there for ages, but for some strange
reasons, it was only triggered by newer machines in 64bit mode.

Signed-off-by: Daniel Mack <zonque@gmail.com>
Reported-and-tested-by: William Light <wrl@illest.net>
Reported-by: Pedro Ribeiro <pedrib@gmail.com>
Cc: stable@kernel.org
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Daniel Mack authored and Takashi Iwai committed Aug 10, 2011
1 parent a5a3973 commit 15439bd
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions sound/usb/caiaq/audio.c
Original file line number Diff line number Diff line change
Expand Up @@ -614,6 +614,7 @@ static void read_completed(struct urb *urb)
struct snd_usb_caiaqdev *dev;
struct urb *out;
int frame, len, send_it = 0, outframe = 0;
size_t offset = 0;

if (urb->status || !info)
return;
Expand All @@ -634,7 +635,8 @@ static void read_completed(struct urb *urb)
len = urb->iso_frame_desc[outframe].actual_length;
out->iso_frame_desc[outframe].length = len;
out->iso_frame_desc[outframe].actual_length = 0;
out->iso_frame_desc[outframe].offset = BYTES_PER_FRAME * frame;
out->iso_frame_desc[outframe].offset = offset;
offset += len;

if (len > 0) {
spin_lock(&dev->spinlock);
Expand All @@ -650,7 +652,7 @@ static void read_completed(struct urb *urb)
}

if (send_it) {
out->number_of_packets = FRAMES_PER_URB;
out->number_of_packets = outframe;
out->transfer_flags = URB_ISO_ASAP;
usb_submit_urb(out, GFP_ATOMIC);
}
Expand Down

0 comments on commit 15439bd

Please sign in to comment.