瀏覽代碼

Fix use-after-free SBH corruption due to overlapped ReadFile in hidapi not being canceled for all threads before device close

- hidapi already called CancelIo on hid_close but that only cancels pending IO for the current thread. Controller read/writes originate from multiple
  threads (serialized, but on a different thread nonetheless) but device destruction was always done on the main device thread which left any
  pending overlapped reads still running after hidapi's internal read buffer is deallocated leading to intermittent free list corruption.
Sam Lantinga 5 年之前
父節點
當前提交
ab55ec4850
共有 1 個文件被更改,包括 5 次插入1 次删除
  1. 5 1
      src/hidapi/windows/hid.c

+ 5 - 1
src/hidapi/windows/hid.c

@@ -932,9 +932,13 @@ int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *dev, unsigned
 
 void HID_API_EXPORT HID_API_CALL hid_close(hid_device *dev)
 {
+	DWORD bytes_read = 0;
+
 	if (!dev)
 		return;
-	CancelIo(dev->device_handle);
+	CancelIoEx(dev->device_handle, NULL);
+	if (dev->read_pending)
+		GetOverlappedResult(dev->device_handle, &dev->ol, &bytes_read, TRUE/*wait*/);
 	free_hid_device(dev);
 }