From ccda4faf7b869d271b218d5297d7898fa4cf0af5 Mon Sep 17 00:00:00 2001 From: Alex Dale Date: Fri, 9 Apr 2021 00:43:34 -0700 Subject: [PATCH] Cleaned up OEMCrypto security level getter. [ Merge of http://go/wvgerrit/121566 ] This clean up is part of a larger usage table initialization fix. Bug: 169195093 Change-Id: I3ee818d1e5621f1f2fa64b189da4e66503d5e680 --- .../cdm/core/src/crypto_session.cpp | 61 +++++++++++-------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/libwvdrmengine/cdm/core/src/crypto_session.cpp b/libwvdrmengine/cdm/core/src/crypto_session.cpp index e8b9a23a..241424d9 100644 --- a/libwvdrmengine/cdm/core/src/crypto_session.cpp +++ b/libwvdrmengine/cdm/core/src/crypto_session.cpp @@ -490,37 +490,46 @@ CdmSecurityLevel CryptoSession::GetSecurityLevel() { } CdmSecurityLevel CryptoSession::GetSecurityLevel( - SecurityLevel requested_level) { - LOGV("Getting security level: requested_level = %d", - static_cast(requested_level)); + SecurityLevel requested_security_level) { + LOGV("Getting security level: requested_security_level = %d", + static_cast(requested_security_level)); RETURN_IF_UNINITIALIZED(kSecurityLevelUninitialized); - - std::string security_level; - WithOecReadLock("GetSecurityLevel", [&] { - security_level = OEMCrypto_SecurityLevel(requested_level); + const char* const level = WithOecReadLock("GetSecurityLevel", [&] { + return OEMCrypto_SecurityLevel(requested_security_level); }); - - if ((security_level.size() != 2) || (security_level.at(0) != 'L')) { + if (level == nullptr) { + LOGE("Security level is null: requested_security_level = %d", + static_cast(requested_security_level)); return kSecurityLevelUnknown; } - - CdmSecurityLevel cdm_security_level; - switch (security_level.at(1)) { - case '1': - cdm_security_level = kSecurityLevelL1; - break; - case '2': - cdm_security_level = kSecurityLevelL2; - break; - case '3': - cdm_security_level = kSecurityLevelL3; - break; - default: - cdm_security_level = kSecurityLevelUnknown; - break; + // Check length in the event of a bad pointer. + // |kMaxSecurityLevelLength| is a value larger than expected to + // be able to detect an overrun. + constexpr size_t kMaxSecurityLevelLength = 5; + const size_t length = strnlen(level, kMaxSecurityLevelLength); + constexpr size_t kExpectedSecurityLevelLength = 2; + if (length != kExpectedSecurityLevelLength) { + LOGE( + "Unexpected security level length: " + "length = %zu, requested_security_level = %d", + length, static_cast(requested_security_level)); + return kSecurityLevelUnknown; } - - return cdm_security_level; + const std::string security_level(level); + if (security_level == "L1") { + return kSecurityLevelL1; + } + if (security_level == "L2") { + return kSecurityLevelL2; + } + if (security_level == "L3") { + return kSecurityLevelL3; + } + LOGE( + "Ill-formed security level: " + "level = \"%s\", requested_security_level = %d", + security_level.c_str(), static_cast(requested_security_level)); + return kSecurityLevelUnknown; } CdmResponseType CryptoSession::GetInternalDeviceUniqueId(