Hi,
On 05/26/2018 03:10 PM, gregkh@linuxfoundation.org wrote:
The patch below does not apply to the 4.16-stable tree. If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to stable@vger.kernel.org.
thanks,
greg k-h
The IMO best option is to cherry-pick commit
6073a09210e06 "drm/vmwgfx: Use kasprintf" by Himanshu Jha. It doesn't fix anything but is small and makes the below patch apply cleanly.
Thanks, Thomas
------------------ original commit in Linus's tree ------------------
From f37230c0ad481091bc136788ff8b37dc86300c6d Mon Sep 17 00:00:00 2001 From: Thomas Hellstrom thellstrom@vmware.com Date: Wed, 23 May 2018 16:13:20 +0200 Subject: [PATCH] drm/vmwgfx: Fix host logging / guestinfo reading error paths
The error paths were leaking opened channels. Fix by using dedicated error paths.
Cc: stable@vger.kernel.org Signed-off-by: Thomas Hellstrom thellstrom@vmware.com Reviewed-by: Brian Paul brianp@vmware.com Reviewed-by: Sinclair Yeh syeh@vmware.com
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c b/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c index cdff99211602..21d746bdc922 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c @@ -329,8 +329,6 @@ int vmw_host_get_guestinfo(const char *guest_info_param, struct rpc_channel channel; char *msg, *reply = NULL; size_t reply_len = 0;
- int ret = 0;
if (!vmw_msg_enabled) return -ENODEV; @@ -344,15 +342,14 @@ int vmw_host_get_guestinfo(const char *guest_info_param, return -ENOMEM; }
- if (vmw_open_channel(&channel, RPCI_PROTOCOL_NUM) ||
vmw_send_msg(&channel, msg) ||
vmw_recv_msg(&channel, (void *) &reply, &reply_len) ||
vmw_close_channel(&channel)) {
DRM_ERROR("Failed to get %s", guest_info_param);
- if (vmw_open_channel(&channel, RPCI_PROTOCOL_NUM))
goto out_open;
ret = -EINVAL;
- }
- if (vmw_send_msg(&channel, msg) ||
vmw_recv_msg(&channel, (void *) &reply, &reply_len))
goto out_msg;
- vmw_close_channel(&channel); if (buffer && reply && reply_len > 0) { /* Remove reply code, which are the first 2 characters of
- the reply
@@ -369,7 +366,17 @@ int vmw_host_get_guestinfo(const char *guest_info_param, kfree(reply); kfree(msg);
- return ret;
- return 0;
+out_msg:
- vmw_close_channel(&channel);
- kfree(reply);
+out_open:
- *length = 0;
- kfree(msg);
- DRM_ERROR("Failed to get %s", guest_info_param);
- return -EINVAL; }
@@ -400,15 +407,22 @@ int vmw_host_log(const char *log) return -ENOMEM; }
- if (vmw_open_channel(&channel, RPCI_PROTOCOL_NUM) ||
vmw_send_msg(&channel, msg) ||
vmw_close_channel(&channel)) {
DRM_ERROR("Failed to send log\n");
- if (vmw_open_channel(&channel, RPCI_PROTOCOL_NUM))
goto out_open;
ret = -EINVAL;
- }
- if (vmw_send_msg(&channel, msg))
goto out_msg;
- vmw_close_channel(&channel); kfree(msg);
- return ret;
- return 0;
+out_msg:
- vmw_close_channel(&channel);
+out_open:
- kfree(msg);
- DRM_ERROR("Failed to send log\n");
- return -EINVAL; }