From patchwork Mon May 30 15:46:12 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 102292 Delivered-To: patch@linaro.org Received: by 10.140.92.199 with SMTP id b65csp1472702qge; Mon, 30 May 2016 08:46:27 -0700 (PDT) X-Received: by 10.66.242.3 with SMTP id wm3mr47635227pac.81.1464623187182; Mon, 30 May 2016 08:46:27 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l69si37141252pfi.243.2016.05.30.08.46.26; Mon, 30 May 2016 08:46:27 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161588AbcE3PqX (ORCPT + 30 others); Mon, 30 May 2016 11:46:23 -0400 Received: from mout.kundenserver.de ([212.227.17.13]:64313 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1161509AbcE3PqV (ORCPT ); Mon, 30 May 2016 11:46:21 -0400 Received: from wuerfel.lan. ([78.42.132.4]) by mrelayeu.kundenserver.de (mreue102) with ESMTPA (Nemesis) id 0LoYV0-1bjWR62rec-00gUnq; Mon, 30 May 2016 17:46:10 +0200 From: Arnd Bergmann To: Yuval Mintz , Ariel Elior , everest-linux-l2@qlogic.com Cc: Arnd Bergmann , "David S. Miller" , Manish Chopra , Sudarsana Reddy Kalluru , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] qed: fix qed_fill_link() error handling Date: Mon, 30 May 2016 17:46:12 +0200 Message-Id: <1464623197-2084229-1-git-send-email-arnd@arndb.de> X-Mailer: git-send-email 2.7.0 X-Provags-ID: V03:K0:KCCepT61ODbwnBnb1IVbjMPQkw3KjW44FiQ4q/zEXOulaBYvVQn ddSZJW1jhz9pExi94rL16RTUbSnqFjfeLGe3S2hJxMqte8bgaPwWTuglwrIJmVROyYbEOED 2pe20Yp1wsw1NDftd+A8lF7p1JRWoF5/i3G9CEtXWBQbusfiUBO3YrJVLVx8u/z4KMIaPdz GTu9VqRhadFssAiQYGN1A== X-UI-Out-Filterresults: notjunk:1; V01:K0:G21wVYFr8iM=:60DP7qTC33DrLf/j5Xahxd /OZGKjzW3ZXlSIWagX7GJrphyqJgmd2Dignox8pUEGZzQU99NfgpKQ/jRzxk68ccOCCO1rTU+ u8hSn/UwT+QyQazABJGenbLX28ynQadDWY4bSsT/qY3lHEN+Hejy4EFQEot+Znao+ED5sf6IM DgTOPsgvOYJaixOLI+SW/iksnBcU7AnSp0tH5jdoHGY/w/u0erps2bxIHWdQ5gdNzva18DxBo U2vi2iHpEhnmIHR4dT6eywnmR8QxfJgxqBX691X9pHDC7O8zoBA71YEwldCIt2DBndWuZ14Gc aZBaBw6bg2yiT2/vfBXf2kdHCwKYar8x1BLQYgXFVQPf9wst/VIU6/zdxf+qV3vDyB8NTWACO Uq0dobbdsmqcW+w7fEA0/iiB5vU83E/75LyhsIM5u347T/MaCvN9iuBVL5aGO+otNMbZDQ9Zy FfmyRH1xCHYkTyKlrvh6LGw2MghEwCN5OUWGq9TIdjEHNZYBmVR9hhHVKwTx2zzscN1VUjW3W obAZvbi0cY81AhFWVXrjXWfnzWgdFHLIKlOP6zZ8Qt5/A0wy/tAUCnl8PgyehTzYFesjy2keZ CriyW9SdfdbehReawkJMyBj2VoHsr4ej22Ac+lqUz14oTuNKobKFL6tb2HM1Tl5iFWCIIsaHj kcCgZJmVF5WPomoOrzfjUgqoMlqbLYfo/oI7b6MMjcf/qUoxa/FibKgSOwmiphS8hiBc= Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org gcc warns about qed_fill_link possibly accessing uninitialized data: drivers/net/ethernet/qlogic/qed/qed_main.c: In function 'qed_fill_link': drivers/net/ethernet/qlogic/qed/qed_main.c:1170:35: error: 'link_caps' may be used uninitialized in this function [-Werror=maybe-uninitialized] While this warning is only about the specific case of CONFIG_QED_SRIOV being disabled but the function getting called for a VF (which should never happen), another possibility is that qed_mcp_get_*() fails without returning data. This rearranges the code so we bail out in either of the two cases and print a warning instead of accessing the uninitialized data. The qed_link_output structure remains untouched in this case, but all callers first call memset() on it, so at least we are not leaking stack data then. Signed-off-by: Arnd Bergmann --- drivers/net/ethernet/qlogic/qed/qed_main.c | 45 ++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 9 deletions(-) -- 2.7.0 diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c index 753064679bde..68f87a4f9316 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_main.c +++ b/drivers/net/ethernet/qlogic/qed/qed_main.c @@ -1105,6 +1105,39 @@ static int qed_get_port_type(u32 media_type) return port_type; } +static int qed_get_link_data(struct qed_hwfn *hwfn, + struct qed_mcp_link_params *params, + struct qed_mcp_link_state *link, + struct qed_mcp_link_capabilities *link_caps) +{ + void *p; + + if (IS_ENABLED(CONFIG_QED_SRIOV) && !IS_PF(hwfn->cdev)) { + qed_vf_get_link_params(hwfn, params); + qed_vf_get_link_state(hwfn, link); + qed_vf_get_link_caps(hwfn, link_caps); + + return 0; + } + + p = qed_mcp_get_link_params(hwfn); + if (!p) + return -ENXIO; + memcpy(params, p, sizeof(*params)); + + p = qed_mcp_get_link_state(hwfn); + if (!p) + return -ENXIO; + memcpy(link, p, sizeof(*link)); + + p = qed_mcp_get_link_capabilities(hwfn); + if (!p) + return -ENXIO; + memcpy(link_caps, p, sizeof(*link_caps)); + + return 0; +} + static void qed_fill_link(struct qed_hwfn *hwfn, struct qed_link_output *if_link) { @@ -1116,15 +1149,9 @@ static void qed_fill_link(struct qed_hwfn *hwfn, memset(if_link, 0, sizeof(*if_link)); /* Prepare source inputs */ - if (IS_PF(hwfn->cdev)) { - memcpy(¶ms, qed_mcp_get_link_params(hwfn), sizeof(params)); - memcpy(&link, qed_mcp_get_link_state(hwfn), sizeof(link)); - memcpy(&link_caps, qed_mcp_get_link_capabilities(hwfn), - sizeof(link_caps)); - } else { - qed_vf_get_link_params(hwfn, ¶ms); - qed_vf_get_link_state(hwfn, &link); - qed_vf_get_link_caps(hwfn, &link_caps); + if (qed_get_link_data(hwfn, ¶ms, &link, &link_caps)) { + dev_warn(&hwfn->cdev->pdev->dev, "no link data available\n"); + return; } /* Set the link parameters to pass to protocol driver */