From 88b74bc355b9f6428dec308c983ad2b76839f516 Mon Sep 17 00:00:00 2001 From: trupthi1403 Date: Wed, 27 May 2026 13:12:06 +0530 Subject: [PATCH 1/2] RDKEMW-17597-3: Fix medium priority Coverity issues-BAD_CHECK_OF_WAIT_CONDITION, MISSING_MOVE_ASSIGNMENT Reason for change: Added move implementation and used proper waitcondition Test procedure: As in ticket Risks: Medium --- drm/aes/Aes.cpp | 25 ++++++++++++++++++++++++- drm/ocdm/opencdmsessionadapter.h | 12 +++++++----- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/drm/aes/Aes.cpp b/drm/aes/Aes.cpp index 49857475..27dd5fee 100755 --- a/drm/aes/Aes.cpp +++ b/drm/aes/Aes.cpp @@ -214,11 +214,34 @@ DrmReturn AesDec::SetDecryptInfo(const struct DrmInfo *drmInfo, int acquireKeyWa void AesDec::WaitForKeyAcquireCompleteUnlocked(int timeInMs, DrmReturn &err, std::unique_lock& lock ) { MW_LOG_INFO( "waiting for key acquisition to complete,wait time:%d",timeInMs ); - if( std::cv_status::timeout == mCond.wait_for(lock, std::chrono::milliseconds(timeInMs)) ) // block until drm ready + // Initialize err to default error state + err = eDRM_ERROR; + + // Wait with predicate - returns false if timeout, true if condition met + bool acquiredBeforeTimeout = mCond.wait_for(lock, std::chrono::milliseconds(timeInMs), + [this]() { return mDrmState != eDRM_ACQUIRING_KEY; }); + + if (!acquiredBeforeTimeout) { MW_LOG_WARN("AesDec:: wait for key acquisition timed out"); err = eDRM_KEY_ACQUISITION_TIMEOUT; } + else if (mDrmState == eDRM_KEY_ACQUIRED) + { + err = eDRM_SUCCESS; + } + else if (mDrmState == eDRM_KEY_FAILED) + { + err = eDRM_ERROR; + } + else if (mDrmState == eDRM_KEY_FLUSH) + { + err = eDRM_ERROR; + } + else + { + err = eDRM_ERROR; + } } /** diff --git a/drm/ocdm/opencdmsessionadapter.h b/drm/ocdm/opencdmsessionadapter.h index a1554deb..36dd5649 100644 --- a/drm/ocdm/opencdmsessionadapter.h +++ b/drm/ocdm/opencdmsessionadapter.h @@ -54,20 +54,22 @@ class Event { inline bool wait(const uint32_t waitTime) { - bool ret = true; std::unique_lock _lock(lock); if (!signalled) { if (waitTime == 0) { - condition.wait(_lock); + condition.wait(_lock, [this]() { return signalled; }); } else { - if( std::cv_status::timeout == condition.wait_for(_lock,std::chrono::milliseconds(waitTime)) ) + // Use predicate version - returns false if timeout, true if condition met + if (!condition.wait_for(_lock, std::chrono::milliseconds(waitTime), + [this]() { return signalled; })) { - ret = false; + signalled = false; + return false; // Timeout occurred } } } signalled = false; - return ret; + return true; } inline void signal() From cd886230183a9bc7fabb941627056cd0e952a1c4 Mon Sep 17 00:00:00 2001 From: tboova469_comcast Date: Wed, 27 May 2026 21:27:41 +0530 Subject: [PATCH 2/2] Update DrmTestsAes.cpp --- test/utests/tests/DrmAes/DrmTestsAes.cpp | 29 +++++++++++++++++++----- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/test/utests/tests/DrmAes/DrmTestsAes.cpp b/test/utests/tests/DrmAes/DrmTestsAes.cpp index 6e9f907e..3f85df1b 100644 --- a/test/utests/tests/DrmAes/DrmTestsAes.cpp +++ b/test/utests/tests/DrmAes/DrmTestsAes.cpp @@ -34,8 +34,10 @@ #include #include #include -#include "Aes.h" +#define private public +#include "Aes.h" +#undef private class DrmAesDecTests : public ::testing::Test { @@ -1359,9 +1361,20 @@ TEST(DrmAesDecTests, WaitForKeyAcquireCompleteUnlocked_SuccessfulKeyAcquisition) AesDec aesDec; - std::mutex mtx; - std::unique_lock lock(mtx); + std::unique_lock lock(aesDec.mMutex); + + aesDec.mDrmState = eDRM_ACQUIRING_KEY; + + // Spawn thread to simulate key acquisition success + std::thread keyAcquiredThread([&aesDec]() { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Simulate key fetch delay + { + std::lock_guard lg(aesDec.mMutex); + aesDec.mDrmState = eDRM_KEY_ACQUIRED; + } + aesDec.mCond.notify_all(); // Signal waiting thread that key is ready + }); int timeInMs = 1000; DrmReturn return_value; @@ -1372,7 +1385,10 @@ TEST(DrmAesDecTests, WaitForKeyAcquireCompleteUnlocked_SuccessfulKeyAcquisition) std::cout << "Method returned err with value " << return_value << std::endl; - EXPECT_EQ(return_value, eDRM_KEY_ACQUIRED); + // - Returns correct success code for acquired key + EXPECT_EQ(return_value, eDRM_SUCCESS); + + keyAcquiredThread.join(); std::cout << "Exiting WaitForKeyAcquireCompleteUnlocked_SuccessfulKeyAcquisition test" << std::endl; } @@ -1404,9 +1420,9 @@ TEST(DrmAesDecTests, WaitForKeyAcquireCompleteUnlocked_ZeroWaitTimeImmediateTime AesDec aesDec; - std::mutex mtx; + std::unique_lock lock(aesDec.mMutex); - std::unique_lock lock(mtx); + aesDec.mDrmState = eDRM_ACQUIRING_KEY; int timeInMs = 0; DrmReturn return_value; @@ -1417,6 +1433,7 @@ TEST(DrmAesDecTests, WaitForKeyAcquireCompleteUnlocked_ZeroWaitTimeImmediateTime std::cout << "Method returned err with value " << return_value << std::endl; + // - Returns correct timeout error code EXPECT_EQ(return_value, eDRM_KEY_ACQUISITION_TIMEOUT); std::cout << "Exiting WaitForKeyAcquireCompleteUnlocked_ZeroWaitTimeImmediateTimeout test" << std::endl;