Added missing null checks in CdmSession.
[ Merge of http://go/wvgerrit/85743 ] There were a few methods that did not check that the output parameter was not set to null befor assigning to. The new checks follow a similar pattern that is used for DeviceFiles. Bug: 135207278 Test: Linux unittest and Android tests Change-Id: Idff25a71dd7a6db99f7f9c2dcf4949ac683208cc
This commit is contained in:
@@ -19,6 +19,22 @@
|
|||||||
#include "wv_cdm_constants.h"
|
#include "wv_cdm_constants.h"
|
||||||
#include "wv_cdm_event_listener.h"
|
#include "wv_cdm_event_listener.h"
|
||||||
|
|
||||||
|
// Stringify turns macro arguments into static C strings.
|
||||||
|
// Example: STRINGIFY(this_argument) -> "this_argument"
|
||||||
|
#define STRINGIFY(PARAM...) #PARAM
|
||||||
|
|
||||||
|
#define RETURN_STATUS_IF_NULL(PARAM) \
|
||||||
|
if ((PARAM) == nullptr) { \
|
||||||
|
LOGE("Output parameter |" STRINGIFY(PARAM) "| not provided"); \
|
||||||
|
return PARAMETER_NULL; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define RETURN_FALSE_IF_NULL(PARAM) \
|
||||||
|
if ((PARAM) == nullptr) { \
|
||||||
|
LOGE("Output parameter |" STRINGIFY(PARAM) "| not provided"); \
|
||||||
|
return false; \
|
||||||
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
const size_t kKeySetIdLength = 14;
|
const size_t kKeySetIdLength = 14;
|
||||||
|
|
||||||
@@ -391,11 +407,7 @@ CdmResponseType CdmSession::GenerateKeyRequestInternal(
|
|||||||
LOGE("CDM session not initialized");
|
LOGE("CDM session not initialized");
|
||||||
return NOT_INITIALIZED_ERROR;
|
return NOT_INITIALIZED_ERROR;
|
||||||
}
|
}
|
||||||
|
RETURN_STATUS_IF_NULL(key_request);
|
||||||
if (!key_request) {
|
|
||||||
LOGE("No output destination provided");
|
|
||||||
return PARAMETER_NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (license_type) {
|
switch (license_type) {
|
||||||
case kLicenseTypeTemporary:
|
case kLicenseTypeTemporary:
|
||||||
@@ -561,6 +573,7 @@ CdmResponseType CdmSession::QueryStatus(CdmQueryMap* query_response) {
|
|||||||
LOGE("CDM session not initialized");
|
LOGE("CDM session not initialized");
|
||||||
return NOT_INITIALIZED_ERROR;
|
return NOT_INITIALIZED_ERROR;
|
||||||
}
|
}
|
||||||
|
RETURN_STATUS_IF_NULL(query_response);
|
||||||
|
|
||||||
switch (security_level_) {
|
switch (security_level_) {
|
||||||
case kSecurityLevelL1:
|
case kSecurityLevelL1:
|
||||||
@@ -603,9 +616,10 @@ CdmResponseType CdmSession::QueryKeyAllowedUsage(
|
|||||||
CdmResponseType CdmSession::QueryOemCryptoSessionId(
|
CdmResponseType CdmSession::QueryOemCryptoSessionId(
|
||||||
CdmQueryMap* query_response) {
|
CdmQueryMap* query_response) {
|
||||||
if (!initialized_) {
|
if (!initialized_) {
|
||||||
LOGE("Not initialized");
|
LOGE("CDM session not initialized");
|
||||||
return NOT_INITIALIZED_ERROR;
|
return NOT_INITIALIZED_ERROR;
|
||||||
}
|
}
|
||||||
|
RETURN_STATUS_IF_NULL(query_response);
|
||||||
|
|
||||||
(*query_response)[QUERY_KEY_OEMCRYPTO_SESSION_ID] =
|
(*query_response)[QUERY_KEY_OEMCRYPTO_SESSION_ID] =
|
||||||
std::to_string(crypto_session_->oec_session_id());
|
std::to_string(crypto_session_->oec_session_id());
|
||||||
@@ -663,6 +677,8 @@ CdmResponseType CdmSession::GenerateRenewalRequest(CdmKeyRequest* key_request) {
|
|||||||
LOGE("CDM session not initialized");
|
LOGE("CDM session not initialized");
|
||||||
return NOT_INITIALIZED_ERROR;
|
return NOT_INITIALIZED_ERROR;
|
||||||
}
|
}
|
||||||
|
RETURN_STATUS_IF_NULL(key_request);
|
||||||
|
|
||||||
CdmResponseType status = license_parser_->PrepareKeyUpdateRequest(
|
CdmResponseType status = license_parser_->PrepareKeyUpdateRequest(
|
||||||
true, app_parameters_, nullptr, &key_request->message, &key_request->url);
|
true, app_parameters_, nullptr, &key_request->message, &key_request->url);
|
||||||
|
|
||||||
@@ -706,6 +722,7 @@ CdmResponseType CdmSession::GenerateReleaseRequest(CdmKeyRequest* key_request) {
|
|||||||
LOGE("CDM session not initialized");
|
LOGE("CDM session not initialized");
|
||||||
return NOT_INITIALIZED_ERROR;
|
return NOT_INITIALIZED_ERROR;
|
||||||
}
|
}
|
||||||
|
RETURN_STATUS_IF_NULL(key_request);
|
||||||
is_release_ = true;
|
is_release_ = true;
|
||||||
license_request_latency_.Clear();
|
license_request_latency_.Clear();
|
||||||
CdmResponseType status = license_parser_->PrepareKeyUpdateRequest(
|
CdmResponseType status = license_parser_->PrepareKeyUpdateRequest(
|
||||||
@@ -813,10 +830,7 @@ CdmSessionId CdmSession::GenerateSessionId() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool CdmSession::GenerateKeySetId(CdmKeySetId* key_set_id) {
|
bool CdmSession::GenerateKeySetId(CdmKeySetId* key_set_id) {
|
||||||
if (!key_set_id) {
|
RETURN_FALSE_IF_NULL(key_set_id);
|
||||||
LOGW("Key set ID destination not provided");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<uint8_t> random_data(
|
std::vector<uint8_t> random_data(
|
||||||
(kKeySetIdLength - sizeof(KEY_SET_ID_PREFIX)) / 2, 0);
|
(kKeySetIdLength - sizeof(KEY_SET_ID_PREFIX)) / 2, 0);
|
||||||
@@ -1062,10 +1076,7 @@ CdmResponseType CdmSession::GenericEncrypt(const std::string& in_buffer,
|
|||||||
const std::string& iv,
|
const std::string& iv,
|
||||||
CdmEncryptionAlgorithm algorithm,
|
CdmEncryptionAlgorithm algorithm,
|
||||||
std::string* out_buffer) {
|
std::string* out_buffer) {
|
||||||
if (!out_buffer) {
|
RETURN_STATUS_IF_NULL(out_buffer);
|
||||||
LOGE("No output destination provided");
|
|
||||||
return PARAMETER_NULL;
|
|
||||||
}
|
|
||||||
CdmResponseType sts;
|
CdmResponseType sts;
|
||||||
M_TIME(sts = crypto_session_->GenericEncrypt(in_buffer, key_id, iv, algorithm,
|
M_TIME(sts = crypto_session_->GenericEncrypt(in_buffer, key_id, iv, algorithm,
|
||||||
out_buffer),
|
out_buffer),
|
||||||
@@ -1079,10 +1090,7 @@ CdmResponseType CdmSession::GenericDecrypt(const std::string& in_buffer,
|
|||||||
const std::string& iv,
|
const std::string& iv,
|
||||||
CdmEncryptionAlgorithm algorithm,
|
CdmEncryptionAlgorithm algorithm,
|
||||||
std::string* out_buffer) {
|
std::string* out_buffer) {
|
||||||
if (!out_buffer) {
|
RETURN_STATUS_IF_NULL(out_buffer);
|
||||||
LOGE("No output destination provided");
|
|
||||||
return PARAMETER_NULL;
|
|
||||||
}
|
|
||||||
CdmResponseType sts;
|
CdmResponseType sts;
|
||||||
M_TIME(sts = crypto_session_->GenericDecrypt(in_buffer, key_id, iv, algorithm,
|
M_TIME(sts = crypto_session_->GenericDecrypt(in_buffer, key_id, iv, algorithm,
|
||||||
out_buffer),
|
out_buffer),
|
||||||
@@ -1095,10 +1103,7 @@ CdmResponseType CdmSession::GenericSign(const std::string& message,
|
|||||||
const std::string& key_id,
|
const std::string& key_id,
|
||||||
CdmSigningAlgorithm algorithm,
|
CdmSigningAlgorithm algorithm,
|
||||||
std::string* signature) {
|
std::string* signature) {
|
||||||
if (!signature) {
|
RETURN_STATUS_IF_NULL(signature);
|
||||||
LOGE("No output destination provided");
|
|
||||||
return PARAMETER_NULL;
|
|
||||||
}
|
|
||||||
CdmResponseType sts;
|
CdmResponseType sts;
|
||||||
M_TIME(
|
M_TIME(
|
||||||
sts = crypto_session_->GenericSign(message, key_id, algorithm, signature),
|
sts = crypto_session_->GenericSign(message, key_id, algorithm, signature),
|
||||||
|
|||||||
Reference in New Issue
Block a user