| From 078fdcb4b1c8bcc6953e91243892c8164754cca9 Mon Sep 17 00:00:00 2001 |
| From: Aditya Pakki <pakki001@umn.edu> |
| Date: Wed, 20 Mar 2019 10:57:54 -0500 |
| Subject: 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: Aditya Pakki <pakki001@umn.edu> |
| Reviewed-by: Mukesh Ojha <mojha@codeaurora.org> |
| Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/thunderbolt/switch.c | 22 ++++++++++++++++------ |
| 1 file changed, 16 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c |
| index 32e012713dbeb..f569a2673742f 100644 |
| --- a/drivers/thunderbolt/switch.c |
| +++ b/drivers/thunderbolt/switch.c |
| @@ -1287,13 +1287,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 |
| @@ -1301,7 +1302,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 |
| @@ -1316,6 +1319,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) |
| @@ -1365,7 +1371,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); |
| } |
| |
| @@ -1415,7 +1423,9 @@ int tb_switch_add(struct tb_switch *sw) |
| } |
| tb_sw_dbg(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) { |
| -- |
| 2.20.1 |
| |