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)
 void HID_API_EXPORT hid_close(hid_device *dev)
 {
 {
+	int disconnected;
+
 	if (!dev)
 	if (!dev)
 		return;
 		return;
 	
 	
 	/* Disconnect the report callback before close. */
 	/* Disconnect the report callback before close. */
-	if (!dev->disconnected) {
+	disconnected = dev->disconnected;
+	if (!disconnected) {
 		IOHIDDeviceRegisterInputReportCallback(
 		IOHIDDeviceRegisterInputReportCallback(
 											   dev->device_handle, dev->input_report_buf, dev->max_input_report_len,
 											   dev->device_handle, dev->input_report_buf, dev->max_input_report_len,
 											   NULL, dev);
 											   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
 	/* Close the OS handle to the device, but only if it's not
 	 been unplugged. If it's been unplugged, then calling
 	 been unplugged. If it's been unplugged, then calling
 	 IOHIDDeviceClose() will crash. */
 	 IOHIDDeviceClose() will crash. */
-	if (!dev->disconnected) {
+	if (!disconnected) {
 		IOHIDDeviceClose(dev->device_handle, kIOHIDOptionsTypeNone);
 		IOHIDDeviceClose(dev->device_handle, kIOHIDOptionsTypeNone);
 	}
 	}