libusb icon indicating copy to clipboard operation
libusb copied to clipboard

darwin: add missing mutex lock/unlock for claimed_interfaces

Open seanm opened this issue 3 months ago • 4 comments

Existing code comments say that libusb_device_handle.claimed_interfaces is protected by libusb_device_handle.lock. The function ep_to_pipeRef() accesses claimed_interfaces but does not hold the lock.

I examined all 9 callers:

  • darwin_alloc_streams
  • darwin_clear_halt
  • darwin_free_streams
  • darwin_abort_transfers
  • submit_bulk_transfer
  • submit_control_transfer
  • submit_iso_transfer
  • submit_stream_transfer
  • darwin_async_io_callback

and none seem to hold the lock already.

Found with -Wthread-safety.

seanm avatar Sep 06 '25 17:09 seanm

@hjelmn does this look right to you?

seanm avatar Sep 17 '25 13:09 seanm

@osy could you take a look at this?

seanm avatar Sep 19 '25 14:09 seanm

This is a fix for a read race on claimed_interface (not write race) right? It looks fine to me but just a heads up, when I looked at the Darwin backend, I found a lot of read races and just reasoned that all of them would result in eventual errors that is similar to if the device was just hot unplugged.

osy avatar Sep 19 '25 15:09 osy

@osy Yes reading. This change is as a result of a -Wthread-safety compiler warning. According to existing comments:

	/* lock protects claimed_interfaces */
	usbi_mutex_t lock;
	unsigned long claimed_interfaces;

claimed_interfaces should be protected by lock.

seanm avatar Sep 19 '25 17:09 seanm