Re: [PATCH] scsi: qedf: Fix a potential NULL pointer dereference

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, 20 Aug 2017, 1:09pm, Christophe JAILLET wrote:

> At the beginning of 'qedf_srr_compl()' and of 'qedf_rec_compl()', we check
> if 'orig_io_req' is NULL. If this happens, a NULL pointer dereference will
> occur in the error handling path.
> 
> Fix it by adding an additionnal label in the error handling path in order
> to avoid this NULL pointer dereference.
> 
> Fixes: 61d8658b4a43 ("scsi: qedf: Add QLogic FastLinQ offload FCoE driver framework.")
> Signed-off-by: Christophe JAILLET <christophe.jaillet@xxxxxxxxxx>
> ---
>  drivers/scsi/qedf/qedf_els.c | 14 ++++++++------
>  1 file changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/scsi/qedf/qedf_els.c b/drivers/scsi/qedf/qedf_els.c
> index eb07f1de8afa..59c18ca4cda9 100644
> --- a/drivers/scsi/qedf/qedf_els.c
> +++ b/drivers/scsi/qedf/qedf_els.c
> @@ -489,7 +489,7 @@ static void qedf_srr_compl(struct qedf_els_cb_arg *cb_arg)
>  
>  	/* If a SRR times out, simply free resources */
>  	if (srr_req->event == QEDF_IOREQ_EV_ELS_TMO)
> -		goto out_free;
> +		goto out_put;
>  
>  	/* Normalize response data into struct fc_frame */
>  	mp_req = &(srr_req->mp_req);
> @@ -501,7 +501,7 @@ static void qedf_srr_compl(struct qedf_els_cb_arg *cb_arg)
>  	if (!fp) {
>  		QEDF_ERR(&(qedf->dbg_ctx),
>  		    "fc_frame_alloc failure.\n");
> -		goto out_free;
> +		goto out_put;
>  	}
>  
>  	/* Copy frame header from firmware into fp */
> @@ -526,9 +526,10 @@ static void qedf_srr_compl(struct qedf_els_cb_arg *cb_arg)
>  	}
>  
>  	fc_frame_free(fp);
> -out_free:
> +out_put:
>  	/* Put reference for original command since SRR completed */
>  	kref_put(&orig_io_req->refcount, qedf_release_cmd);
> +out_free:
>  	kfree(cb_arg);
>  }
>  
> @@ -780,7 +781,7 @@ static void qedf_rec_compl(struct qedf_els_cb_arg *cb_arg)
>  
>  	/* If a REC times out, free resources */
>  	if (rec_req->event == QEDF_IOREQ_EV_ELS_TMO)
> -		goto out_free;
> +		goto out_put;
>  
>  	/* Normalize response data into struct fc_frame */
>  	mp_req = &(rec_req->mp_req);
> @@ -792,7 +793,7 @@ static void qedf_rec_compl(struct qedf_els_cb_arg *cb_arg)
>  	if (!fp) {
>  		QEDF_ERR(&(qedf->dbg_ctx),
>  		    "fc_frame_alloc failure.\n");
> -		goto out_free;
> +		goto out_put;
>  	}
>  
>  	/* Copy frame header from firmware into fp */
> @@ -884,9 +885,10 @@ static void qedf_rec_compl(struct qedf_els_cb_arg *cb_arg)
>  
>  out_free_frame:
>  	fc_frame_free(fp);
> -out_free:
> +out_put:
>  	/* Put reference for original command since REC completed */
>  	kref_put(&orig_io_req->refcount, qedf_release_cmd);
> +out_free:
>  	kfree(cb_arg);
>  }
>  
> 

Thanks for the catch.

Acked-by: Chad Dupuis <chad.dupuis@xxxxxxxxxx>



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux