block/virtio-blk: Fix memory leak from virtio_blk_zone_report
This modification ensures that in scenarios where the buffer size is
insufficient for a zone report, the function will now properly set an
error status and proceed to a cleanup label, instead of merely
returning.
The following ASAN log reveals it:
==1767400==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 312 byte(s) in 1 object(s) allocated from:
    #0 0x64ac7b3280cd in malloc llvm/compiler-rt/lib/asan/asan_malloc_linux.cpp:129:3
    #1 0x735b02fb9738 in g_malloc (/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x5e738)
    #2 0x64ac7d23be96 in virtqueue_split_pop hw/virtio/virtio.c:1612:12
    #3 0x64ac7d23728a in virtqueue_pop hw/virtio/virtio.c:1783:16
    #4 0x64ac7cfcaacd in virtio_blk_get_request hw/block/virtio-blk.c:228:27
    #5 0x64ac7cfca7c7 in virtio_blk_handle_vq hw/block/virtio-blk.c:1123:23
    #6 0x64ac7cfecb95 in virtio_blk_handle_output hw/block/virtio-blk.c:1157:5
Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
Message-id: 20240404120040.1951466-1-zheyuma97@gmail.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
(cherry picked from commit bbdf902366)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
			
			
This commit is contained in:
		
				
					committed by
					
						
						Michael Tokarev
					
				
			
			
				
	
			
			
			
						parent
						
							9c2b8194ac
						
					
				
				
					commit
					46f03be3ed
				
			@@ -783,7 +783,8 @@ static void virtio_blk_handle_zone_report(VirtIOBlockReq *req,
 | 
				
			|||||||
            sizeof(struct virtio_blk_zone_report) +
 | 
					            sizeof(struct virtio_blk_zone_report) +
 | 
				
			||||||
            sizeof(struct virtio_blk_zone_descriptor)) {
 | 
					            sizeof(struct virtio_blk_zone_descriptor)) {
 | 
				
			||||||
        virtio_error(vdev, "in buffer too small for zone report");
 | 
					        virtio_error(vdev, "in buffer too small for zone report");
 | 
				
			||||||
        return;
 | 
					        err_status = VIRTIO_BLK_S_ZONE_INVALID_CMD;
 | 
				
			||||||
 | 
					        goto out;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* start byte offset of the zone report */
 | 
					    /* start byte offset of the zone report */
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user