Home | History | Annotate | Download | only in binder
      1 /*
      2  * Copyright (C) 2005 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #define LOG_TAG "ServiceManager"
     18 
     19 #include <binder/IServiceManager.h>
     20 
     21 #include <utils/Log.h>
     22 #include <binder/IPCThreadState.h>
     23 #ifndef __ANDROID_VNDK__
     24 #include <binder/IPermissionController.h>
     25 #endif
     26 #include <binder/Parcel.h>
     27 #include <cutils/properties.h>
     28 #include <utils/String8.h>
     29 #include <utils/SystemClock.h>
     30 
     31 #include <private/binder/Static.h>
     32 
     33 #include <unistd.h>
     34 
     35 namespace android {
     36 
     37 sp<IServiceManager> defaultServiceManager()
     38 {
     39     if (gDefaultServiceManager != nullptr) return gDefaultServiceManager;
     40 
     41     {
     42         AutoMutex _l(gDefaultServiceManagerLock);
     43         while (gDefaultServiceManager == nullptr) {
     44             gDefaultServiceManager = interface_cast<IServiceManager>(
     45                 ProcessState::self()->getContextObject(nullptr));
     46             if (gDefaultServiceManager == nullptr)
     47                 sleep(1);
     48         }
     49     }
     50 
     51     return gDefaultServiceManager;
     52 }
     53 
     54 #ifndef __ANDROID_VNDK__
     55 // IPermissionController is not accessible to vendors
     56 
     57 bool checkCallingPermission(const String16& permission)
     58 {
     59     return checkCallingPermission(permission, nullptr, nullptr);
     60 }
     61 
     62 static String16 _permission("permission");
     63 
     64 
     65 bool checkCallingPermission(const String16& permission, int32_t* outPid, int32_t* outUid)
     66 {
     67     IPCThreadState* ipcState = IPCThreadState::self();
     68     pid_t pid = ipcState->getCallingPid();
     69     uid_t uid = ipcState->getCallingUid();
     70     if (outPid) *outPid = pid;
     71     if (outUid) *outUid = uid;
     72     return checkPermission(permission, pid, uid);
     73 }
     74 
     75 bool checkPermission(const String16& permission, pid_t pid, uid_t uid)
     76 {
     77     sp<IPermissionController> pc;
     78     gDefaultServiceManagerLock.lock();
     79     pc = gPermissionController;
     80     gDefaultServiceManagerLock.unlock();
     81 
     82     int64_t startTime = 0;
     83 
     84     while (true) {
     85         if (pc != nullptr) {
     86             bool res = pc->checkPermission(permission, pid, uid);
     87             if (res) {
     88                 if (startTime != 0) {
     89                     ALOGI("Check passed after %d seconds for %s from uid=%d pid=%d",
     90                             (int)((uptimeMillis()-startTime)/1000),
     91                             String8(permission).string(), uid, pid);
     92                 }
     93                 return res;
     94             }
     95 
     96             // Is this a permission failure, or did the controller go away?
     97             if (IInterface::asBinder(pc)->isBinderAlive()) {
     98                 ALOGW("Permission failure: %s from uid=%d pid=%d",
     99                         String8(permission).string(), uid, pid);
    100                 return false;
    101             }
    102 
    103             // Object is dead!
    104             gDefaultServiceManagerLock.lock();
    105             if (gPermissionController == pc) {
    106                 gPermissionController = nullptr;
    107             }
    108             gDefaultServiceManagerLock.unlock();
    109         }
    110 
    111         // Need to retrieve the permission controller.
    112         sp<IBinder> binder = defaultServiceManager()->checkService(_permission);
    113         if (binder == nullptr) {
    114             // Wait for the permission controller to come back...
    115             if (startTime == 0) {
    116                 startTime = uptimeMillis();
    117                 ALOGI("Waiting to check permission %s from uid=%d pid=%d",
    118                         String8(permission).string(), uid, pid);
    119             }
    120             sleep(1);
    121         } else {
    122             pc = interface_cast<IPermissionController>(binder);
    123             // Install the new permission controller, and try again.
    124             gDefaultServiceManagerLock.lock();
    125             gPermissionController = pc;
    126             gDefaultServiceManagerLock.unlock();
    127         }
    128     }
    129 }
    130 
    131 #endif //__ANDROID_VNDK__
    132 
    133 // ----------------------------------------------------------------------
    134 
    135 class BpServiceManager : public BpInterface<IServiceManager>
    136 {
    137 public:
    138     explicit BpServiceManager(const sp<IBinder>& impl)
    139         : BpInterface<IServiceManager>(impl)
    140     {
    141     }
    142 
    143     virtual sp<IBinder> getService(const String16& name) const
    144     {
    145         sp<IBinder> svc = checkService(name);
    146         if (svc != nullptr) return svc;
    147 
    148         const bool isVendorService =
    149             strcmp(ProcessState::self()->getDriverName().c_str(), "/dev/vndbinder") == 0;
    150         const long timeout = uptimeMillis() + 5000;
    151         if (!gSystemBootCompleted && !isVendorService) {
    152             // Vendor code can't access system properties
    153             char bootCompleted[PROPERTY_VALUE_MAX];
    154             property_get("sys.boot_completed", bootCompleted, "0");
    155             gSystemBootCompleted = strcmp(bootCompleted, "1") == 0 ? true : false;
    156         }
    157         // retry interval in millisecond; note that vendor services stay at 100ms
    158         const long sleepTime = gSystemBootCompleted ? 1000 : 100;
    159 
    160         int n = 0;
    161         while (uptimeMillis() < timeout) {
    162             n++;
    163             ALOGI("Waiting for service '%s' on '%s'...", String8(name).string(),
    164                 ProcessState::self()->getDriverName().c_str());
    165             usleep(1000*sleepTime);
    166 
    167             sp<IBinder> svc = checkService(name);
    168             if (svc != nullptr) return svc;
    169         }
    170         ALOGW("Service %s didn't start. Returning NULL", String8(name).string());
    171         return nullptr;
    172     }
    173 
    174     virtual sp<IBinder> checkService( const String16& name) const
    175     {
    176         Parcel data, reply;
    177         data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
    178         data.writeString16(name);
    179         remote()->transact(CHECK_SERVICE_TRANSACTION, data, &reply);
    180         return reply.readStrongBinder();
    181     }
    182 
    183     virtual status_t addService(const String16& name, const sp<IBinder>& service,
    184                                 bool allowIsolated, int dumpsysPriority) {
    185         Parcel data, reply;
    186         data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
    187         data.writeString16(name);
    188         data.writeStrongBinder(service);
    189         data.writeInt32(allowIsolated ? 1 : 0);
    190         data.writeInt32(dumpsysPriority);
    191         status_t err = remote()->transact(ADD_SERVICE_TRANSACTION, data, &reply);
    192         return err == NO_ERROR ? reply.readExceptionCode() : err;
    193     }
    194 
    195     virtual Vector<String16> listServices(int dumpsysPriority) {
    196         Vector<String16> res;
    197         int n = 0;
    198 
    199         for (;;) {
    200             Parcel data, reply;
    201             data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
    202             data.writeInt32(n++);
    203             data.writeInt32(dumpsysPriority);
    204             status_t err = remote()->transact(LIST_SERVICES_TRANSACTION, data, &reply);
    205             if (err != NO_ERROR)
    206                 break;
    207             res.add(reply.readString16());
    208         }
    209         return res;
    210     }
    211 };
    212 
    213 IMPLEMENT_META_INTERFACE(ServiceManager, "android.os.IServiceManager");
    214 
    215 }; // namespace android
    216