Fix expiry time overflow if it is unlimited

Bug: 21324836

Merged from Widevine CDM repo:
https://widevine-internal-review.googlesource.com/#/c/14392

Change-Id: I2a8da14c98f8ae0fece3667b6f6b8517577f8a98
This commit is contained in:
Kongqun Yang
2015-05-19 18:09:02 -07:00
parent b513c016ed
commit ce68b8ee88
9 changed files with 25 additions and 15 deletions

View File

@@ -3,6 +3,8 @@
#ifndef WVCDM_CORE_WV_CDM_CONSTANTS_H_ #ifndef WVCDM_CORE_WV_CDM_CONSTANTS_H_
#define WVCDM_CORE_WV_CDM_CONSTANTS_H_ #define WVCDM_CORE_WV_CDM_CONSTANTS_H_
#include <limits.h>
#include <string> #include <string>
namespace wvcdm { namespace wvcdm {
@@ -14,6 +16,8 @@ static const size_t KEY_SIZE = 16;
static const size_t MAC_KEY_SIZE = 32; static const size_t MAC_KEY_SIZE = 32;
static const size_t KEYBOX_KEY_DATA_SIZE = 72; static const size_t KEYBOX_KEY_DATA_SIZE = 72;
static const int64_t NEVER_EXPIRES = LLONG_MAX;
static const char SESSION_ID_PREFIX[] = "sid"; static const char SESSION_ID_PREFIX[] = "sid";
static const char KEY_SET_ID_PREFIX[] = "ksid"; static const char KEY_SET_ID_PREFIX[] = "ksid";
static const char KEY_SYSTEM[] = "com.widevine"; static const char KEY_SYSTEM[] = "com.widevine";

View File

@@ -18,7 +18,7 @@ class WvCdmEventListener {
const CdmKeyStatusMap& keys_status, const CdmKeyStatusMap& keys_status,
bool has_new_usable_key) = 0; bool has_new_usable_key) = 0;
virtual void OnExpirationUpdate(const CdmSessionId& session_id, virtual void OnExpirationUpdate(const CdmSessionId& session_id,
int64_t new_expiry_time) = 0; int64_t new_expiry_time_seconds) = 0;
private: private:
CORE_DISALLOW_COPY_AND_ASSIGN(WvCdmEventListener); CORE_DISALLOW_COPY_AND_ASSIGN(WvCdmEventListener);

View File

@@ -2,8 +2,6 @@
#include "license.h" #include "license.h"
#include <limits.h>
#include <vector> #include <vector>
#include "clock.h" #include "clock.h"

View File

@@ -280,13 +280,13 @@ void PolicyEngine::UpdateRenewalRequest(int64_t current_time) {
int64_t PolicyEngine::GetLicenseExpiryTime() { int64_t PolicyEngine::GetLicenseExpiryTime() {
return policy_max_duration_seconds_ > 0 return policy_max_duration_seconds_ > 0
? license_start_time_ + policy_max_duration_seconds_ ? license_start_time_ + policy_max_duration_seconds_
: LLONG_MAX; : NEVER_EXPIRES;
} }
int64_t PolicyEngine::GetPlaybackExpiryTime() { int64_t PolicyEngine::GetPlaybackExpiryTime() {
return (playback_start_time_ > 0 && policy_.playback_duration_seconds() > 0) return (playback_start_time_ > 0 && policy_.playback_duration_seconds() > 0)
? (playback_start_time_ + policy_.playback_duration_seconds()) ? (playback_start_time_ + policy_.playback_duration_seconds())
: LLONG_MAX; : NEVER_EXPIRES;
} }
int64_t PolicyEngine::GetLicenseDurationRemaining(int64_t current_time) { int64_t PolicyEngine::GetLicenseDurationRemaining(int64_t current_time) {

View File

@@ -18,7 +18,6 @@
namespace { namespace {
const int64_t kDurationUnlimited = 0; const int64_t kDurationUnlimited = 0;
const int64_t kNoExpiration = LLONG_MAX;
const int64_t kLicenseStartTime = 1413517500; // ~ 01/01/2013 const int64_t kLicenseStartTime = 1413517500; // ~ 01/01/2013
const int64_t kPlaybackStartTime = kLicenseStartTime + 5; const int64_t kPlaybackStartTime = kLicenseStartTime + 5;
const int64_t kRentalDuration = 604800; // 7 days const int64_t kRentalDuration = 604800; // 7 days
@@ -75,8 +74,8 @@ class MockCdmEventListener : public WvCdmEventListener {
MOCK_METHOD3(OnSessionKeysChange, void(const CdmSessionId& session_id, MOCK_METHOD3(OnSessionKeysChange, void(const CdmSessionId& session_id,
const CdmKeyStatusMap& keys_status, const CdmKeyStatusMap& keys_status,
bool has_new_usable_key)); bool has_new_usable_key));
MOCK_METHOD2(OnExpirationUpdate, MOCK_METHOD2(OnExpirationUpdate, void(const CdmSessionId& session_id,
void(const CdmSessionId& session_id, int64_t new_expiry_time)); int64_t new_expiry_time_seconds));
}; };
class MockMaxResEngine : public MaxResEngine { class MockMaxResEngine : public MaxResEngine {
@@ -471,7 +470,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_PlaybackDuration0) {
EXPECT_CALL(mock_event_listener_, EXPECT_CALL(mock_event_listener_,
OnExpirationUpdate(_, kLicenseStartTime + kHighDuration)); OnExpirationUpdate(_, kLicenseStartTime + kHighDuration));
EXPECT_CALL(mock_event_listener_, EXPECT_CALL(mock_event_listener_,
OnExpirationUpdate(_, kNoExpiration)); OnExpirationUpdate(_, NEVER_EXPIRES));
EXPECT_CALL(check_, Call(1)); EXPECT_CALL(check_, Call(1));
EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_)); EXPECT_CALL(mock_event_listener_, OnSessionRenewalNeeded(_));
EXPECT_CALL(check_, Call(2)); EXPECT_CALL(check_, Call(2));
@@ -545,7 +544,7 @@ TEST_F(PolicyEngineTest, PlaybackOk_Durations0) {
.WillOnce(Return(kLicenseStartTime + kHighDuration)); .WillOnce(Return(kLicenseStartTime + kHighDuration));
ExpectSessionKeysChange(kKeyStatusUsable, true); ExpectSessionKeysChange(kKeyStatusUsable, true);
EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, kNoExpiration)); EXPECT_CALL(mock_event_listener_, OnExpirationUpdate(_, NEVER_EXPIRES));
policy_engine_->SetLicense(license_); policy_engine_->SetLicense(license_);

View File

@@ -495,8 +495,8 @@ class TestWvCdmEventListener : public WvCdmEventListener {
MOCK_METHOD3(OnSessionKeysChange, void(const CdmSessionId& session_id, MOCK_METHOD3(OnSessionKeysChange, void(const CdmSessionId& session_id,
const CdmKeyStatusMap& keys_status, const CdmKeyStatusMap& keys_status,
bool has_new_usable_key)); bool has_new_usable_key));
MOCK_METHOD2(OnExpirationUpdate, MOCK_METHOD2(OnExpirationUpdate, void(const CdmSessionId& session_id,
void(const CdmSessionId& session_id, int64_t new_expiry_time)); int64_t new_expiry_time_seconds));
}; };
class WvCdmRequestLicenseTest : public WvCdmTestBase { class WvCdmRequestLicenseTest : public WvCdmTestBase {

View File

@@ -145,7 +145,7 @@ class WVDrmPlugin : public android::DrmPlugin,
bool hasNewUsableKey); bool hasNewUsableKey);
virtual void OnExpirationUpdate(const CdmSessionId& cdmSessionId, virtual void OnExpirationUpdate(const CdmSessionId& cdmSessionId,
int64_t newExpiryTime); int64_t newExpiryTimeSeconds);
private: private:
DISALLOW_EVIL_CONSTRUCTORS(WVDrmPlugin); DISALLOW_EVIL_CONSTRUCTORS(WVDrmPlugin);

View File

@@ -875,9 +875,12 @@ void WVDrmPlugin::OnSessionKeysChange(const CdmSessionId& cdmSessionId,
} }
void WVDrmPlugin::OnExpirationUpdate(const CdmSessionId& cdmSessionId, void WVDrmPlugin::OnExpirationUpdate(const CdmSessionId& cdmSessionId,
int64_t newExpiryTime) { int64_t newExpiryTimeSeconds) {
Vector<uint8_t> sessionId = ToVector(cdmSessionId); Vector<uint8_t> sessionId = ToVector(cdmSessionId);
sendExpirationUpdate(&sessionId, newExpiryTime * 1000); int64_t newExpiryTimeMilliseconds = newExpiryTimeSeconds == NEVER_EXPIRES
? newExpiryTimeSeconds
: newExpiryTimeSeconds * 1000;
sendExpirationUpdate(&sessionId, newExpiryTimeMilliseconds);
} }
status_t WVDrmPlugin::queryProperty(const std::string& property, status_t WVDrmPlugin::queryProperty(const std::string& property,

View File

@@ -1328,6 +1328,11 @@ TEST_F(WVDrmPluginTest, MarshalsEvents) {
sendEvent(DrmPlugin::kDrmPluginEventKeyNeeded, 0, sendEvent(DrmPlugin::kDrmPluginEventKeyNeeded, 0,
Pointee(ElementsAreArray(sessionIdRaw, kSessionIdSize)), Pointee(ElementsAreArray(sessionIdRaw, kSessionIdSize)),
NULL)); NULL));
// Expiry Time in Java API is in milliseconds.
EXPECT_CALL(*listener,
sendExpirationUpdate(
Pointee(ElementsAreArray(sessionIdRaw, kSessionIdSize)),
NEVER_EXPIRES));
EXPECT_CALL(*listener, EXPECT_CALL(*listener,
sendExpirationUpdate( sendExpirationUpdate(
Pointee(ElementsAreArray(sessionIdRaw, kSessionIdSize)), Pointee(ElementsAreArray(sessionIdRaw, kSessionIdSize)),
@@ -1364,6 +1369,7 @@ TEST_F(WVDrmPluginTest, MarshalsEvents) {
plugin.OnSessionKeysChange(cdmSessionId, cdmKeysStatus, false); plugin.OnSessionKeysChange(cdmSessionId, cdmKeysStatus, false);
plugin.OnSessionRenewalNeeded(cdmSessionId); plugin.OnSessionRenewalNeeded(cdmSessionId);
plugin.OnExpirationUpdate(cdmSessionId, NEVER_EXPIRES);
plugin.OnExpirationUpdate(cdmSessionId, kExpiryTimeInSeconds); plugin.OnExpirationUpdate(cdmSessionId, kExpiryTimeInSeconds);
cdmKeysStatus[kKeyId1] = kKeyStatusUsable; cdmKeysStatus[kKeyId1] = kKeyStatusUsable;