Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 06cd928b authored by Michal Nazarewicz's avatar Michal Nazarewicz Committed by Felipe Balbi
Browse files

usb: gadget: f_midi: fix in_last_port looping logic



In general case, all of midi->in_port pointers may be non-NULL which
implies that the ‘if (\!port)’ condition will never execute thus never
zeroing midi->in_last_port.  Fix by rewriting the loop such that the
field is set to zero if \!port or end of loop has been reached.

Signed-off-by: default avatarMichal Nazarewicz <mina86@mina86.com>
Signed-off-by: default avatarFelipe Balbi <balbi@kernel.org>
parent 9a71eb56
Loading
Loading
Loading
Loading
+7 −19
Original line number Original line Diff line number Diff line
@@ -534,6 +534,7 @@ static void f_midi_drop_out_substreams(struct f_midi *midi)
static int f_midi_do_transmit(struct f_midi *midi, struct usb_ep *ep)
static int f_midi_do_transmit(struct f_midi *midi, struct usb_ep *ep)
{
{
	struct usb_request *req = NULL;
	struct usb_request *req = NULL;
	struct gmidi_in_port *port;
	unsigned int len, i;
	unsigned int len, i;
	bool active = false;
	bool active = false;
	int err;
	int err;
@@ -557,16 +558,9 @@ static int f_midi_do_transmit(struct f_midi *midi, struct usb_ep *ep)
	if (req->length > 0)
	if (req->length > 0)
		return 0;
		return 0;


	for (i = midi->in_last_port; i < MAX_PORTS; i++) {
	i = midi->in_last_port;
		struct gmidi_in_port *port = midi->in_port[i];
	for (; i < MAX_PORTS && (port = midi->in_port[i]); ++i) {
		struct snd_rawmidi_substream *substream = midi->in_substream[i];
		struct snd_rawmidi_substream *substream = midi->in_substream[i];

		if (!port) {
			/* Reset counter when we reach the last available port */
			midi->in_last_port = 0;
			break;
		}

		if (!port->active || !substream)
		if (!port->active || !substream)
			continue;
			continue;


@@ -581,20 +575,13 @@ static int f_midi_do_transmit(struct f_midi *midi, struct usb_ep *ep)
		}
		}


		active = !!port->active;
		active = !!port->active;
		/*
		if (active)
		 * Check if last port is still active, which means that there is
		 * still data on that substream but this current request run out
		 * of space.
		 */
		if (active) {
			midi->in_last_port = i;
			/* There is no need to re-iterate though midi ports. */
			break;
			break;
	}
	}
	}
	midi->in_last_port = active ? i : 0;


	if (req->length <= 0)
	if (req->length <= 0)
		return active;
		goto done;


	err = usb_ep_queue(ep, req, GFP_ATOMIC);
	err = usb_ep_queue(ep, req, GFP_ATOMIC);
	if (err < 0) {
	if (err < 0) {
@@ -607,6 +594,7 @@ static int f_midi_do_transmit(struct f_midi *midi, struct usb_ep *ep)
		kfifo_put(&midi->in_req_fifo, req);
		kfifo_put(&midi->in_req_fifo, req);
	}
	}


done:
	return active;
	return active;
}
}