diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_types.h b/libwvdrmengine/cdm/core/include/wv_cdm_types.h index 19b38c75..8179b1c8 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_types.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_types.h @@ -312,6 +312,7 @@ enum CdmResponseType { PARSE_RESPONSE_ERROR_2, PARSE_RESPONSE_ERROR_3, /* 270 */ PARSE_RESPONSE_ERROR_4, + RELEASE_ALL_USAGE_INFO_ERROR_6, }; enum CdmKeyStatus { diff --git a/libwvdrmengine/cdm/core/src/cdm_engine.cpp b/libwvdrmengine/cdm/core/src/cdm_engine.cpp index 4c492dea..550bf5d2 100644 --- a/libwvdrmengine/cdm/core/src/cdm_engine.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_engine.cpp @@ -1135,19 +1135,32 @@ CdmResponseType CdmEngine::ReleaseAllUsageInfo(const std::string& app_id) { if (usage_session_->get_usage_support_type() == kUsageEntrySupport) { std::vector usage_data; - if (!handle.RetrieveUsageInfo( - DeviceFiles::GetUsageInfoFileName(app_id), - &usage_data)) { - status = RELEASE_ALL_USAGE_INFO_ERROR_4; - } else { - for (size_t k = 0; k < usage_data.size(); ++k) { - CdmResponseType status2 = - usage_session_->DeleteUsageEntry( - usage_data[k].usage_entry_number); - if (status == NO_ERROR && status2 != NO_ERROR) - status = status2; + // Retrieve all usage information but delete only one before + // refetching. This is because deleting the usage entry + // might cause other entries to be shifted and information updated. + do { + if (!handle.RetrieveUsageInfo( + DeviceFiles::GetUsageInfoFileName(app_id), + &usage_data)) { + status = RELEASE_ALL_USAGE_INFO_ERROR_4; + break; } - } + + if (usage_data.empty()) break; + + status = usage_session_->DeleteUsageEntry( + usage_data[0].usage_entry_number); + + if (status != NO_ERROR) break; + + if (!handle.DeleteUsageInfo( + DeviceFiles::GetUsageInfoFileName(app_id), + usage_data[0].provider_session_token)) { + status = RELEASE_ALL_USAGE_INFO_ERROR_6; + break; + } + } while (status == NO_ERROR && !usage_data.empty()); + std::vector provider_session_tokens; if (!handle.DeleteAllUsageInfoForApp( DeviceFiles::GetUsageInfoFileName(app_id), diff --git a/libwvdrmengine/cdm/core/src/cdm_session.cpp b/libwvdrmengine/cdm/core/src/cdm_session.cpp index 258623ee..f207b1e1 100644 --- a/libwvdrmengine/cdm/core/src/cdm_session.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_session.cpp @@ -686,8 +686,7 @@ CdmResponseType CdmSession::ReleaseKey(const CdmKeyResponse& key_response) { } CdmResponseType CdmSession::DeleteUsageEntry(uint32_t usage_entry_number) { - if (usage_support_type_ != kUsageEntrySupport || - !has_provider_session_token()) { + if (usage_support_type_ != kUsageEntrySupport) { LOGE("CdmSession::DeleteUsageEntry: Unexpected usage type supported: %d", usage_support_type_); return INCORRECT_USAGE_SUPPORT_TYPE_1; @@ -886,8 +885,8 @@ CdmResponseType CdmSession::UpdateUsageTableInformation() { CdmResponseType CdmSession::UpdateUsageEntryInformation() { if (usage_support_type_ != kUsageEntrySupport || - !has_provider_session_token() && - usage_table_header_ != nullptr) { + !has_provider_session_token() || + usage_table_header_ == nullptr) { LOGE("CdmSession::UpdateUsageEntryInformation: Unexpected usage type " "supported: %d", usage_support_type_); return INCORRECT_USAGE_SUPPORT_TYPE_2; diff --git a/libwvdrmengine/cdm/core/test/test_printers.cpp b/libwvdrmengine/cdm/core/test/test_printers.cpp index 97c5af01..016fa74f 100644 --- a/libwvdrmengine/cdm/core/test/test_printers.cpp +++ b/libwvdrmengine/cdm/core/test/test_printers.cpp @@ -560,6 +560,9 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) { case RELEASE_ALL_USAGE_INFO_ERROR_5: *os << "RELEASE_ALL_USAGE_INFO_ERROR_5"; break; + case RELEASE_ALL_USAGE_INFO_ERROR_6: + *os << "RELEASE_ALL_USAGE_INFO_ERROR_6"; + break; case RELEASE_USAGE_INFO_FAILED: *os << "RELEASE_USAGE_INFO_FAILED"; break; case INCORRECT_USAGE_SUPPORT_TYPE_1: diff --git a/libwvdrmengine/include/WVErrors.h b/libwvdrmengine/include/WVErrors.h index f12c1bdd..d6b79dfc 100644 --- a/libwvdrmengine/include/WVErrors.h +++ b/libwvdrmengine/include/WVErrors.h @@ -274,10 +274,11 @@ enum { kParseResponseError2 = ERROR_DRM_VENDOR_MIN + 261, kParseResponseError3 = ERROR_DRM_VENDOR_MIN + 262, kParseResponseError4 = ERROR_DRM_VENDOR_MIN + 263, + kReleaseAllUsageInfoError6 = ERROR_DRM_VENDOR_MIN + 264, // This should always follow the last error code. // The offset value should be updated each time a new error code is added. - kErrorWVDrmMaxErrorUsed = ERROR_DRM_VENDOR_MIN + 263, + kErrorWVDrmMaxErrorUsed = ERROR_DRM_VENDOR_MIN + 264, // Used by crypto test mode kErrorTestMode = ERROR_DRM_VENDOR_MAX, diff --git a/libwvdrmengine/include/mapErrors-inl.h b/libwvdrmengine/include/mapErrors-inl.h index ab945b2b..56225b94 100644 --- a/libwvdrmengine/include/mapErrors-inl.h +++ b/libwvdrmengine/include/mapErrors-inl.h @@ -499,6 +499,8 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) { return kReleaseAllUsageInfoError4; case wvcdm::RELEASE_ALL_USAGE_INFO_ERROR_5: return kReleaseAllUsageInfoError5; + case wvcdm::RELEASE_ALL_USAGE_INFO_ERROR_6: + return kReleaseAllUsageInfoError6; case wvcdm::RELEASE_USAGE_INFO_FAILED: return android::ERROR_DRM_TAMPER_DETECTED; case wvcdm::INCORRECT_USAGE_SUPPORT_TYPE_1: diff --git a/libwvdrmengine/include_hidl/mapErrors-inl.h b/libwvdrmengine/include_hidl/mapErrors-inl.h index df2f41c0..a752a2a5 100644 --- a/libwvdrmengine/include_hidl/mapErrors-inl.h +++ b/libwvdrmengine/include_hidl/mapErrors-inl.h @@ -286,6 +286,7 @@ static Status mapCdmResponseType(wvcdm::CdmResponseType res) { case wvcdm::USAGE_INVALID_LOAD_ENTRY: case wvcdm::RELEASE_ALL_USAGE_INFO_ERROR_4: case wvcdm::RELEASE_ALL_USAGE_INFO_ERROR_5: + case wvcdm::RELEASE_ALL_USAGE_INFO_ERROR_6: case wvcdm::INCORRECT_USAGE_SUPPORT_TYPE_1: case wvcdm::INCORRECT_USAGE_SUPPORT_TYPE_2: case wvcdm::NO_USAGE_ENTRIES: