mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-20 05:13:22 -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) {
|
void CloseProxmark(void) {
|
||||||
conn.run = false;
|
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);
|
pthread_join(USB_communication_thread, NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (sp) {
|
if (sp) {
|
||||||
uart_close(sp);
|
uart_close(sp);
|
||||||
|
@ -351,6 +364,7 @@ void CloseProxmark(void) {
|
||||||
// Clean up our state
|
// Clean up our state
|
||||||
sp = NULL;
|
sp = NULL;
|
||||||
serial_port_name = NULL;
|
serial_port_name = NULL;
|
||||||
|
memset(&USB_communication_thread, 0, sizeof(pthread_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue