lkml.org 
[lkml]   [2018]   [Jul]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 41/54] IB/hfi1: Fix incorrect mixing of ERR_PTR and NULL return values
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Michael J. Ruhl <michael.j.ruhl@intel.com>

    commit b697d7d8c741f27b728a878fc55852b06d0f6f5e upstream.

    The __get_txreq() function can return a pointer, ERR_PTR(-EBUSY), or NULL.
    All of the relevant call sites look for IS_ERR, so the NULL return would
    lead to a NULL pointer exception.

    Do not use the ERR_PTR mechanism for this function.

    Update all call sites to handle the return value correctly.

    Clean up error paths to reflect return value.

    Fixes: 45842abbb292 ("staging/rdma/hfi1: move txreq header code")
    Cc: <stable@vger.kernel.org> # 4.9.x+
    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
    Reviewed-by: Kamenee Arumugam <kamenee.arumugam@intel.com>
    Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
    Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
    Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/infiniband/hw/hfi1/rc.c | 2 +-
    drivers/infiniband/hw/hfi1/uc.c | 4 ++--
    drivers/infiniband/hw/hfi1/ud.c | 4 ++--
    drivers/infiniband/hw/hfi1/verbs_txreq.c | 4 ++--
    drivers/infiniband/hw/hfi1/verbs_txreq.h | 4 ++--
    5 files changed, 9 insertions(+), 9 deletions(-)

    --- a/drivers/infiniband/hw/hfi1/rc.c
    +++ b/drivers/infiniband/hw/hfi1/rc.c
    @@ -273,7 +273,7 @@ int hfi1_make_rc_req(struct rvt_qp *qp,

    lockdep_assert_held(&qp->s_lock);
    ps->s_txreq = get_txreq(ps->dev, qp);
    - if (IS_ERR(ps->s_txreq))
    + if (!ps->s_txreq)
    goto bail_no_tx;

    ps->s_txreq->phdr.hdr.hdr_type = priv->hdr_type;
    --- a/drivers/infiniband/hw/hfi1/uc.c
    +++ b/drivers/infiniband/hw/hfi1/uc.c
    @@ -1,5 +1,5 @@
    /*
    - * Copyright(c) 2015, 2016 Intel Corporation.
    + * Copyright(c) 2015 - 2018 Intel Corporation.
    *
    * This file is provided under a dual BSD/GPLv2 license. When using or
    * redistributing this file, you may do so under either license.
    @@ -72,7 +72,7 @@ int hfi1_make_uc_req(struct rvt_qp *qp,
    int middle = 0;

    ps->s_txreq = get_txreq(ps->dev, qp);
    - if (IS_ERR(ps->s_txreq))
    + if (!ps->s_txreq)
    goto bail_no_tx;

    if (!(ib_rvt_state_ops[qp->state] & RVT_PROCESS_SEND_OK)) {
    --- a/drivers/infiniband/hw/hfi1/ud.c
    +++ b/drivers/infiniband/hw/hfi1/ud.c
    @@ -1,5 +1,5 @@
    /*
    - * Copyright(c) 2015, 2016 Intel Corporation.
    + * Copyright(c) 2015 - 2018 Intel Corporation.
    *
    * This file is provided under a dual BSD/GPLv2 license. When using or
    * redistributing this file, you may do so under either license.
    @@ -479,7 +479,7 @@ int hfi1_make_ud_req(struct rvt_qp *qp,
    u32 lid;

    ps->s_txreq = get_txreq(ps->dev, qp);
    - if (IS_ERR(ps->s_txreq))
    + if (!ps->s_txreq)
    goto bail_no_tx;

    if (!(ib_rvt_state_ops[qp->state] & RVT_PROCESS_NEXT_SEND_OK)) {
    --- a/drivers/infiniband/hw/hfi1/verbs_txreq.c
    +++ b/drivers/infiniband/hw/hfi1/verbs_txreq.c
    @@ -1,5 +1,5 @@
    /*
    - * Copyright(c) 2016 - 2017 Intel Corporation.
    + * Copyright(c) 2016 - 2018 Intel Corporation.
    *
    * This file is provided under a dual BSD/GPLv2 license. When using or
    * redistributing this file, you may do so under either license.
    @@ -94,7 +94,7 @@ struct verbs_txreq *__get_txreq(struct h
    struct rvt_qp *qp)
    __must_hold(&qp->s_lock)
    {
    - struct verbs_txreq *tx = ERR_PTR(-EBUSY);
    + struct verbs_txreq *tx = NULL;

    write_seqlock(&dev->txwait_lock);
    if (ib_rvt_state_ops[qp->state] & RVT_PROCESS_RECV_OK) {
    --- a/drivers/infiniband/hw/hfi1/verbs_txreq.h
    +++ b/drivers/infiniband/hw/hfi1/verbs_txreq.h
    @@ -1,5 +1,5 @@
    /*
    - * Copyright(c) 2016 Intel Corporation.
    + * Copyright(c) 2016 - 2018 Intel Corporation.
    *
    * This file is provided under a dual BSD/GPLv2 license. When using or
    * redistributing this file, you may do so under either license.
    @@ -83,7 +83,7 @@ static inline struct verbs_txreq *get_tx
    if (unlikely(!tx)) {
    /* call slow path to get the lock */
    tx = __get_txreq(dev, qp);
    - if (IS_ERR(tx))
    + if (!tx)
    return tx;
    }
    tx->qp = qp;

    \
     
     \ /
      Last update: 2018-07-16 09:53    [W:3.186 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site