From 8bb80471b93a080849e30f190c297cbd365c4254 Mon Sep 17 00:00:00 2001
From: Todd Kennedy <toddke@google.com>
Date: Wed, 2 Aug 2017 07:27:44 -0700
Subject: [PATCH] Allow PackageManager to create a new service

A new API [getNamesForUids] was recently added to the PackageManager
and this API needs to be accessible to native code. However, there
were two constraints:
1) Instead of hand-rolling the binder, we wanted to auto generate
the bindings directly from the AIDL compiler.
2) We didn't want to expose/annotate all 180+ PackageManager APIs
when only a single API is needed.
So, we chose to create a parallel API that can be used explicitly
for native bindings without exposing the entirety of the
PackageManager.

Bug: 62805090
Test: Manual
Test: Create a native application that calls into the new service
Test: See the call works and data and returned
Change-Id: I0d469854eeddfa1a4fd04b5c53b7a71ba3ab1f41
---
 prebuilts/api/26.0/26.0.ignore.cil | 1 +
 private/service_contexts           | 1 +
 private/storaged.te                | 3 +++
 public/service.te                  | 1 +
 4 files changed, 6 insertions(+)

diff --git a/prebuilts/api/26.0/26.0.ignore.cil b/prebuilts/api/26.0/26.0.ignore.cil
index e713bc1ca..f027478dc 100644
--- a/prebuilts/api/26.0/26.0.ignore.cil
+++ b/prebuilts/api/26.0/26.0.ignore.cil
@@ -13,6 +13,7 @@
     kmsg_debug_device
     mediaprovider_tmpfs
     netd_stable_secret_prop
+    package_native_service
     sysfs_fs_ext4_features
     system_net_netd_hwservice
     timezone_service
diff --git a/private/service_contexts b/private/service_contexts
index c6c7ec081..10613caec 100644
--- a/private/service_contexts
+++ b/private/service_contexts
@@ -108,6 +108,7 @@ oem_lock                                  u:object_r:oem_lock_service:s0
 otadexopt                                 u:object_r:otadexopt_service:s0
 overlay                                   u:object_r:overlay_service:s0
 package                                   u:object_r:package_service:s0
+package_native                            u:object_r:package_native_service:s0
 permission                                u:object_r:permission_service:s0
 persistent_data_block                     u:object_r:persistent_data_block_service:s0
 phone_msim                                u:object_r:radio_service:s0
diff --git a/private/storaged.te b/private/storaged.te
index d5abd7314..20377e046 100644
--- a/private/storaged.te
+++ b/private/storaged.te
@@ -43,6 +43,9 @@ binder_call(storaged, healthd)
 # Implements a dumpsys interface.
 allow storaged dumpstate:fd use;
 
+# use a subset of the package manager service
+allow storaged package_native_service:service_manager find;
+
 # Kernel does extra check on CAP_DAC_OVERRIDE for libbinder when storaged is
 # running as root. See b/35323867 #3.
 dontaudit storaged self:capability dac_override;
diff --git a/public/service.te b/public/service.te
index 5722e25fb..6955755f8 100644
--- a/public/service.te
+++ b/public/service.te
@@ -101,6 +101,7 @@ type oem_lock_service, system_api_service, system_server_service, service_manage
 type otadexopt_service, system_server_service, service_manager_type;
 type overlay_service, system_api_service, system_server_service, service_manager_type;
 type package_service, app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;
+type package_native_service, system_server_service, service_manager_type;
 type permission_service, app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;
 type persistent_data_block_service, system_api_service, system_server_service, service_manager_type;
 type pinner_service, system_server_service, service_manager_type;
-- 
GitLab