Commit f37230c0 authored by Thomas Hellstrom's avatar Thomas Hellstrom

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: default avatarThomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: default avatarBrian Paul <brianp@vmware.com>
Reviewed-by: default avatarSinclair Yeh <syeh@vmware.com>
parent 938ae725
...@@ -329,8 +329,6 @@ int vmw_host_get_guestinfo(const char *guest_info_param, ...@@ -329,8 +329,6 @@ int vmw_host_get_guestinfo(const char *guest_info_param,
struct rpc_channel channel; struct rpc_channel channel;
char *msg, *reply = NULL; char *msg, *reply = NULL;
size_t reply_len = 0; size_t reply_len = 0;
int ret = 0;
if (!vmw_msg_enabled) if (!vmw_msg_enabled)
return -ENODEV; return -ENODEV;
...@@ -344,15 +342,14 @@ int vmw_host_get_guestinfo(const char *guest_info_param, ...@@ -344,15 +342,14 @@ int vmw_host_get_guestinfo(const char *guest_info_param,
return -ENOMEM; return -ENOMEM;
} }
if (vmw_open_channel(&channel, RPCI_PROTOCOL_NUM) || if (vmw_open_channel(&channel, RPCI_PROTOCOL_NUM))
vmw_send_msg(&channel, msg) || goto out_open;
vmw_recv_msg(&channel, (void *) &reply, &reply_len) ||
vmw_close_channel(&channel)) {
DRM_ERROR("Failed to get %s", guest_info_param);
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) { if (buffer && reply && reply_len > 0) {
/* Remove reply code, which are the first 2 characters of /* Remove reply code, which are the first 2 characters of
* the reply * the reply
...@@ -369,7 +366,17 @@ int vmw_host_get_guestinfo(const char *guest_info_param, ...@@ -369,7 +366,17 @@ int vmw_host_get_guestinfo(const char *guest_info_param,
kfree(reply); kfree(reply);
kfree(msg); 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) ...@@ -400,15 +407,22 @@ int vmw_host_log(const char *log)
return -ENOMEM; return -ENOMEM;
} }
if (vmw_open_channel(&channel, RPCI_PROTOCOL_NUM) || if (vmw_open_channel(&channel, RPCI_PROTOCOL_NUM))
vmw_send_msg(&channel, msg) || goto out_open;
vmw_close_channel(&channel)) {
DRM_ERROR("Failed to send log\n");
ret = -EINVAL; if (vmw_send_msg(&channel, msg))
} goto out_msg;
vmw_close_channel(&channel);
kfree(msg); 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;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment