From de5084690524a9f01ef3012e8e87b116f65625d4 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Thu, 18 Nov 2021 18:31:36 +0100 Subject: [PATCH] Close process on check success The interruptible version of the function to check process success (sc_process_check_success_intr()) did not accept a close parameter to avoid a race condition. But as the result, the processes were not closed at all. Add a close parameter, and close the process separately to avoid the race condition. --- app/src/adb_tunnel.c | 10 ++++++---- app/src/server.c | 2 +- app/src/util/process_intr.c | 8 +++++++- app/src/util/process_intr.h | 2 +- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/src/adb_tunnel.c b/app/src/adb_tunnel.c index f02eb83e..df5a3d1f 100644 --- a/app/src/adb_tunnel.c +++ b/app/src/adb_tunnel.c @@ -13,27 +13,29 @@ static bool enable_tunnel_reverse(struct sc_intr *intr, const char *serial, uint16_t local_port) { sc_pid pid = adb_reverse(serial, SC_SOCKET_NAME, local_port); - return sc_process_check_success_intr(intr, pid, "adb reverse"); + return sc_process_check_success_intr(intr, pid, "adb reverse", true); } static bool disable_tunnel_reverse(struct sc_intr *intr, const char *serial) { sc_pid pid = adb_reverse_remove(serial, SC_SOCKET_NAME); - return sc_process_check_success_intr(intr, pid, "adb reverse --remove"); + return sc_process_check_success_intr(intr, pid, "adb reverse --remove", + true); } static bool enable_tunnel_forward(struct sc_intr *intr, const char *serial, uint16_t local_port) { sc_pid pid = adb_forward(serial, local_port, SC_SOCKET_NAME); - return sc_process_check_success_intr(intr, pid, "adb forward"); + return sc_process_check_success_intr(intr, pid, "adb forward", true); } static bool disable_tunnel_forward(struct sc_intr *intr, const char *serial, uint16_t local_port) { sc_pid pid = adb_forward_remove(serial, local_port); - return sc_process_check_success_intr(intr, pid, "adb forward --remove"); + return sc_process_check_success_intr(intr, pid, "adb forward --remove", + true); } static bool diff --git a/app/src/server.c b/app/src/server.c index d792364d..82a6af40 100644 --- a/app/src/server.c +++ b/app/src/server.c @@ -114,7 +114,7 @@ push_server(struct sc_intr *intr, const char *serial) { } sc_pid pid = adb_push(serial, server_path, SC_DEVICE_SERVER_PATH); free(server_path); - return sc_process_check_success_intr(intr, pid, "adb push"); + return sc_process_check_success_intr(intr, pid, "adb push", true); } static const char * diff --git a/app/src/util/process_intr.c b/app/src/util/process_intr.c index bb483123..ddf94e97 100644 --- a/app/src/util/process_intr.c +++ b/app/src/util/process_intr.c @@ -2,7 +2,7 @@ bool sc_process_check_success_intr(struct sc_intr *intr, sc_pid pid, - const char *name) { + const char *name, bool close) { if (!sc_intr_set_process(intr, pid)) { // Already interrupted return false; @@ -12,5 +12,11 @@ sc_process_check_success_intr(struct sc_intr *intr, sc_pid pid, bool ret = sc_process_check_success(pid, name, false); sc_intr_set_process(intr, SC_PROCESS_NONE); + + if (close) { + // Close separately + sc_process_close(pid); + } + return ret; } diff --git a/app/src/util/process_intr.h b/app/src/util/process_intr.h index ff0dfc76..a1574ce3 100644 --- a/app/src/util/process_intr.h +++ b/app/src/util/process_intr.h @@ -8,6 +8,6 @@ bool sc_process_check_success_intr(struct sc_intr *intr, sc_pid pid, - const char *name); + const char *name, bool close); #endif