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