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

Commit 0bd8c295 authored by Vijayavardhan Vennapusa's avatar Vijayavardhan Vennapusa
Browse files

USB: u_bam: Handle error path properly in gbam_connect()



when USB is connected, composite layer calls each function driver's
set_alt() function. As part of that, RMNET driver tries to enable
USB IN and USB OUT endpoints. If usb endpoint enable fails, it is just
returning without doing proper cleanup. This might lead to memory leak
or crashes later. Fix the issue by handling error path correctly.

Change-Id: If0b8b6ce4ed4a638f704405d3adac64bee74d87c
Signed-off-by: default avatarVijayavardhan Vennapusa <vvreddy@codeaurora.org>
parent 5a94aeea
Loading
Loading
Loading
Loading
+23 −0
Original line number Original line Diff line number Diff line
@@ -2235,6 +2235,10 @@ int gbam_connect(struct grmnet *gr, u8 port_num,
			pr_err("%s:usb_bam_get_pipe_type() failed\n",
			pr_err("%s:usb_bam_get_pipe_type() failed\n",
				__func__);
				__func__);
			ret = -EINVAL;
			ret = -EINVAL;
			usb_ep_free_request(port->port_usb->out, d->rx_req);
			d->rx_req = NULL;
			usb_ep_free_request(port->port_usb->in, d->tx_req);
			d->tx_req = NULL;
			goto exit;
			goto exit;
		}
		}
		/*
		/*
@@ -2255,6 +2259,15 @@ int gbam_connect(struct grmnet *gr, u8 port_num,
	if (ret) {
	if (ret) {
		pr_err("%s: usb_ep_enable failed eptype:IN ep:%p",
		pr_err("%s: usb_ep_enable failed eptype:IN ep:%p",
			__func__, gr->in);
			__func__, gr->in);
		usb_ep_free_request(port->port_usb->out, d->rx_req);
		d->rx_req = NULL;
		usb_ep_free_request(port->port_usb->in, d->tx_req);
		d->tx_req = NULL;
		if (d->dst_pipe_type == USB_BAM_PIPE_BAM2BAM)
			port->port_usb->in->endless = false;

		if (d->src_pipe_type == USB_BAM_PIPE_BAM2BAM)
			port->port_usb->out->endless = false;
		goto exit;
		goto exit;
	}
	}
	gr->in->driver_data = port;
	gr->in->driver_data = port;
@@ -2270,6 +2283,16 @@ int gbam_connect(struct grmnet *gr, u8 port_num,
			pr_err("%s: usb_ep_enable failed eptype:OUT ep:%p",
			pr_err("%s: usb_ep_enable failed eptype:OUT ep:%p",
					__func__, gr->out);
					__func__, gr->out);
			gr->in->driver_data = 0;
			gr->in->driver_data = 0;
			usb_ep_disable(gr->in);
			usb_ep_free_request(port->port_usb->out, d->rx_req);
			d->rx_req = NULL;
			usb_ep_free_request(port->port_usb->in, d->tx_req);
			d->tx_req = NULL;
			if (d->dst_pipe_type == USB_BAM_PIPE_BAM2BAM)
				port->port_usb->in->endless = false;

			if (d->src_pipe_type == USB_BAM_PIPE_BAM2BAM)
				port->port_usb->out->endless = false;
			goto exit;
			goto exit;
		}
		}
		gr->out->driver_data = port;
		gr->out->driver_data = port;