scsi: iscsi: Fix possible memory leak when device_register() failed

If device_register() returns error, the name allocated by the
dev_set_name() need be freed. As described in the comment of
device_register(), we should use put_device() to give up the reference in
the error path.

Fix this by calling put_device(), the name will be freed in the
kobject_cleanup(), and this patch modified resources will be released by
calling the corresponding callback function in the device_release().

Signed-off-by: Zhou Guanghui <zhouguanghui1@huawei.com>
Link: https://lore.kernel.org/r/20221110033729.1555-1-zhouguanghui1@huawei.com
Reviewed-by: Mike Christie <michael.christie@oracle.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by Zhou Guanghui and committed by Martin K. Petersen f014165f 0954256e

+16 -15
+16 -15
drivers/scsi/scsi_transport_iscsi.c
··· 231 dev_set_name(&ep->dev, "ep-%d", id); 232 err = device_register(&ep->dev); 233 if (err) 234 - goto free_id; 235 236 err = sysfs_create_group(&ep->dev.kobj, &iscsi_endpoint_group); 237 if (err) ··· 245 device_unregister(&ep->dev); 246 return NULL; 247 248 - free_id: 249 mutex_lock(&iscsi_ep_idr_mutex); 250 idr_remove(&iscsi_ep_idr, id); 251 mutex_unlock(&iscsi_ep_idr_mutex); 252 free_ep: 253 kfree(ep); 254 return NULL; ··· 768 769 err = device_register(&iface->dev); 770 if (err) 771 - goto free_iface; 772 773 err = sysfs_create_group(&iface->dev.kobj, &iscsi_iface_group); 774 if (err) ··· 782 device_unregister(&iface->dev); 783 return NULL; 784 785 - free_iface: 786 - put_device(iface->dev.parent); 787 - kfree(iface); 788 return NULL; 789 } 790 EXPORT_SYMBOL_GPL(iscsi_create_iface); ··· 1252 1253 err = device_register(&fnode_sess->dev); 1254 if (err) 1255 - goto free_fnode_sess; 1256 1257 if (dd_size) 1258 fnode_sess->dd_data = &fnode_sess[1]; 1259 1260 return fnode_sess; 1261 1262 - free_fnode_sess: 1263 - kfree(fnode_sess); 1264 return NULL; 1265 } 1266 EXPORT_SYMBOL_GPL(iscsi_create_flashnode_sess); ··· 1300 1301 err = device_register(&fnode_conn->dev); 1302 if (err) 1303 - goto free_fnode_conn; 1304 1305 if (dd_size) 1306 fnode_conn->dd_data = &fnode_conn[1]; 1307 1308 return fnode_conn; 1309 1310 - free_fnode_conn: 1311 - kfree(fnode_conn); 1312 return NULL; 1313 } 1314 EXPORT_SYMBOL_GPL(iscsi_create_flashnode_conn); ··· 4816 dev_set_name(&priv->dev, "%s", tt->name); 4817 err = device_register(&priv->dev); 4818 if (err) 4819 - goto free_priv; 4820 4821 err = sysfs_create_group(&priv->dev.kobj, &iscsi_transport_group); 4822 if (err) ··· 4851 unregister_dev: 4852 device_unregister(&priv->dev); 4853 return NULL; 4854 - free_priv: 4855 - kfree(priv); 4856 return NULL; 4857 } 4858 EXPORT_SYMBOL_GPL(iscsi_register_transport);
··· 231 dev_set_name(&ep->dev, "ep-%d", id); 232 err = device_register(&ep->dev); 233 if (err) 234 + goto put_dev; 235 236 err = sysfs_create_group(&ep->dev.kobj, &iscsi_endpoint_group); 237 if (err) ··· 245 device_unregister(&ep->dev); 246 return NULL; 247 248 + put_dev: 249 mutex_lock(&iscsi_ep_idr_mutex); 250 idr_remove(&iscsi_ep_idr, id); 251 mutex_unlock(&iscsi_ep_idr_mutex); 252 + put_device(&ep->dev); 253 + return NULL; 254 free_ep: 255 kfree(ep); 256 return NULL; ··· 766 767 err = device_register(&iface->dev); 768 if (err) 769 + goto put_dev; 770 771 err = sysfs_create_group(&iface->dev.kobj, &iscsi_iface_group); 772 if (err) ··· 780 device_unregister(&iface->dev); 781 return NULL; 782 783 + put_dev: 784 + put_device(&iface->dev); 785 return NULL; 786 } 787 EXPORT_SYMBOL_GPL(iscsi_create_iface); ··· 1251 1252 err = device_register(&fnode_sess->dev); 1253 if (err) 1254 + goto put_dev; 1255 1256 if (dd_size) 1257 fnode_sess->dd_data = &fnode_sess[1]; 1258 1259 return fnode_sess; 1260 1261 + put_dev: 1262 + put_device(&fnode_sess->dev); 1263 return NULL; 1264 } 1265 EXPORT_SYMBOL_GPL(iscsi_create_flashnode_sess); ··· 1299 1300 err = device_register(&fnode_conn->dev); 1301 if (err) 1302 + goto put_dev; 1303 1304 if (dd_size) 1305 fnode_conn->dd_data = &fnode_conn[1]; 1306 1307 return fnode_conn; 1308 1309 + put_dev: 1310 + put_device(&fnode_conn->dev); 1311 return NULL; 1312 } 1313 EXPORT_SYMBOL_GPL(iscsi_create_flashnode_conn); ··· 4815 dev_set_name(&priv->dev, "%s", tt->name); 4816 err = device_register(&priv->dev); 4817 if (err) 4818 + goto put_dev; 4819 4820 err = sysfs_create_group(&priv->dev.kobj, &iscsi_transport_group); 4821 if (err) ··· 4850 unregister_dev: 4851 device_unregister(&priv->dev); 4852 return NULL; 4853 + put_dev: 4854 + put_device(&priv->dev); 4855 return NULL; 4856 } 4857 EXPORT_SYMBOL_GPL(iscsi_register_transport);