diff --git a/cppreopts.te b/cppreopts.te new file mode 100644 index 0000000000000000000000000000000000000000..66df7eea4148c577faf580547d08f35f4eded281 --- /dev/null +++ b/cppreopts.te @@ -0,0 +1,28 @@ +# cppreopts +# +# This command copies preopted files from the system_b partition to the data +# partition. This domain ensures that we are only copying into specific +# directories. + +type cppreopts, domain, mlstrustedsubject; +type cppreopts_exec, exec_type, file_type; + +# Technically not a daemon but we do want the transition from init domain to +# cppreopts to occur. +init_daemon_domain(cppreopts) + +domain_auto_trans(cppreopts, preopt2cachename_exec, preopt2cachename); + +# Allow cppreopts copy files into the dalvik-cache +allow cppreopts dalvikcache_data_file:dir { add_name remove_name search write }; +allow cppreopts dalvikcache_data_file:file { create getattr open read rename write }; + +# Allow cppreopts to execute itself using #!/system/bin/sh +allow cppreopts shell_exec:file rx_file_perms; + +# Allow us to run find on /postinstall +allow cppreopts system_file:dir { open read }; + +# Allow running the cp command using cppreopts permissions. Needed so we can +# write into dalvik-cache +allow cppreopts toolbox_exec:file rx_file_perms; diff --git a/domain.te b/domain.te index b0892b7377e192f9cea25853313b3701b70b3170..1d8576ae6403b36167686cb54d5f4e76eb23f05a 100644 --- a/domain.te +++ b/domain.te @@ -382,6 +382,7 @@ neverallow { -zygote -installd -postinstall_dexopt + -cppreopts -dex2oat } dalvikcache_data_file:file no_w_file_perms; @@ -390,6 +391,7 @@ neverallow { -init -installd -postinstall_dexopt + -cppreopts -dex2oat -zygote } dalvikcache_data_file:dir no_w_dir_perms; diff --git a/file_contexts b/file_contexts index 6688741d00e5830cbc2cbf898a6441e0aa0bcb7c..6df6f6935222194a376f868bf5335f54c14faeeb 100644 --- a/file_contexts +++ b/file_contexts @@ -199,6 +199,8 @@ /system/bin/update_verifier u:object_r:update_verifier_exec:s0 /system/bin/logwrapper u:object_r:system_file:s0 /system/bin/vdc u:object_r:vdc_exec:s0 +/system/bin/cppreopts.sh u:object_r:cppreopts_exec:s0 +/system/bin/preopt2cachename u:object_r:preopt2cachename_exec:s0 /system/bin/install-recovery.sh u:object_r:install_recovery_exec:s0 /system/bin/dex2oat u:object_r:dex2oat_exec:s0 # patchoat executable has (essentially) the same requirements as dex2oat. diff --git a/init.te b/init.te index d30bfa941f7dde8ebc85afd6b2953dba344f161d..6f39f7f7e4c9fd61708b176a93cfe92038a9091f 100644 --- a/init.te +++ b/init.te @@ -44,7 +44,7 @@ allow init self:capability sys_admin; # Create and mount on directories in /. allow init rootfs:dir create_dir_perms; -allow init { rootfs cache_file cgroup storage_file system_data_file system_file }:dir mounton; +allow init { rootfs cache_file cgroup storage_file system_data_file system_file postinstall_mnt_dir }:dir mounton; # Mount on /dev/usb-ffs/adb. allow init device:dir mounton; diff --git a/preopt2cachename.te b/preopt2cachename.te new file mode 100644 index 0000000000000000000000000000000000000000..49df647250f0f26cfd7b26052b0effc88f67c0c2 --- /dev/null +++ b/preopt2cachename.te @@ -0,0 +1,13 @@ +# preopt2cachename executable +# +# This executable translates names from the preopted versions the build system +# creates to the names the runtime expects in the data directory. +type preopt2cachename, domain; +type preopt2cachename_exec, exec_type, file_type; + +# Allow write to stdout. +allow preopt2cachename cppreopts:fd use; +allow preopt2cachename cppreopts:fifo_file { getattr read write }; + +# Allow write to logcat. +allow preopt2cachename proc_net:file r_file_perms; diff --git a/property.te b/property.te index 5075e29f7fb19e1567872a8d72cb94d7f053c4fd..af7013f4c9526725dc68f2c798dc47ad2430e6ef 100644 --- a/property.te +++ b/property.te @@ -32,6 +32,7 @@ type security_prop, property_type, core_property_type; type bluetooth_prop, property_type, core_property_type; type pan_result_prop, property_type, core_property_type; type powerctl_prop, property_type, core_property_type; +type cppreopt_prop, property_type, core_property_type; type nfc_prop, property_type, core_property_type; type dalvik_prop, property_type, core_property_type; type config_prop, property_type, core_property_type; diff --git a/property_contexts b/property_contexts index 7e5bab605b48fc4d6291a4fbd289b7c55d885664..2326fa8070df2bea5692b8250a69835ffca2fb75 100644 --- a/property_contexts +++ b/property_contexts @@ -21,6 +21,7 @@ ro.runtime. u:object_r:system_prop:s0 hw. u:object_r:system_prop:s0 ro.hw. u:object_r:system_prop:s0 sys. u:object_r:system_prop:s0 +sys.cppreopt u:object_r:cppreopt_prop:s0 sys.powerctl u:object_r:powerctl_prop:s0 sys.usb.ffs. u:object_r:ffs_prop:s0 service. u:object_r:system_prop:s0 diff --git a/system_server.te b/system_server.te index 77e1436b195fcde743e85300c091c1d1cce59d40..a8ab38304eb9785bf80183f924fc826abb066dff 100644 --- a/system_server.te +++ b/system_server.te @@ -340,6 +340,9 @@ userdebug_or_eng(`set_prop(system_server, wifi_log_prop)') set_prop(system_server, ctl_default_prop) set_prop(system_server, ctl_bugreport_prop) +# cppreopt property +set_prop(system_server, cppreopt_prop) + # Create a socket for receiving info from wpa. type_transition system_server wifi_data_file:sock_file system_wpa_socket; type_transition system_server wpa_socket:sock_file system_wpa_socket;