[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210503115736.2104747-38-gregkh@linuxfoundation.org>
Date: Mon, 3 May 2021 13:57:04 +0200
From: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
To: linux-kernel@...r.kernel.org
Cc: Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Takashi Iwai <tiwai@...e.de>, Jaroslav Kysela <perex@...ex.cz>
Subject: [PATCH 37/69] ALSA: usx2y: check for failure of usb_alloc_urb()
While it is almost impossible to hit an error calling usb_alloc_urb(),
to make systems like syzbot which does error injection, and some static
analysis tools happy, properly handle errors on this path by unwinding
the previously allocated urbs and freeing them.
Cc: Takashi Iwai <tiwai@...e.de>
Cc: Jaroslav Kysela <perex@...ex.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
---
sound/usb/usx2y/usb_stream.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/sound/usb/usx2y/usb_stream.c b/sound/usb/usx2y/usb_stream.c
index 6bba17bf689a..1091ea96a29a 100644
--- a/sound/usb/usx2y/usb_stream.c
+++ b/sound/usb/usx2y/usb_stream.c
@@ -88,18 +88,35 @@ static int init_urbs(struct usb_stream_kernel *sk, unsigned use_packsize,
sizeof(struct usb_stream_packet) *
s->inpackets;
int u;
+ int i;
+ int err = -ENOMEM;
for (u = 0; u < USB_STREAM_NURBS; ++u) {
+ sk->outurb[u] = NULL;
sk->inurb[u] = usb_alloc_urb(sk->n_o_ps, GFP_KERNEL);
+ if (!sk->inurb[u])
+ goto error;
sk->outurb[u] = usb_alloc_urb(sk->n_o_ps, GFP_KERNEL);
+ if (!sk->outurb[u])
+ goto error;
}
+ u--;
if (init_pipe_urbs(sk, use_packsize, sk->inurb, indata, dev, in_pipe) ||
init_pipe_urbs(sk, use_packsize, sk->outurb, sk->write_page, dev,
- out_pipe))
- return -EINVAL;
+ out_pipe)) {
+ err = -EINVAL;
+ goto error;
+ }
return 0;
+
+error:
+ for (i = 0; i <= u; ++i) {
+ usb_free_urb(sk->inurb[i]);
+ usb_free_urb(sk->outurb[i]);
+ }
+ return err;
}
--
2.31.1
Powered by blists - more mailing lists