From 9be48af56bb1fa3d738ea0b5ac5271a9df136718 Mon Sep 17 00:00:00 2001 From: jackyzy823 Date: Wed, 11 Sep 2024 10:52:07 +0800 Subject: [PATCH 1/3] Change working directory before calling pcapd under su. Some implementation of Android su will reset environment variables, so the current working directory will not be preserved. To make sure the creation of pid file and log file, change working directory manually. --- app/src/main/jni/common/utils.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/jni/common/utils.c b/app/src/main/jni/common/utils.c index 71507c61..1de33f02 100644 --- a/app/src/main/jni/common/utils.c +++ b/app/src/main/jni/common/utils.c @@ -240,6 +240,13 @@ int start_subprocess(const char *prog, const char *args, bool as_root, int* out_ close(in_p[0]); // write "su" command input + if(as_root) { + char* cwd = getcwd(NULL, 0); + log_d("start_subprocess[%d]: cd %s", pid, cwd); + write(in_p[1], "cd ",3); + write(in_p[1], cwd, strlen(cwd)); + write(in_p[1], "\n", 1); + } log_d("start_subprocess[%d]: %s %s", pid, prog, args); write(in_p[1], prog, strlen(prog)); write(in_p[1], " ", 1); From 50812d1de820cd60cb6870649008878ea6ef6ad0 Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Wed, 11 Sep 2024 18:38:50 +0200 Subject: [PATCH 2/3] Add safety checks on getcwd and free memory --- app/src/main/jni/common/utils.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/app/src/main/jni/common/utils.c b/app/src/main/jni/common/utils.c index 1de33f02..fb53dff4 100644 --- a/app/src/main/jni/common/utils.c +++ b/app/src/main/jni/common/utils.c @@ -239,14 +239,22 @@ int start_subprocess(const char *prog, const char *args, bool as_root, int* out_ close(in_p[0]); - // write "su" command input + // write "su"/"sh" command input if(as_root) { + // Some su implementations (e.g. Android-x86) change the PWD when activated, + // cd to the cache dir to ensure that the UNIX socket can be found by pcapd char* cwd = getcwd(NULL, 0); - log_d("start_subprocess[%d]: cd %s", pid, cwd); - write(in_p[1], "cd ",3); - write(in_p[1], cwd, strlen(cwd)); - write(in_p[1], "\n", 1); + if (cwd) { + log_d("start_subprocess[%d]: cd %s", pid, cwd); + write(in_p[1], "cd \"",4); + write(in_p[1], cwd, strlen(cwd)); + write(in_p[1], "\"\n", 2); + free(cwd); + } else + log_w("start_subprocess[%d]: getcwd failed[%d], non-magisk su may fail", + pid, errno, strerror(errno)); } + log_d("start_subprocess[%d]: %s %s", pid, prog, args); write(in_p[1], prog, strlen(prog)); write(in_p[1], " ", 1); From ac3ce3a75f712c115a7c0595141e275e1bbf2bc0 Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Wed, 11 Sep 2024 18:46:20 +0200 Subject: [PATCH 3/3] Fix missing format argument --- app/src/main/jni/common/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/jni/common/utils.c b/app/src/main/jni/common/utils.c index fb53dff4..f2da4dc8 100644 --- a/app/src/main/jni/common/utils.c +++ b/app/src/main/jni/common/utils.c @@ -251,7 +251,7 @@ int start_subprocess(const char *prog, const char *args, bool as_root, int* out_ write(in_p[1], "\"\n", 2); free(cwd); } else - log_w("start_subprocess[%d]: getcwd failed[%d], non-magisk su may fail", + log_w("start_subprocess[%d]: getcwd failed[%d]: %s - non-magisk 'su' may fail", pid, errno, strerror(errno)); }