summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ashmemd_client.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/ashmemd_client.cpp b/ashmemd_client.cpp
index 3380209..a9041a0 100644
--- a/ashmemd_client.cpp
+++ b/ashmemd_client.cpp
@@ -17,6 +17,7 @@
#include <android-base/logging.h>
#include <android/ashmemd/IAshmemDeviceService.h>
#include <binder/IServiceManager.h>
+#include <cutils/android_filesystem_config.h>
using android::IBinder;
using android::IServiceManager;
@@ -27,7 +28,25 @@ using android::os::ParcelFileDescriptor;
namespace android {
namespace ashmemd {
+static bool checkBinderAccess() {
+ // Isolated apps are potentially subject to seccomp policy that restricts use of access()
+ // (b/129483782). However, apps always have access to binder, so return true.
+ auto uid = getuid() % AID_USER;
+ if (AID_ISOLATED_START <= uid && uid <= AID_ISOLATED_END) {
+ return true;
+ }
+ if (access("/dev/binder", R_OK | W_OK) == 0) {
+ return true;
+ }
+ return false;
+}
+
sp<IAshmemDeviceService> getAshmemService() {
+ // Calls to defaultServiceManager() crash the process if it doesn't have appropriate
+ // binder permissions. Check these permissions proactively.
+ if (!checkBinderAccess()) {
+ return nullptr;
+ }
sp<IServiceManager> sm = android::defaultServiceManager();
sp<IBinder> binder = sm->checkService(String16("ashmem_device_service"));
return interface_cast<IAshmemDeviceService>(binder);