On Sun, 03 Sep 2023 17:04:47 +0200, Christophe JAILLET wrote:
Le 03/09/2023 à 16:23, Takashi Iwai a écrit :
On Sun, 03 Sep 2023 15:06:00 +0200, Christophe JAILLET wrote:
If usb_alloc_coherent() or usb_urb_ep_type_check() fail, we should release the resources previously allocated.
Those are freed in the caller side, start_input_streams() instead.
Thanks for the fast review.
Hmpm, If IIUC, resources allocated *before* the ending "ep->num_urbs++" still need to be freed here, otherwise free_midi_urbs() in the caller will not free them.
Do you agree?
If yes, I can send v2 which would look like: usb_alloc_urb() if (err) return -ENOMEM
usb_alloc_coherent() if (err) { usb_free_urb() urb = NULL return -ENOMEM }
usb_urb_ep_type_check()
if (err) { usb_free_coherent() usb_free_urb() urb = NULL return -err }
Or, if yuo prefer, with an error handling path just like below, but without the final free_midi_urbs() + a comment explaining that the caller does this part of job instead.
Indeed. The fix would be rather a oneliner like below, though:
--- a/sound/usb/midi2.c +++ b/sound/usb/midi2.c @@ -265,7 +265,7 @@ static void free_midi_urbs(struct snd_usb_midi2_endpoint *ep)
if (!ep) return; - for (i = 0; i < ep->num_urbs; ++i) { + for (i = 0; i < NUM_URBS; ++i) { ctx = &ep->urbs[i]; if (!ctx->urb) break;
That was the intended behavior of free_midi_urbs().
Takashi