mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 09:04:39 +02:00
Drivers: hv: Free msginfo when the buffer fails to decrypt
The early failure path in __vmbus_establish_gpadl() doesn't deallocate
msginfo if the buffer fails to decrypt.
Fix the leak by breaking out the cleanup code into a separate function
and calling it where required.
Fixes: d4dccf353d ("Drivers: hv: vmbus: Mark vmbus ring buffer visible to host in Isolation VM")
Reported-by: Michael Kelley <mkhlinux@outlook.com>
Closes: https://lore.kernel.org/linux-hyperv/SN6PR02MB41573796F9787F67E0E97049D472A@SN6PR02MB4157.namprd02.prod.outlook.com
Signed-off-by: Roman Kisel <romank@linux.microsoft.com>
Reviewed-by: Michael Kelley <mhklinux@outlook.com>
Signed-off-by: Wei Liu <wei.liu@kernel.org>
This commit is contained in:
parent
0a4534bdf2
commit
510164539f
|
|
@ -410,6 +410,21 @@ static int create_gpadl_header(enum hv_gpadl_type type, void *kbuffer,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void vmbus_free_channel_msginfo(struct vmbus_channel_msginfo *msginfo)
|
||||
{
|
||||
struct vmbus_channel_msginfo *submsginfo, *tmp;
|
||||
|
||||
if (!msginfo)
|
||||
return;
|
||||
|
||||
list_for_each_entry_safe(submsginfo, tmp, &msginfo->submsglist,
|
||||
msglistentry) {
|
||||
kfree(submsginfo);
|
||||
}
|
||||
|
||||
kfree(msginfo);
|
||||
}
|
||||
|
||||
/*
|
||||
* __vmbus_establish_gpadl - Establish a GPADL for a buffer or ringbuffer
|
||||
*
|
||||
|
|
@ -429,7 +444,7 @@ static int __vmbus_establish_gpadl(struct vmbus_channel *channel,
|
|||
struct vmbus_channel_gpadl_header *gpadlmsg;
|
||||
struct vmbus_channel_gpadl_body *gpadl_body;
|
||||
struct vmbus_channel_msginfo *msginfo = NULL;
|
||||
struct vmbus_channel_msginfo *submsginfo, *tmp;
|
||||
struct vmbus_channel_msginfo *submsginfo;
|
||||
struct list_head *curr;
|
||||
u32 next_gpadl_handle;
|
||||
unsigned long flags;
|
||||
|
|
@ -459,6 +474,7 @@ static int __vmbus_establish_gpadl(struct vmbus_channel *channel,
|
|||
dev_warn(&channel->device_obj->device,
|
||||
"Failed to set host visibility for new GPADL %d.\n",
|
||||
ret);
|
||||
vmbus_free_channel_msginfo(msginfo);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
|
@ -535,12 +551,8 @@ static int __vmbus_establish_gpadl(struct vmbus_channel *channel,
|
|||
spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
|
||||
list_del(&msginfo->msglistentry);
|
||||
spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
|
||||
list_for_each_entry_safe(submsginfo, tmp, &msginfo->submsglist,
|
||||
msglistentry) {
|
||||
kfree(submsginfo);
|
||||
}
|
||||
|
||||
kfree(msginfo);
|
||||
vmbus_free_channel_msginfo(msginfo);
|
||||
|
||||
if (ret) {
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user