Browse Source

platform/x86: dell-smbios-wmi: release mutex lock on WMI call failure

Unbound devices may race with calling this function causing the mutex
to stay locked.  This failure mode should have released the mutex too.

Signed-off-by: Mario Limonciello <mario.limonciello@dell.com>
Signed-off-by: Darren Hart (VMware) <dvhart@infradead.org>
Mario Limonciello 7 years ago
parent
commit
307ab2a99d
1 changed files with 5 additions and 2 deletions
  1. 5 2
      drivers/platform/x86/dell-smbios-wmi.c

+ 5 - 2
drivers/platform/x86/dell-smbios-wmi.c

@@ -91,8 +91,10 @@ int dell_smbios_wmi_call(struct calling_interface_buffer *buffer)
 
 
 	mutex_lock(&call_mutex);
 	mutex_lock(&call_mutex);
 	priv = get_first_smbios_priv();
 	priv = get_first_smbios_priv();
-	if (!priv)
-		return -ENODEV;
+	if (!priv) {
+		ret = -ENODEV;
+		goto out_wmi_call;
+	}
 
 
 	size = sizeof(struct calling_interface_buffer);
 	size = sizeof(struct calling_interface_buffer);
 	difference = priv->req_buf_size - sizeof(u64) - size;
 	difference = priv->req_buf_size - sizeof(u64) - size;
@@ -101,6 +103,7 @@ int dell_smbios_wmi_call(struct calling_interface_buffer *buffer)
 	memcpy(&priv->buf->std, buffer, size);
 	memcpy(&priv->buf->std, buffer, size);
 	ret = run_smbios_call(priv->wdev);
 	ret = run_smbios_call(priv->wdev);
 	memcpy(buffer, &priv->buf->std, size);
 	memcpy(buffer, &priv->buf->std, size);
+out_wmi_call:
 	mutex_unlock(&call_mutex);
 	mutex_unlock(&call_mutex);
 
 
 	return ret;
 	return ret;