mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
scsi: zfcp: Fix a double put in zfcp_port_enqueue()
commitb481f644d9upstream. When device_register() fails, zfcp_port_release() will be called after put_device(). As a result, zfcp_ccw_adapter_put() will be called twice: one in zfcp_port_release() and one in the error path after device_register(). So the reference on the adapter object is doubly put, which may lead to a premature free. Fix this by adjusting the error tag after device_register(). Fixes:f3450c7b91("[SCSI] zfcp: Replace local reference counting with common kref") Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn> Link: https://lore.kernel.org/r/20230923103723.10320-1-dinghao.liu@zju.edu.cn Acked-by: Benjamin Block <bblock@linux.ibm.com> Cc: stable@vger.kernel.org # v2.6.33+ Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
310bca649b
commit
4e2f83952b
@@ -518,12 +518,12 @@ struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn,
|
|||||||
if (port) {
|
if (port) {
|
||||||
put_device(&port->dev);
|
put_device(&port->dev);
|
||||||
retval = -EEXIST;
|
retval = -EEXIST;
|
||||||
goto err_out;
|
goto err_put;
|
||||||
}
|
}
|
||||||
|
|
||||||
port = kzalloc(sizeof(struct zfcp_port), GFP_KERNEL);
|
port = kzalloc(sizeof(struct zfcp_port), GFP_KERNEL);
|
||||||
if (!port)
|
if (!port)
|
||||||
goto err_out;
|
goto err_put;
|
||||||
|
|
||||||
rwlock_init(&port->unit_list_lock);
|
rwlock_init(&port->unit_list_lock);
|
||||||
INIT_LIST_HEAD(&port->unit_list);
|
INIT_LIST_HEAD(&port->unit_list);
|
||||||
@@ -546,7 +546,7 @@ struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn,
|
|||||||
|
|
||||||
if (dev_set_name(&port->dev, "0x%016llx", (unsigned long long)wwpn)) {
|
if (dev_set_name(&port->dev, "0x%016llx", (unsigned long long)wwpn)) {
|
||||||
kfree(port);
|
kfree(port);
|
||||||
goto err_out;
|
goto err_put;
|
||||||
}
|
}
|
||||||
retval = -EINVAL;
|
retval = -EINVAL;
|
||||||
|
|
||||||
@@ -563,7 +563,8 @@ struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn,
|
|||||||
|
|
||||||
return port;
|
return port;
|
||||||
|
|
||||||
err_out:
|
err_put:
|
||||||
zfcp_ccw_adapter_put(adapter);
|
zfcp_ccw_adapter_put(adapter);
|
||||||
|
err_out:
|
||||||
return ERR_PTR(retval);
|
return ERR_PTR(retval);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user