Skip to content

Commit

Permalink
st: fix potential null pointer dereference.
Browse files Browse the repository at this point in the history
If cdev_add() returns an error, the code calls
cdev_del() passing the STm->cdevs[rew] pointer as parameter;
the problem is that the pointer has not been initialized yet.

This patch fixes the problem by moving the STm->cdevs[rew] pointer
initialization before the call to cdev_add().
It also sets STm->devs[rew] and STm->cdevs[rew] to NULL in
case of failure.

Signed-off-by: Maurizio Lombardi <[email protected]>
Reviewed-by: Johannes Thumshirn <[email protected]>
Reviewed-by: Tomas Henzl <[email protected]>
Signed-off-by: Martin K. Petersen <[email protected]>
  • Loading branch information
maurizio-lombardi authored and martinkpetersen committed Nov 19, 2015
1 parent a35bb44 commit ab08ee1
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions drivers/scsi/st.c
Original file line number Diff line number Diff line change
Expand Up @@ -4083,6 +4083,7 @@ static int create_one_cdev(struct scsi_tape *tape, int mode, int rew)
}
cdev->owner = THIS_MODULE;
cdev->ops = &st_fops;
STm->cdevs[rew] = cdev;

error = cdev_add(cdev, cdev_devno, 1);
if (error) {
Expand All @@ -4091,7 +4092,6 @@ static int create_one_cdev(struct scsi_tape *tape, int mode, int rew)
pr_err("st%d: Device not attached.\n", dev_num);
goto out_free;
}
STm->cdevs[rew] = cdev;

i = mode << (4 - ST_NBR_MODE_BITS);
snprintf(name, 10, "%s%s%s", rew ? "n" : "",
Expand All @@ -4110,8 +4110,9 @@ static int create_one_cdev(struct scsi_tape *tape, int mode, int rew)
return 0;
out_free:
cdev_del(STm->cdevs[rew]);
STm->cdevs[rew] = NULL;
out:
STm->cdevs[rew] = NULL;
STm->devs[rew] = NULL;
return error;
}

Expand Down

0 comments on commit ab08ee1

Please sign in to comment.