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

Commit 3b8a9ed5 authored by Edwin Wong's avatar Edwin Wong
Browse files

Check for nullptr IMemory.

mapMemory can return a nullptr, must check for nullptr
IMemory.

Test: Play Movies (stream and pin movies)
Test: VtsHalDrmV1_0TargetTest

bug: 38386082
Change-Id: I0766380a5843415ef0260c26bd21d4b4051b20ea
parent f706af8d
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -51,7 +51,11 @@ namespace implementation {

    Return<void> CryptoPlugin::setSharedBufferBase(const hidl_memory& base,
            uint32_t bufferId) {
        mSharedBufferMap[bufferId] = mapMemory(base);
        sp<IMemory> hidlMemory = mapMemory(base);
        ALOGE_IF(hidlMemory == nullptr, "mapMemory returns nullptr");

        // allow mapMemory to return nullptr
        mSharedBufferMap[bufferId] = hidlMemory;
        return Void();
    }

@@ -107,6 +111,10 @@ namespace implementation {

        AString detailMessage;
        sp<IMemory> sourceBase = mSharedBufferMap[source.bufferId];
        if (sourceBase == nullptr) {
            _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, 0, "source is a nullptr");
            return Void();
        }

        if (source.offset + offset + source.size > sourceBase->getSize()) {
            _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, 0, "invalid buffer size");
@@ -121,6 +129,11 @@ namespace implementation {
        if (destination.type == BufferType::SHARED_MEMORY) {
            const SharedBuffer& destBuffer = destination.nonsecureMemory;
            sp<IMemory> destBase = mSharedBufferMap[destBuffer.bufferId];
            if (destBase == nullptr) {
                _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, 0, "destination is a nullptr");
                return Void();
            }

            if (destBuffer.offset + destBuffer.size > destBase->getSize()) {
                _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, 0, "invalid buffer size");
                return Void();
+11 −10
Original line number Diff line number Diff line
@@ -94,10 +94,10 @@ class DrmHalClearkeyFactoryTest : public ::testing::VtsHalHidlTargetTestBase {

        drmFactory =
                ::testing::VtsHalHidlTargetTestBase::getService<IDrmFactory>();
        ASSERT_NE(drmFactory, nullptr);
        ASSERT_NE(nullptr, drmFactory.get());
        cryptoFactory =
                ::testing::VtsHalHidlTargetTestBase::getService<ICryptoFactory>();
        ASSERT_NE(cryptoFactory, nullptr);
        ASSERT_NE(nullptr, cryptoFactory.get());
    }

    virtual void TearDown() override {}
@@ -166,7 +166,7 @@ TEST_F(DrmHalClearkeyFactoryTest, CreateClearKeyDrmPlugin) {
            kClearKeyUUID, packageName,
            [&](Status status, const sp<IDrmPlugin>& plugin) {
                EXPECT_EQ(Status::OK, status);
                EXPECT_NE(plugin, nullptr);
                EXPECT_NE(nullptr, plugin.get());
            });
    EXPECT_OK(res);
}
@@ -180,7 +180,7 @@ TEST_F(DrmHalClearkeyFactoryTest, CreateClearKeyCryptoPlugin) {
            kClearKeyUUID, initVec,
            [&](Status status, const sp<ICryptoPlugin>& plugin) {
                EXPECT_EQ(Status::OK, status);
                EXPECT_NE(plugin, nullptr);
                EXPECT_NE(nullptr, plugin.get());
            });
    EXPECT_OK(res);
}
@@ -194,7 +194,7 @@ TEST_F(DrmHalClearkeyFactoryTest, CreateInvalidDrmPlugin) {
            kInvalidUUID, packageName,
            [&](Status status, const sp<IDrmPlugin>& plugin) {
                EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status);
                EXPECT_EQ(plugin, nullptr);
                EXPECT_EQ(nullptr, plugin.get());
            });
    EXPECT_OK(res);
}
@@ -208,7 +208,7 @@ TEST_F(DrmHalClearkeyFactoryTest, CreateInvalidCryptoPlugin) {
            kInvalidUUID, initVec,
            [&](Status status, const sp<ICryptoPlugin>& plugin) {
                EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status);
                EXPECT_EQ(plugin, nullptr);
                EXPECT_EQ(nullptr, plugin.get());
            });
    EXPECT_OK(res);
}
@@ -219,13 +219,13 @@ class DrmHalClearkeyPluginTest : public DrmHalClearkeyFactoryTest {
        // Create factories
        DrmHalClearkeyFactoryTest::SetUp();

        ASSERT_NE(drmFactory, nullptr);
        ASSERT_NE(nullptr, drmFactory.get());
        hidl_string packageName("android.hardware.drm.test");
        auto res = drmFactory->createPlugin(
                kClearKeyUUID, packageName,
                [this](Status status, const sp<IDrmPlugin>& plugin) {
                    EXPECT_EQ(Status::OK, status);
                    ASSERT_NE(plugin, nullptr);
                    ASSERT_NE(nullptr, plugin.get());
                    drmPlugin = plugin;
                });
        ASSERT_OK(res);
@@ -235,7 +235,7 @@ class DrmHalClearkeyPluginTest : public DrmHalClearkeyFactoryTest {
                kClearKeyUUID, initVec,
                [this](Status status, const sp<ICryptoPlugin>& plugin) {
                    EXPECT_EQ(Status::OK, status);
                    ASSERT_NE(plugin, nullptr);
                    ASSERT_NE(nullptr, plugin.get());
                    cryptoPlugin = plugin;
                });
        ASSERT_OK(res);
@@ -866,7 +866,7 @@ TEST_F(DrmHalClearkeyPluginTest, NotifyResolution) {
sp<IMemory> DrmHalClearkeyPluginTest::getDecryptMemory(size_t size,
                                                       size_t index) {
    sp<IAllocator> ashmemAllocator = IAllocator::getService("ashmem");
    EXPECT_NE(ashmemAllocator, nullptr);
    EXPECT_NE(nullptr, ashmemAllocator.get());

    hidl_memory hidlMemory;
    auto res = ashmemAllocator->allocate(
@@ -878,6 +878,7 @@ sp<IMemory> DrmHalClearkeyPluginTest::getDecryptMemory(size_t size,
    EXPECT_OK(res);

    sp<IMemory> mappedMemory = mapMemory(hidlMemory);
    EXPECT_NE(nullptr, mappedMemory.get());
    EXPECT_OK(cryptoPlugin->setSharedBufferBase(hidlMemory, index));
    return mappedMemory;
}
+11 −11
Original line number Diff line number Diff line
@@ -113,7 +113,7 @@ class DrmHalVendorFactoryTest : public testing::TestWithParam<std::string> {
              test_info->test_case_name(), test_info->name(),
              GetParam().c_str());

        ASSERT_NE(vendorModule, nullptr);
        ASSERT_NE(nullptr, vendorModule.get());

        // First try the binderized service name provided by the vendor module.
        // If that fails, which it can on non-binderized devices, try the default
@@ -123,14 +123,14 @@ class DrmHalVendorFactoryTest : public testing::TestWithParam<std::string> {
        if (drmFactory == nullptr) {
            drmFactory = VtsTestBase::getService<IDrmFactory>();
        }
        ASSERT_NE(drmFactory, nullptr);
        ASSERT_NE(nullptr, drmFactory.get());

        // Do the same for the crypto factory
        cryptoFactory = VtsTestBase::getService<ICryptoFactory>(name);
        if (cryptoFactory == nullptr) {
            cryptoFactory = VtsTestBase::getService<ICryptoFactory>();
        }
        ASSERT_NE(cryptoFactory, nullptr);
        ASSERT_NE(nullptr, cryptoFactory.get());

        // If drm scheme not installed skip subsequent tests
        if (!drmFactory->isCryptoSchemeSupported(getVendorUUID())) {
@@ -239,7 +239,7 @@ TEST_P(DrmHalVendorFactoryTest, CreateVendorDrmPlugin) {
            getVendorUUID(), packageName,
            [&](Status status, const sp<IDrmPlugin>& plugin) {
                EXPECT_EQ(Status::OK, status);
                EXPECT_NE(plugin, nullptr);
                EXPECT_NE(nullptr, plugin.get());
            });
    EXPECT_OK(res);
}
@@ -254,7 +254,7 @@ TEST_P(DrmHalVendorFactoryTest, CreateVendorCryptoPlugin) {
            getVendorUUID(), initVec,
            [&](Status status, const sp<ICryptoPlugin>& plugin) {
                EXPECT_EQ(Status::OK, status);
                EXPECT_NE(plugin, nullptr);
                EXPECT_NE(nullptr, plugin.get());
            });
    EXPECT_OK(res);
}
@@ -269,7 +269,7 @@ TEST_P(DrmHalVendorFactoryTest, CreateInvalidDrmPlugin) {
            kInvalidUUID, packageName,
            [&](Status status, const sp<IDrmPlugin>& plugin) {
                EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status);
                EXPECT_EQ(plugin, nullptr);
                EXPECT_EQ(nullptr, plugin.get());
            });
    EXPECT_OK(res);
}
@@ -284,7 +284,7 @@ TEST_P(DrmHalVendorFactoryTest, CreateInvalidCryptoPlugin) {
            kInvalidUUID, initVec,
            [&](Status status, const sp<ICryptoPlugin>& plugin) {
                EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status);
                EXPECT_EQ(plugin, nullptr);
                EXPECT_EQ(nullptr, plugin.get());
            });
    EXPECT_OK(res);
}
@@ -302,7 +302,7 @@ class DrmHalVendorPluginTest : public DrmHalVendorFactoryTest {
                getVendorUUID(), packageName,
                [this](Status status, const sp<IDrmPlugin>& plugin) {
                    EXPECT_EQ(Status::OK, status);
                    ASSERT_NE(plugin, nullptr);
                    ASSERT_NE(nullptr, plugin.get());
                    drmPlugin = plugin;
                });
        ASSERT_OK(res);
@@ -312,7 +312,7 @@ class DrmHalVendorPluginTest : public DrmHalVendorFactoryTest {
                getVendorUUID(), initVec,
                [this](Status status, const sp<ICryptoPlugin>& plugin) {
                    EXPECT_EQ(Status::OK, status);
                    ASSERT_NE(plugin, nullptr);
                    ASSERT_NE(nullptr, plugin.get());
                    cryptoPlugin = plugin;
                });
        ASSERT_OK(res);
@@ -1185,7 +1185,7 @@ TEST_P(DrmHalVendorPluginTest, NotifyResolution) {
sp<IMemory> DrmHalVendorPluginTest::getDecryptMemory(size_t size,
                                                     size_t index) {
    sp<IAllocator> ashmemAllocator = IAllocator::getService("ashmem");
    EXPECT_NE(ashmemAllocator, nullptr);
    EXPECT_NE(nullptr, ashmemAllocator.get());

    hidl_memory hidlMemory;
    auto res = ashmemAllocator->allocate(
@@ -1198,7 +1198,7 @@ sp<IMemory> DrmHalVendorPluginTest::getDecryptMemory(size_t size,
    EXPECT_OK(res);

    sp<IMemory> mappedMemory = mapMemory(hidlMemory);
    EXPECT_NE(mappedMemory, nullptr);
    EXPECT_NE(nullptr, mappedMemory.get());
    res = cryptoPlugin->setSharedBufferBase(hidlMemory, index);
    EXPECT_OK(res);
    return mappedMemory;