commit | c20bb681db3fd2d80cbca4477eaf0d3a502ed4c6 | [log] [tgz] |
---|---|---|
author | Frank Li <Frank.Li@nxp.com> | Fri Jan 11 11:56:47 2019 -0600 |
committer | Nathan Hjelm <hjelmn@me.com> | Wed Jan 30 22:38:32 2019 -0700 |
tree | a0b84b7871c47f54d686bfbba6cc7acf90f5f9a8 | |
parent | 91a49831f3b05f6739c4af21aa6ff802cfe3ac71 [diff] |
fix race condition at event_handles event_handles supposed just run at a thread. There are re-entry check at begin. 1: if (usbi_handling_events(ctx)) 2: return LIBUSB_ERROR_BUSY; 3: usbi_stat_event_handle(ctx); this code is hold any lock it is possible two thread check 1 at the same time, then go through to 3. So two threads will run event_handles. above 3 line code should hold event_data_lock to avoid above race condition. 1: usbi_mutex_lock($ctx->event_data_lock); 2: r = 0; 3: if (usbi_handling_events(ctx)) 4: r = LIBUSB_ERROR_BUSY; 5: else 6: usbi_start_event_handling(ctx); 7: usbi_mutex_unlock($ctx->event_data_lock); 8: if(r) 9: return r; check and set in an atomic operations. Closes #520 Signed-off-by: Frank Li <Frank.Li@nxp.com> Signed-off-by: Nathan Hjelm <hjelmn@me.com>
libusb is a library for USB device access from Linux, macOS, Windows, OpenBSD/NetBSD and Haiku userspace. It is written in C (Haiku backend in C++) and licensed under the GNU Lesser General Public License version 2.1 or, at your option, any later version (see COPYING).
libusb is abstracted internally in such a way that it can hopefully be ported to other operating systems. Please see the PORTING file for more information.
libusb homepage: http://libusb.info/
Developers will wish to consult the API documentation: http://api.libusb.info
Use the mailing list for questions, comments, etc: http://mailing-list.libusb.info
(Please use the mailing list rather than mailing developers directly)