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 1ac33f1a46b52327036acba016b9c3d531d8506f..471dc53484c84b7a5bff0f3d6634e96010b06faa 100644 --- a/domain.te +++ b/domain.te @@ -378,6 +378,7 @@ neverallow { -zygote -installd -postinstall_dexopt + -cppreopts -dex2oat } dalvikcache_data_file:file no_w_file_perms; @@ -386,6 +387,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 33b840b63bceedd71d3877ec401b6a55d082e088..3f1468eb86511083d85c4c5c7f59f2a201cc56ef 100644 --- a/file_contexts +++ b/file_contexts @@ -203,6 +203,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 6197c3908f68effff379076d3e70054716fa5f17..9bc78d17345cae4e306d45ab3398a3e8f99aa52d 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 83208cfe936d12bf25d9d39769545b7b2c7e012e..64dbdef76ddbc167241776f15dfc634a71139af6 100644 --- a/property.te +++ b/property.te @@ -31,6 +31,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 dacf2cb22f8850b93d68fd051687d7af2b11749a..1ab1f10739aeaba0999e6168511f1b3f695b79f4 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 e74f58cebe7fe6eb7898e56d27abcd9ff8077e60..fcaccdb4986adc72a55e682b7ef0068caec31796 100644 --- a/system_server.te +++ b/system_server.te @@ -347,6 +347,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;