All of lore.kernel.org
 help / color / mirror / Atom feed
From: Can Guo <cang@codeaurora.org>
To: Colin Ian King <colin.king@canonical.com>
Cc: Alim Akhtar <alim.akhtar@samsung.com>,
	Avri Altman <avri.altman@wdc.com>,
	"James E.J. Bottomley" <jejb@linux.ibm.com>,
	"Martin K. Petersen" <martin.petersen@oracle.com>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: scsi: ufs: Optimize host lock on transfer requests send/compl paths (uninitialized pointer error)
Date: Wed, 09 Jun 2021 09:10:38 +0800	[thread overview]
Message-ID: <c723f68d3bfd535ea0c749fc93d06f32@codeaurora.org> (raw)
In-Reply-To: <fa66c94c-3df6-3813-dc2d-572cee16071b@canonical.com>

Hi Colin,

On 2021-06-08 23:44, Colin Ian King wrote:
> Hi,
> 
> static analysis with Coverity on linux-next has found an issue in
> drivers/scsi/ufs/ufshcd.c introduced by the following commit:
> 
> commit a45f937110fa6b0c2c06a5d3ef026963a5759050
> Author: Can Guo <cang@codeaurora.org>
> Date:   Mon May 24 01:36:57 2021 -0700
> 
>     scsi: ufs: Optimize host lock on transfer requests send/compl paths
> 
> The analysis is as follows:
> 
> 
> 2948 static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
> 2949                enum dev_cmd_type cmd_type, int timeout)
> 2950 {
> 2951        struct request_queue *q = hba->cmd_queue;
> 2952        struct request *req;
> 
>     1. var_decl: Declaring variable lrbp without initializer.
> 
> 2953        struct ufshcd_lrb *lrbp;
> 2954        int err;
> 2955        int tag;
> 2956        struct completion wait;
> 2957
> 2958        down_read(&hba->clk_scaling_lock);
> 2959
> 2960        /*
> 2961         * Get free slot, sleep if slots are unavailable.
> 2962         * Even though we use wait_event() which sleeps 
> indefinitely,
> 2963         * the maximum wait time is bounded by SCSI request 
> timeout.
> 2964         */
> 2965        req = blk_get_request(q, REQ_OP_DRV_OUT, 0);
> 
>     2. Condition IS_ERR(req), taking false branch.
> 
> 2966        if (IS_ERR(req)) {
> 2967                err = PTR_ERR(req);
> 2968                goto out_unlock;
> 2969        }
> 2970        tag = req->tag;
> 
>     3. Condition !!__ret_warn_on, taking false branch.
>     4. Condition !!__ret_warn_on, taking false branch.
> 
> 2971        WARN_ON_ONCE(!ufshcd_valid_tag(hba, tag));
> 2972        /* Set the timeout such that the SCSI error handler is not
> activated. */
> 2973        req->timeout = msecs_to_jiffies(2 * timeout);
> 2974        blk_mq_start_request(req);
> 2975
> 
>     5. Condition !!test_bit(tag, &hba->outstanding_reqs), taking true
> branch.
> 
> 2976        if (unlikely(test_bit(tag, &hba->outstanding_reqs))) {
> 2977                err = -EBUSY;
> 
>     6. Jumping to label out.
> 
> 2978                goto out;
> 2979        }
> 2980
> 2981        init_completion(&wait);
> 2982        lrbp = &hba->lrb[tag];
> 2983        WARN_ON(lrbp->cmd);
> 2984        err = ufshcd_compose_dev_cmd(hba, lrbp, cmd_type, tag);
> 2985        if (unlikely(err))
> 2986                goto out_put_tag;
> 2987
> 2988        hba->dev_cmd.complete = &wait;
> 2989
> 2990        ufshcd_add_query_upiu_trace(hba, UFS_QUERY_SEND,
> lrbp->ucd_req_ptr);
> 2991        /* Make sure descriptors are ready before ringing the
> doorbell */
> 2992        wmb();
> 2993
> 2994        ufshcd_send_command(hba, tag);
> 2995        err = ufshcd_wait_for_dev_cmd(hba, lrbp, timeout);
> 2996 out:
> 
>     7. Condition err, taking true branch.
> 
>     Uninitialized pointer read (UNINIT)
>     8. uninit_use: Using uninitialized value lrbp.
> 
> 2997        ufshcd_add_query_upiu_trace(hba, err ? UFS_QUERY_ERR :
> UFS_QUERY_COMP,
> 2998                                    (struct utp_upiu_req
> *)lrbp->ucd_rsp_ptr);
> 2999
> 3000 out_put_tag:
> 3001        blk_put_request(req);
> 3002 out_unlock:
> 3003        up_read(&hba->clk_scaling_lock);
> 3004        return err;
> 3005 }
> 
> Pointer lrbp is being accessed on the error exit path on line 2989
> because it is no longer being initialized early, the pointer assignment
> was moved to a later point (line 2982) by the commit referenced in the
> top of the email.
> 
> Colin

I will fix it by changing "goto out;" -> "goto out_put_tag;" on line 
#2978
in a new patch.

Thanks,
Can Guo.

      reply	other threads:[~2021-06-09  1:11 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-08 15:44 scsi: ufs: Optimize host lock on transfer requests send/compl paths (uninitialized pointer error) Colin Ian King
2021-06-09  1:10 ` Can Guo [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c723f68d3bfd535ea0c749fc93d06f32@codeaurora.org \
    --to=cang@codeaurora.org \
    --cc=alim.akhtar@samsung.com \
    --cc=avri.altman@wdc.com \
    --cc=colin.king@canonical.com \
    --cc=jejb@linux.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --cc=matthias.bgg@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.