Skip to content

Commit

Permalink
ALSA: line6: Improve line6_read/write_data() interfaces
Browse files Browse the repository at this point in the history
The address cannot be negative so make it unsigned.  Also, an unsigned
int is always sufficient for the length, so no need to overdo it with a
size_t.  Finally, add in range checks to see if the values passed in
actually fit where they are used.

Signed-off-by: Chris Rorvick <chris@rorvick.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Chris Rorvick authored and Takashi Iwai committed Feb 12, 2015
1 parent a323ae9 commit 25a0707
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 8 deletions.
14 changes: 10 additions & 4 deletions sound/usb/line6/driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -302,14 +302,17 @@ static void line6_data_received(struct urb *urb)
/*
Read data from device.
*/
int line6_read_data(struct usb_line6 *line6, int address, void *data,
size_t datalen)
int line6_read_data(struct usb_line6 *line6, unsigned address, void *data,
unsigned datalen)
{
struct usb_device *usbdev = line6->usbdev;
int ret;
unsigned char len;
unsigned count;

if (address > 0xffff || datalen > 0xff)
return -EINVAL;

/* query the serial number: */
ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
Expand Down Expand Up @@ -370,14 +373,17 @@ EXPORT_SYMBOL_GPL(line6_read_data);
/*
Write data to device.
*/
int line6_write_data(struct usb_line6 *line6, int address, void *data,
size_t datalen)
int line6_write_data(struct usb_line6 *line6, unsigned address, void *data,
unsigned datalen)
{
struct usb_device *usbdev = line6->usbdev;
int ret;
unsigned char status;
int count;

if (address > 0xffff || datalen > 0xffff)
return -EINVAL;

ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
0x0022, address, data, datalen,
Expand Down
8 changes: 4 additions & 4 deletions sound/usb/line6/driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,8 @@ struct usb_line6 {

extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1,
int code2, int size);
extern int line6_read_data(struct usb_line6 *line6, int address, void *data,
size_t datalen);
extern int line6_read_data(struct usb_line6 *line6, unsigned address,
void *data, unsigned datalen);
extern int line6_read_serial_number(struct usb_line6 *line6,
u32 *serial_number);
extern int line6_send_raw_message_async(struct usb_line6 *line6,
Expand All @@ -161,8 +161,8 @@ extern void line6_start_timer(struct timer_list *timer, unsigned long msecs,
void (*function)(unsigned long),
unsigned long data);
extern int line6_version_request_async(struct usb_line6 *line6);
extern int line6_write_data(struct usb_line6 *line6, int address, void *data,
size_t datalen);
extern int line6_write_data(struct usb_line6 *line6, unsigned address,
void *data, unsigned datalen);

int line6_probe(struct usb_interface *interface,
const struct usb_device_id *id,
Expand Down

0 comments on commit 25a0707

Please sign in to comment.