lkml.org 
[lkml]   [2021]   [Jun]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 050/101] net: qed: Fix memcpy() overflow of qed_dcbx_params()
    Date
    From: Kees Cook <keescook@chromium.org>

    [ Upstream commit 1c200f832e14420fa770193f9871f4ce2df00d07 ]

    The source (&dcbx_info->operational.params) and dest
    (&p_hwfn->p_dcbx_info->set.config.params) are both struct qed_dcbx_params
    (560 bytes), not struct qed_dcbx_admin_params (564 bytes), which is used
    as the memcpy() size.

    However it seems that struct qed_dcbx_operational_params
    (dcbx_info->operational)'s layout matches struct qed_dcbx_admin_params
    (p_hwfn->p_dcbx_info->set.config)'s 4 byte difference (3 padding, 1 byte
    for "valid").

    On the assumption that the size is wrong (rather than the source structure
    type), adjust the memcpy() size argument to be 4 bytes smaller and add
    a BUILD_BUG_ON() to validate any changes to the structure sizes.

    Signed-off-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/qlogic/qed/qed_dcbx.c | 4 +++-
    1 file changed, 3 insertions(+), 1 deletion(-)

    diff --git a/drivers/net/ethernet/qlogic/qed/qed_dcbx.c b/drivers/net/ethernet/qlogic/qed/qed_dcbx.c
    index 17d5b649eb36..e81dd34a3cac 100644
    --- a/drivers/net/ethernet/qlogic/qed/qed_dcbx.c
    +++ b/drivers/net/ethernet/qlogic/qed/qed_dcbx.c
    @@ -1266,9 +1266,11 @@ int qed_dcbx_get_config_params(struct qed_hwfn *p_hwfn,
    p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_STATIC;

    p_hwfn->p_dcbx_info->set.enabled = dcbx_info->operational.enabled;
    + BUILD_BUG_ON(sizeof(dcbx_info->operational.params) !=
    + sizeof(p_hwfn->p_dcbx_info->set.config.params));
    memcpy(&p_hwfn->p_dcbx_info->set.config.params,
    &dcbx_info->operational.params,
    - sizeof(struct qed_dcbx_admin_params));
    + sizeof(p_hwfn->p_dcbx_info->set.config.params));
    p_hwfn->p_dcbx_info->set.config.valid = true;

    memcpy(params, &p_hwfn->p_dcbx_info->set, sizeof(struct qed_dcbx_set));
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-06-28 16:39    [W:4.075 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site