OSDN Git Service

install copy of shell in vendor partition
authorSandeep Patil <sspatil@google.com>
Thu, 13 Apr 2017 01:02:50 +0000 (18:02 -0700)
committerSandeep Patil <sspatil@google.com>
Wed, 21 Jun 2017 21:21:30 +0000 (14:21 -0700)
This is to be used by vendor processes. Particularly, vendor shell
scripts that get launched as init services. The shell is restricted from
running as interactive mode in SEPolicy. Unless it is launched from rooted
system shell. The change also adds the ability to override the default
$PATH regardless of the environment.

Bug: 36463595
Test: Boot sailfish with new shell and ensure all init services exit
      with status 0

Merged-In: I1eaf2c8a8f6905caf00d53e067add67eaea00e09
Change-Id: I1eaf2c8a8f6905caf00d53e067add67eaea00e09
Signed-off-by: Sandeep Patil <sspatil@google.com>
(cherry picked from commit c2036115102d80c026b70846812a42204522f9ac)

Android.mk
mkshrc_vendor [new file with mode: 0644]
src/main.c

index 5e7c633..5e96b67 100644 (file)
@@ -24,32 +24,22 @@ LOCAL_MODULE := sh
 LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk
 
 # mksh source files
-LOCAL_SRC_FILES := \
+MKSH_SRC_FILES := \
     src/lalloc.c src/edit.c src/eval.c src/exec.c \
     src/expr.c src/funcs.c src/histrap.c src/jobs.c \
     src/lex.c src/main.c src/misc.c src/shf.c \
     src/syn.c src/tree.c src/var.c
 
-LOCAL_SYSTEM_SHARED_LIBRARIES := libc
-
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/src
-
-# Additional flags first...
-LOCAL_CFLAGS += \
-    -DMKSH_DEFAULT_PROFILEDIR=\"/system/etc\" \
-    -DMKSHRC_PATH=\"/system/etc/mkshrc\" \
-    -DMKSH_DEFAULT_EXECSHELL=\"/system/bin/sh\" \
-    -DMKSH_DEFAULT_TMPDIR=\"/data/local\" \
+MKSH_INCLUDES := $(LOCAL_PATH)/src
 
-# ...then from Makefrag.inc: CFLAGS...
-LOCAL_CFLAGS += \
+MKSH_CFLAGS += \
     -Wno-deprecated-declarations \
     -fno-asynchronous-unwind-tables \
     -fno-strict-aliasing \
     -fstack-protector -fwrapv \
 
 # ...and CPPFLAGS.
-LOCAL_CFLAGS += \
+MKSH_CFLAGS += \
     -DDEBUG_LEAKS -DMKSH_ASSUME_UTF8 \
     -DMKSH_DONT_EMIT_IDSTRING \
     -DMKSH_BUILDSH \
@@ -85,4 +75,63 @@ LOCAL_CFLAGS += \
     -DHAVE_SYS_ERRLIST_DECL=0 -DHAVE_SYS_SIGLIST_DECL=1 \
     -DHAVE_PERSISTENT_HISTORY=0 -DMKSH_BUILD_R=551
 
+LOCAL_SRC_FILES := $(MKSH_SRC_FILES)
+
+LOCAL_SYSTEM_SHARED_LIBRARIES := libc
+
+LOCAL_C_INCLUDES := $(MKSH_INCLUDES)
+
+# Additional flags first...
+LOCAL_CFLAGS += \
+    -DMKSH_DEFAULT_PROFILEDIR=\"/system/etc\" \
+    -DMKSHRC_PATH=\"/system/etc/mkshrc\" \
+    -DMKSH_DEFAULT_EXECSHELL=\"/system/bin/sh\" \
+    -DMKSH_DEFAULT_TMPDIR=\"/data/local\" \
+
+LOCAL_CFLAGS += $(MKSH_CFLAGS)
+
 include $(BUILD_EXECUTABLE)
+
+ifeq ($(PRODUCT_FULL_TREBLE),true)
+# /vendor/etc/mkshrc
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := mkshrc_vendor
+LOCAL_MODULE_STEM := mkshrc
+LOCAL_MODULE_CLASS := ETC
+LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_ETC)
+LOCAL_SRC_FILES := $(LOCAL_MODULE)
+include $(BUILD_PREBUILT)
+
+# /vendor/bin/sh
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := sh_vendor
+LOCAL_MODULE_STEM := sh
+LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk
+LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES)
+
+# mksh source files
+LOCAL_SRC_FILES := $(MKSH_SRC_FILES)
+
+LOCAL_STATIC_LIBRARIES := libc
+
+LOCAL_C_INCLUDES := $(MKSH_INCLUDES)
+
+# Additional flags first...
+LOCAL_CFLAGS += \
+    -DMKSH_DEFAULT_PROFILEDIR=\"/vendor/etc\" \
+    -DMKSHRC_PATH=\"/vendor/etc/mkshrc\" \
+    -DMKSH_DEFAULT_EXECSHELL=\"/vendor/bin/sh\" \
+    -DMKSH_DEFPATH_OVERRIDE=\"/vendor/bin:/vendor/xbin\" \
+
+LOCAL_CFLAGS += $(MKSH_CFLAGS)
+
+LOCAL_FORCE_STATIC_EXECUTABLE := true
+
+include $(BUILD_EXECUTABLE)
+endif
+
+MKSH_SRC_FILES:=
+MKSH_CFLAGS:=
+MKSH_INCLUDES:=
diff --git a/mkshrc_vendor b/mkshrc_vendor
new file mode 100644 (file)
index 0000000..27d3982
--- /dev/null
@@ -0,0 +1,20 @@
+# Copyright (c) 2010, 2012, 2013, 2014
+#      Thorsten Glaser <tg@mirbsd.org>
+# This file is provided under the same terms as mksh.
+#-
+# Minimal /system/etc/mkshrc for Android
+#
+# Support: https://launchpad.net/mksh
+
+: ${HOSTNAME:=$(getprop ro.product.device)}
+: ${HOSTNAME:=android}
+export HOSTNAME
+
+if (( USER_ID )); then PS1='$'; else PS1='#'; fi
+PS4='[$EPOCHREALTIME] '; PS1='${|
+       local e=$?
+
+       (( e )) && REPLY+="$e|"
+
+       return $e
+}$HOSTNAME:${PWD:-?} '"$PS1 "
index a556d5d..1286b07 100644 (file)
@@ -407,6 +407,12 @@ main_init(int argc, const char *argv[], Source **sp, struct block **lp)
                }
        }
 
+       /* override default PATH regardless of environment */
+#ifdef MKSH_DEFPATH_OVERRIDE
+        vp = global(TPATH);
+        setstr(vp, MKSH_DEFPATH_OVERRIDE, KSH_RETURN_ERROR);
+#endif
+
        /* for security */
        typeset("IFS= \t\n", 0, 0, 0, 0);