mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-19 21:03:23 -07:00
FIX: crash on Bionic libc if CloseProxmark is called twice. (#672)
In Android O and later, if an invalid pthread_t is passed to pthread_join,
it calls fatal().
ed16b344e7/libc/bionic/pthread_internal.cpp (L116-L128)
This patch addresses it by:
1. Always memset(0) on USB_communications_thread at the end of
CloseProxmark.
2. On Bionic, only call pthread_join on USB_communications_thread if it is
not equal to 0.
This commit is contained in:
parent
11146fc1e1
commit
7b2cd970ec
1 changed files with 14 additions and 0 deletions
|
@ -333,7 +333,20 @@ bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode)
|
|||
|
||||
void CloseProxmark(void) {
|
||||
conn.run = false;
|
||||
|
||||
#ifdef __BIONIC__
|
||||
// In Android O and later, if an invalid pthread_t is passed to pthread_join, it calls fatal().
|
||||
// https://github.com/aosp-mirror/platform_bionic/blob/ed16b344e75f422fb36fbfd91fb30de339475880/libc/bionic/pthread_internal.cpp#L116-L128
|
||||
//
|
||||
// In Bionic libc, pthread_t is an integer.
|
||||
|
||||
if (USB_communication_thread != 0) {
|
||||
pthread_join(USB_communication_thread, NULL);
|
||||
}
|
||||
#else
|
||||
// pthread_t is a struct on other libc, treat as an opaque memory reference
|
||||
pthread_join(USB_communication_thread, NULL);
|
||||
#endif
|
||||
|
||||
if (sp) {
|
||||
uart_close(sp);
|
||||
|
@ -351,6 +364,7 @@ void CloseProxmark(void) {
|
|||
// Clean up our state
|
||||
sp = NULL;
|
||||
serial_port_name = NULL;
|
||||
memset(&USB_communication_thread, 0, sizeof(pthread_t));
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue