mirror of https://gitee.com/openkylin/linux.git
st: fix potential null pointer dereference.
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 <mlombard@redhat.com> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Reviewed-by: Tomas Henzl <thenzl@redhat.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
a35bb4458e
commit
ab08ee1439
|
@ -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) {
|
||||
|
@ -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" : "",
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue