Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

scsi: storvsc: Fix storvsc_queuecommand() memory leak

Fix possible memory leak in error path of storvsc_queuecommand() when
DMA mapping fails.

Signed-off-by: Juan Vazquez <juvazq@linux.microsoft.com>
Reviewed-by: Tianyu Lan <Tianyu.Lan@microsoft.com>
Link: https://lore.kernel.org/r/20220109001758.6401-1-juvazq@linux.microsoft.com
Signed-off-by: Wei Liu <wei.liu@kernel.org>

authored by

Juan Vazquez and committed by
Wei Liu
4eea5332 51500b71

+12 -5
+12 -5
drivers/scsi/storvsc_drv.c
··· 1850 1850 payload->range.offset = offset_in_hvpg; 1851 1851 1852 1852 sg_count = scsi_dma_map(scmnd); 1853 - if (sg_count < 0) 1854 - return SCSI_MLQUEUE_DEVICE_BUSY; 1853 + if (sg_count < 0) { 1854 + ret = SCSI_MLQUEUE_DEVICE_BUSY; 1855 + goto err_free_payload; 1856 + } 1855 1857 1856 1858 for_each_sg(sgl, sg, sg_count, j) { 1857 1859 /* ··· 1888 1886 put_cpu(); 1889 1887 1890 1888 if (ret == -EAGAIN) { 1891 - if (payload_sz > sizeof(cmd_request->mpb)) 1892 - kfree(payload); 1893 1889 /* no more space */ 1894 - return SCSI_MLQUEUE_DEVICE_BUSY; 1890 + ret = SCSI_MLQUEUE_DEVICE_BUSY; 1891 + goto err_free_payload; 1895 1892 } 1896 1893 1897 1894 return 0; 1895 + 1896 + err_free_payload: 1897 + if (payload_sz > sizeof(cmd_request->mpb)) 1898 + kfree(payload); 1899 + 1900 + return ret; 1898 1901 } 1899 1902 1900 1903 static struct scsi_host_template scsi_driver = {