Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8f00151c authored by Gloria Wang's avatar Gloria Wang
Browse files

Fix for bug 4371230.

- Generate unique ID for each DrmManagerClient in native side
- Fix the bug where multiple clients could use the same ID
- Return the correct unique ID back to Java
- Add a flag in the unique ID to separate native client and Java client

Change-Id: Ia4574b6b0a526f2335a65380975dc62f9a6e7f9b
parent 60c93010
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -110,11 +110,11 @@ static void clearDecryptHandle(DecryptHandle* handle) {
    handle->extendedData.clear();
}

int BpDrmManagerService::addUniqueId(int uniqueId) {
int BpDrmManagerService::addUniqueId(bool isNative) {
    LOGV("add uniqueid");
    Parcel data, reply;
    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    data.writeInt32(uniqueId);
    data.writeInt32(isNative);
    remote()->transact(ADD_UNIQUEID, data, &reply);
    return reply.readInt32();
}
+32 −22
Original line number Diff line number Diff line
@@ -49,16 +49,24 @@ DrmManager::~DrmManager() {

}

int DrmManager::addUniqueId(int uniqueId) {
int DrmManager::addUniqueId(bool isNative) {
    Mutex::Autolock _l(mLock);
    if (0 == uniqueId) {

    int temp = 0;
    bool foundUniqueId = false;
    const int size = mUniqueIdVector.size();
    const int uniqueIdRange = 0xfff;
    int maxLoopTimes = (uniqueIdRange - 1) / 2;
    srand(time(NULL));

    while (!foundUniqueId) {
            const int size = mUniqueIdVector.size();
            temp = rand() % 100;
        temp = rand() & uniqueIdRange;

        if (isNative) {
            // set a flag to differentiate DrmManagerClient
            // created from native side and java side
            temp |= 0x1000;
        }

        int index = 0;
        for (; index < size; ++index) {
@@ -70,11 +78,13 @@ int DrmManager::addUniqueId(int uniqueId) {
        if (index == size) {
            foundUniqueId = true;
        }

        maxLoopTimes --;
        LOG_FATAL_IF(maxLoopTimes <= 0, "cannot find an unique ID for this session");
    }
        uniqueId = temp;
    }
    mUniqueIdVector.push(uniqueId);
    return uniqueId;

    mUniqueIdVector.push(temp);
    return temp;
}

void DrmManager::removeUniqueId(int uniqueId) {
+2 −2
Original line number Diff line number Diff line
@@ -78,8 +78,8 @@ DrmManagerService::~DrmManagerService() {
    delete mDrmManager; mDrmManager = NULL;
}

int DrmManagerService::addUniqueId(int uniqueId) {
    return mDrmManager->addUniqueId(uniqueId);
int DrmManagerService::addUniqueId(bool isNative) {
    return mDrmManager->addUniqueId(isNative);
}

void DrmManagerService::removeUniqueId(int uniqueId) {
+1 −1
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ using namespace android;

DrmManagerClient::DrmManagerClient():
        mUniqueId(0), mDrmManagerClientImpl(NULL) {
    mDrmManagerClientImpl = DrmManagerClientImpl::create(&mUniqueId);
    mDrmManagerClientImpl = DrmManagerClientImpl::create(&mUniqueId, true);
    mDrmManagerClientImpl->addClient(mUniqueId);
}

+4 −7
Original line number Diff line number Diff line
@@ -33,13 +33,10 @@ sp<IDrmManagerService> DrmManagerClientImpl::sDrmManagerService;
sp<DrmManagerClientImpl::DeathNotifier> DrmManagerClientImpl::sDeathNotifier;
const String8 DrmManagerClientImpl::EMPTY_STRING("");

DrmManagerClientImpl* DrmManagerClientImpl::create(int* pUniqueId) {
    if (0 == *pUniqueId) {
        int uniqueId = getDrmManagerService()->addUniqueId(*pUniqueId);
        *pUniqueId = uniqueId;
    } else {
        getDrmManagerService()->addUniqueId(*pUniqueId);
    }
DrmManagerClientImpl* DrmManagerClientImpl::create(
        int* pUniqueId, bool isNative) {
    *pUniqueId = getDrmManagerService()->addUniqueId(isNative);

    return new DrmManagerClientImpl();
}

Loading