Browse Source

Call IOHIDDeviceClose() if needed in hid_close() on macOS

Unregistering the input report callback marks the device as disconnected, so IOHIDDeviceClose() would never be called if the device wasn't already disconnected  when hid_close() was called.

Fixes https://github.com/libsdl-org/SDL/issues/12255

(cherry picked from commit 2442c85cb89c262672b337b2555fff77cf770478)
Sam Lantinga 3 months ago
parent
commit
8b7a088efc
1 changed files with 5 additions and 2 deletions
  1. 5 2
      src/hidapi/mac/hid.c

+ 5 - 2
src/hidapi/mac/hid.c

@@ -1135,11 +1135,14 @@ int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data,
 
 void HID_API_EXPORT hid_close(hid_device *dev)
 {
+	int disconnected;
+
 	if (!dev)
 		return;
 	
 	/* Disconnect the report callback before close. */
-	if (!dev->disconnected) {
+	disconnected = dev->disconnected;
+	if (!disconnected) {
 		IOHIDDeviceRegisterInputReportCallback(
 											   dev->device_handle, dev->input_report_buf, dev->max_input_report_len,
 											   NULL, dev);
@@ -1163,7 +1166,7 @@ void HID_API_EXPORT hid_close(hid_device *dev)
 	/* Close the OS handle to the device, but only if it's not
 	 been unplugged. If it's been unplugged, then calling
 	 IOHIDDeviceClose() will crash. */
-	if (!dev->disconnected) {
+	if (!disconnected) {
 		IOHIDDeviceClose(dev->device_handle, kIOHIDOptionsTypeNone);
 	}