aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJayant Chowdhary <jchowdhary@google.com>2017-09-01 16:29:44 -0700
committerJayant Chowdhary <jchowdhary@google.com>2017-09-07 14:25:50 -0700
commit1e52871773505edf70d10a3af7b003e9320ef6a3 (patch)
tree95171ade4f985c2cb17b6697a2e1d022da8593a3
parent917d34a84fe9895cb7acfd7246e366a039de103d (diff)
downloadbionic-1e52871773505edf70d10a3af7b003e9320ef6a3.tar.gz
For devices which are not treble enabled, return the system shell.
For treble enabled devices, still return the appropriate shell depending on whether the process is a vendor process or a system one. Test: Manual testing: on a bullhead device, ran test programs from /vendor/bin which used popen() and system(). The calls succeeded. Bug: 65054230 Bug: 64516799 Change-Id: I15dfdbb107cfca7c0f92f337c9bb46b9876eb38e
-rw-r--r--libc/Android.bp6
-rw-r--r--libc/bionic/__bionic_get_shell_path.cpp20
2 files changed, 18 insertions, 8 deletions
diff --git a/libc/Android.bp b/libc/Android.bp
index b5229cbbf..a0d1f237c 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -1509,7 +1509,11 @@ cc_library_static {
srcs: ["bionic/mmap.cpp"],
},
},
-
+ product_variables: {
+ treble: {
+ cflags: ["-D__ANDROID_TREBLE__"],
+ },
+ },
cppflags: ["-Wold-style-cast"],
local_include_dirs: ["stdio"],
include_dirs: ["bionic/libstdc++/include"],
diff --git a/libc/bionic/__bionic_get_shell_path.cpp b/libc/bionic/__bionic_get_shell_path.cpp
index 477fa4a1b..41162e93e 100644
--- a/libc/bionic/__bionic_get_shell_path.cpp
+++ b/libc/bionic/__bionic_get_shell_path.cpp
@@ -31,18 +31,24 @@
#include <sys/cdefs.h>
#include <unistd.h>
-__LIBC_HIDDEN__ static const char* __libc_system_sh = "/system/bin/sh";
-__LIBC_HIDDEN__ static const char* __libc_vendor_sh = "/vendor/bin/sh";
+#define VENDOR_PREFIX "/vendor/"
static const char* init_sh_path() {
+ /* If the device is not treble enabled, return the path to the system shell.
+ * Vendor code, on non-treble enabled devices could use system() / popen()
+ * with relative paths for executables on /system. Since /system will not be
+ * in $PATH for the vendor shell, simply return the system shell.
+ */
+
+#ifdef __ANDROID_TREBLE__
/* look for /system or /vendor prefix */
- char exe_path[7];
+ char exe_path[strlen(VENDOR_PREFIX)];
ssize_t len = readlink("/proc/self/exe", exe_path, sizeof(exe_path));
- if (len != -1 && !strncmp(exe_path, __libc_vendor_sh, sizeof(exe_path))) {
- return __libc_vendor_sh;
+ if (len != -1 && !strncmp(exe_path, VENDOR_PREFIX, strlen(VENDOR_PREFIX))) {
+ return "/vendor/bin/sh";
}
-
- return __libc_system_sh;
+#endif
+ return "/system/bin/sh";
}
__LIBC_HIDDEN__ extern "C" const char* __bionic_get_shell_path() {