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

Commit 988dab7f authored by Aditya Pakki's avatar Aditya Pakki Committed by Greg Kroah-Hartman
Browse files

thunderbolt: Fix to check for kmemdup failure



[ Upstream commit 2cc12751cf464a722ff57b54d17d30c84553f9c0 ]

Memory allocated via kmemdup might fail and return a NULL pointer.
This patch adds a check on the return value of kmemdup and passes the
error upstream.

Signed-off-by: default avatarAditya Pakki <pakki001@umn.edu>
Reviewed-by: default avatarMukesh Ojha <mojha@codeaurora.org>
Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 877a202f
Loading
Loading
Loading
Loading
+16 −6
Original line number Diff line number Diff line
@@ -1289,13 +1289,14 @@ int tb_switch_configure(struct tb_switch *sw)
	return tb_plug_events_active(sw, true);
}

static void tb_switch_set_uuid(struct tb_switch *sw)
static int tb_switch_set_uuid(struct tb_switch *sw)
{
	u32 uuid[4];
	int cap;
	int cap, ret;

	ret = 0;
	if (sw->uuid)
		return;
		return ret;

	/*
	 * The newer controllers include fused UUID as part of link
@@ -1303,7 +1304,9 @@ static void tb_switch_set_uuid(struct tb_switch *sw)
	 */
	cap = tb_switch_find_vse_cap(sw, TB_VSE_CAP_LINK_CONTROLLER);
	if (cap > 0) {
		tb_sw_read(sw, uuid, TB_CFG_SWITCH, cap + 3, 4);
		ret = tb_sw_read(sw, uuid, TB_CFG_SWITCH, cap + 3, 4);
		if (ret)
			return ret;
	} else {
		/*
		 * ICM generates UUID based on UID and fills the upper
@@ -1318,6 +1321,9 @@ static void tb_switch_set_uuid(struct tb_switch *sw)
	}

	sw->uuid = kmemdup(uuid, sizeof(uuid), GFP_KERNEL);
	if (!sw->uuid)
		ret = -ENOMEM;
	return ret;
}

static int tb_switch_add_dma_port(struct tb_switch *sw)
@@ -1367,7 +1373,9 @@ static int tb_switch_add_dma_port(struct tb_switch *sw)

	if (status) {
		tb_sw_info(sw, "switch flash authentication failed\n");
		tb_switch_set_uuid(sw);
		ret = tb_switch_set_uuid(sw);
		if (ret)
			return ret;
		nvm_set_auth_status(sw, status);
	}

@@ -1417,7 +1425,9 @@ int tb_switch_add(struct tb_switch *sw)
		}
		tb_sw_info(sw, "uid: %#llx\n", sw->uid);

		tb_switch_set_uuid(sw);
		ret = tb_switch_set_uuid(sw);
		if (ret)
			return ret;

		for (i = 0; i <= sw->config.max_port_number; i++) {
			if (sw->ports[i].disabled) {