diff --git a/libwvdrmengine/mediacrypto/Android.mk b/libwvdrmengine/mediacrypto/Android.mk index af10f4b1..e9ead317 100644 --- a/libwvdrmengine/mediacrypto/Android.mk +++ b/libwvdrmengine/mediacrypto/Android.mk @@ -76,6 +76,8 @@ LOCAL_SHARED_LIBRARIES := \ libhidlmemory \ liblog +LOCAL_CFLAGS := -Wthread-safety + LOCAL_MODULE := libwvdrmcryptoplugin_hidl LOCAL_PROPRIETARY_MODULE := true diff --git a/libwvdrmengine/mediacrypto/include_hidl/WVCryptoPlugin.h b/libwvdrmengine/mediacrypto/include_hidl/WVCryptoPlugin.h index 1824d93a..032c9227 100644 --- a/libwvdrmengine/mediacrypto/include_hidl/WVCryptoPlugin.h +++ b/libwvdrmengine/mediacrypto/include_hidl/WVCryptoPlugin.h @@ -7,11 +7,14 @@ #ifndef WV_CRYPTO_PLUGIN_H_ #define WV_CRYPTO_PLUGIN_H_ +#include #include +#include + #include "HidlTypes.h" -#include "wv_content_decryption_module.h" #include "WVTypes.h" +#include "wv_content_decryption_module.h" namespace wvdrm { namespace hardware { @@ -59,19 +62,21 @@ struct WVCryptoPlugin : public ICryptoPlugin { const SharedBuffer& source, uint64_t offset, const DestinationBuffer& destination, - decrypt_1_2_cb _hidl_cb) override; + decrypt_1_2_cb _hidl_cb) override NO_THREAD_SAFETY_ANALYSIS; // use unique_lock private: WVDRM_DISALLOW_COPY_AND_ASSIGN_AND_NEW(WVCryptoPlugin); wvcdm::CdmSessionId mSessionId; - std::map > mSharedBufferMap; + std::map > mSharedBufferMap GUARDED_BY(mSharedBufferLock); sp const mCDM; Status_V1_2 attemptDecrypt( const wvcdm::CdmDecryptionParametersV16& params, bool haveEncryptedSubsamples, std::string* errorDetailMsg); + + std::mutex mSharedBufferLock; }; } // namespace widevine diff --git a/libwvdrmengine/mediacrypto/src_hidl/WVCryptoPlugin.cpp b/libwvdrmengine/mediacrypto/src_hidl/WVCryptoPlugin.cpp index f253eff2..8167bde1 100644 --- a/libwvdrmengine/mediacrypto/src_hidl/WVCryptoPlugin.cpp +++ b/libwvdrmengine/mediacrypto/src_hidl/WVCryptoPlugin.cpp @@ -110,6 +110,8 @@ Return WVCryptoPlugin::setSharedBufferBase( const hidl_memory& base, uint32_t bufferId) { sp hidlMemory = mapMemory(base); + std::lock_guard shared_buffer_lock(mSharedBufferLock); + // allow mapMemory to return nullptr mSharedBufferMap[bufferId] = hidlMemory; return Void(); @@ -158,7 +160,7 @@ Return WVCryptoPlugin::decrypt_1_2( uint64_t offset, const DestinationBuffer& destination, decrypt_1_2_cb _hidl_cb) { - + std::unique_lock lock(mSharedBufferLock); if (mSharedBufferMap.find(source.bufferId) == mSharedBufferMap.end()) { _hidl_cb(Status_V1_2::ERROR_DRM_CANNOT_HANDLE, 0, "source decrypt buffer base not set"); @@ -231,6 +233,9 @@ Return WVCryptoPlugin::decrypt_1_2( destPtr = static_cast(handle); } + // release mSharedBufferLock + lock.unlock(); + // Set up the decrypt params CdmDecryptionParametersV16 params; params.key_id = cryptoKey;