Allow cppreopts to work with selinux
(cherry picked from commit d3edd6b577c1e40834af69420bd77b60c359ef8e)
Bug: 29278988
Change-Id: I199572377a6b5c33116c718a545159ddcf50df30
diff --git a/cppreopts.te b/cppreopts.te
new file mode 100644
index 0000000..66df7ee
--- /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 7da2340..78f1dea 100644
--- a/domain.te
+++ b/domain.te
@@ -396,6 +396,7 @@
-zygote
-installd
-postinstall_dexopt
+ -cppreopts
-dex2oat
} dalvikcache_data_file:file no_w_file_perms;
@@ -404,6 +405,7 @@
-init
-installd
-postinstall_dexopt
+ -cppreopts
-dex2oat
-zygote
} dalvikcache_data_file:dir no_w_dir_perms;
diff --git a/file_contexts b/file_contexts
index 8106bd2..e92aec8 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(d)? u:object_r:dex2oat_exec:s0
# patchoat executable has (essentially) the same requirements as dex2oat.
diff --git a/init.te b/init.te
index 0a96314..1512d0b 100644
--- a/init.te
+++ b/init.te
@@ -56,7 +56,7 @@
# 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 0000000..49df647
--- /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 90c2912..2802c0d 100644
--- a/property.te
+++ b/property.te
@@ -33,6 +33,7 @@
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 9190831..2ae1bb0 100644
--- a/property_contexts
+++ b/property_contexts
@@ -21,6 +21,7 @@
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 05e929e..4b7067b 100644
--- a/system_server.te
+++ b/system_server.te
@@ -354,6 +354,9 @@
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;