Commit 6d05cd30 authored by Daniel Mack's avatar Daniel Mack Committed by Greg Kroah-Hartman

ALSA: snd-usb-caiaq: Correct offset fields of outbound iso_frame_desc

commit 15439bde upstream.

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: default avatarDaniel Mack <zonque@gmail.com>
Reported-and-tested-by: default avatarWilliam Light <wrl@illest.net>
Reported-by: default avatarPedro Ribeiro <pedrib@gmail.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 3ca96941
......@@ -468,6 +468,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;
......@@ -488,7 +489,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);
......@@ -504,7 +506,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);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment