From 2bb7f7e327df13f288b2b98a71bb390c516cc982 Mon Sep 17 00:00:00 2001 From: Michael Farrell Date: Mon, 4 Jun 2018 21:54:41 +1000 Subject: [PATCH] Fixes a double-free issue in CloseProxmark: (#617) - CloseProxmark now clears global state. - CloseProxmark now checks for a non-null serial_port before calling uart_close, to avoid unintentional double-free'ing serial_port. - main now calls CloseProxmark once. --- client/comms.c | 10 +++++++++- client/proxmark3.c | 4 ---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/client/comms.c b/client/comms.c index eeaff79c..be0cfd10 100644 --- a/client/comms.c +++ b/client/comms.c @@ -334,13 +334,21 @@ bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode) void CloseProxmark(void) { conn.run = false; pthread_join(USB_communication_thread, NULL); - uart_close(sp); + + if (sp) { + uart_close(sp); + } + #ifdef __linux__ // Fix for linux, it seems that it is extremely slow to release the serial port file descriptor /dev/* if (serial_port_name) { unlink(serial_port_name); } #endif + + // Clean up our state + sp = NULL; + serial_port_name = NULL; } diff --git a/client/proxmark3.c b/client/proxmark3.c index 40c46613..6fb066e8 100644 --- a/client/proxmark3.c +++ b/client/proxmark3.c @@ -131,10 +131,6 @@ main_loop(char *script_cmds_file, char *script_cmd, bool usb_present) { } write_history(".history"); - - if (usb_present) { - CloseProxmark(); - } if (script_file) { fclose(script_file); -- 2.39.2