From 78fddc230a412c9c4977e5dac653e192877b5ee9 Mon Sep 17 00:00:00 2001 From: Cong Lin Date: Tue, 17 Mar 2020 13:53:22 -0700 Subject: [PATCH 1/2] (WV to Android) Fix un-initialized-value warning as error in odk_test Merge from Widevine repo of http://go/wvgerrit/95968 Un-initialized int array allocated on heap is detected by MemorySanitizer using this command: rabbit test --config=msan --keep_going --compilation_mode=opt --runs_per_test=1 //video/widevine/export/common/oemcrypto_core_message/odk:odk_test Bug: 151339875 Test: cdm and odk unit tests Change-Id: Ic3329b918636a58eccb518ded7b262c4d98c3644 --- libwvdrmengine/oemcrypto/odk/test/odk_test.cpp | 12 ++++++------ .../oemcrypto/odk/test/odk_test_helper.cpp | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libwvdrmengine/oemcrypto/odk/test/odk_test.cpp b/libwvdrmengine/oemcrypto/odk/test/odk_test.cpp index 1da4cc88..b5c85650 100644 --- a/libwvdrmengine/oemcrypto/odk/test/odk_test.cpp +++ b/libwvdrmengine/oemcrypto/odk/test/odk_test.cpp @@ -70,12 +70,12 @@ void ValidateRequest(uint32_t message_type, // non-empty buf, expect core message length to be set correctly, and buf is // filled with ODK_Field values appropriately - uint8_t* buf = new uint8_t[message_size]; + uint8_t* buf = new uint8_t[message_size]{}; EXPECT_EQ(OEMCrypto_SUCCESS, odk_prepare_func(buf, &core_message_length, &nonce_values)); EXPECT_EQ(core_message_length, message_size); - uint8_t* buf_expected = new uint8_t[message_size]; + uint8_t* buf_expected = new uint8_t[message_size]{}; size_t buf_len_expected = 0; EXPECT_EQ(OEMCrypto_SUCCESS, ODK_IterFields(ODK_WRITE, buf_expected, SIZE_MAX, &buf_len_expected, total_fields)); @@ -94,7 +94,7 @@ void ValidateRequest(uint32_t message_type, nonce_values.api_major_version = t.api_major_version; nonce_values.nonce = t.nonce; nonce_values.session_id = t.session_id; - uint8_t* buf2 = new uint8_t[message_size]; + uint8_t* buf2 = new uint8_t[message_size]{}; EXPECT_EQ(OEMCrypto_SUCCESS, odk_prepare_func(buf2, &core_message_length, &nonce_values)); EXPECT_EQ(core_message_length, message_size); @@ -126,7 +126,7 @@ void ValidateResponse(ODK_CoreMessage* core_message, uint32_t buf_size = 0; ODK_BuildMessageBuffer(core_message, extra_fields, &buf, &buf_size); - uint8_t* zero = new uint8_t[buf_size]; + uint8_t* zero = new uint8_t[buf_size]{}; size_t bytes_read = 0; // zero-out input EXPECT_EQ(OEMCrypto_SUCCESS, ODK_IterFields(ODK_READ, zero, buf_size, @@ -185,13 +185,13 @@ TEST(OdkTest, SerializeFieldsStress) { total_size += ODK_FieldLength(fields[i].type); } - uint8_t* buf = new uint8_t[total_size]; + uint8_t* buf = new uint8_t[total_size]{}; for (int i = 0; i < total_size; i++) { buf[i] = std::rand() & 0xff; } size_t bytes_read = 0, bytes_written = 0; - uint8_t* buf2 = new uint8_t[total_size]; + uint8_t* buf2 = new uint8_t[total_size]{}; ODK_IterFields(ODK_READ, buf, total_size, &bytes_read, fields); EXPECT_EQ(bytes_read, total_size); ODK_IterFields(ODK_WRITE, buf2, total_size, &bytes_written, fields); diff --git a/libwvdrmengine/oemcrypto/odk/test/odk_test_helper.cpp b/libwvdrmengine/oemcrypto/odk/test/odk_test_helper.cpp index fd240648..167d9e59 100644 --- a/libwvdrmengine/oemcrypto/odk/test/odk_test_helper.cpp +++ b/libwvdrmengine/oemcrypto/odk/test/odk_test_helper.cpp @@ -477,7 +477,7 @@ void ODK_BuildMessageBuffer(ODK_CoreMessage* core_message, // update message_size *(reinterpret_cast(total_fields[1].value)) = *buf_size; - *buf = new uint8_t[*buf_size]; + *buf = new uint8_t[*buf_size]{}; size_t bytes_written = 0; // serialize ODK fields to message buffer EXPECT_EQ(OEMCrypto_SUCCESS, ODK_IterFields(ODK_WRITE, *buf, SIZE_MAX, From 18fec078978e13b9d6af6b6c4284f819e92ed08a Mon Sep 17 00:00:00 2001 From: Robert Shih Date: Mon, 16 Mar 2020 23:40:06 -0700 Subject: [PATCH 2/2] hidl WVDrmPlugin: check for listener transport errors Transport errors usually happen when hidl client crashes in DRM event handler. Merged from http://go/wvgerrit/95963 Bug: 150204874 Test: artificial crashes in client DRM event listener Change-Id: I8037374550357d003e302f2a25fbb2305ae5a5e7 --- .../mediadrm/src_hidl/WVDrmPlugin.cpp | 56 ++++++++++++++----- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp index 1ef9916b..c1ddb155 100644 --- a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp @@ -1787,27 +1787,35 @@ Return WVDrmPlugin::sendEvent( EventType eventType, const hidl_vec& sessionId, const hidl_vec& data) { + Return err{}; if (mListenerV1_2 != NULL) { - mListenerV1_2->sendEvent(eventType, sessionId, data); + err = mListenerV1_2->sendEvent(eventType, sessionId, data); } else if (mListener != NULL) { - mListener->sendEvent(eventType, sessionId, data); + err = mListener->sendEvent(eventType, sessionId, data); } else { ALOGE("Null event listener, event not sent"); } - return Void(); + if (!err.isOk()) { + ALOGW("sendEvent failed %s", err.description().c_str()); + } + return err; } Return WVDrmPlugin::sendExpirationUpdate( const hidl_vec& sessionId, int64_t expiryTimeInMS) { + Return err{}; if (mListenerV1_2 != NULL) { - mListenerV1_2->sendExpirationUpdate(sessionId, expiryTimeInMS); + err = mListenerV1_2->sendExpirationUpdate(sessionId, expiryTimeInMS); } else if (mListener != NULL) { - mListener->sendExpirationUpdate(sessionId, expiryTimeInMS); + err = mListener->sendExpirationUpdate(sessionId, expiryTimeInMS); } else { ALOGE("Null event listener, event not sent"); } - return Void(); + if (!err.isOk()) { + ALOGW("sendExpirationUpdate failed %s", err.description().c_str()); + } + return err; } template<> @@ -1815,7 +1823,10 @@ void WVDrmPlugin::_sendKeysChange( const hidl_vec& sessionId, const hidl_vec& keyStatusList, bool hasNewUsableKey) { - mListener->sendKeysChange(sessionId, keyStatusList, hasNewUsableKey); + auto err = mListener->sendKeysChange(sessionId, keyStatusList, hasNewUsableKey); + if (!err.isOk()) { + ALOGW("sendKeysChange failed %s", err.description().c_str()); + } } template<> @@ -1823,41 +1834,56 @@ void WVDrmPlugin::_sendKeysChange( const hidl_vec& sessionId, const hidl_vec& keyStatusList, bool hasNewUsableKey) { - mListenerV1_2->sendKeysChange_1_2(sessionId, keyStatusList, hasNewUsableKey); + auto err = mListenerV1_2->sendKeysChange_1_2(sessionId, keyStatusList, hasNewUsableKey); + if (!err.isOk()) { + ALOGW("sendKeysChange_1_2 failed %s", err.description().c_str()); + } } Return WVDrmPlugin::sendKeysChange( const hidl_vec& sessionId, const hidl_vec& keyStatusList, bool hasNewUsableKey) { + Return err{}; if (mListenerV1_2 != NULL) { - mListenerV1_2->sendKeysChange(sessionId, keyStatusList, hasNewUsableKey); + err = mListenerV1_2->sendKeysChange(sessionId, keyStatusList, hasNewUsableKey); } else if (mListener != NULL) { - mListener->sendKeysChange(sessionId, keyStatusList, hasNewUsableKey); + err = mListener->sendKeysChange(sessionId, keyStatusList, hasNewUsableKey); } else { ALOGE("Null event listener, event not sent"); } - return Void(); + if (!err.isOk()) { + ALOGW("sendKeysChange failed %s", err.description().c_str()); + } + return err; } Return WVDrmPlugin::sendKeysChange_1_2( const hidl_vec& sessionId, const hidl_vec& keyStatusList, bool hasNewUsableKey) { + Return err{}; if (mListenerV1_2 != NULL) { - mListenerV1_2->sendKeysChange_1_2(sessionId, keyStatusList, hasNewUsableKey); + err = mListenerV1_2->sendKeysChange_1_2(sessionId, keyStatusList, hasNewUsableKey); } else { ALOGE("Null event listener, event not sent"); } - return Void(); + if (!err.isOk()) { + ALOGW("sendKeysChange_1_2 failed %s", err.description().c_str()); + } + return err; } Return WVDrmPlugin::sendSessionLostState( const hidl_vec& sessionId) { + Return err{}; if (mListenerV1_2 != NULL) { - mListenerV1_2->sendSessionLostState(sessionId); + err = mListenerV1_2->sendSessionLostState(sessionId); } else { ALOGE("Null event listener, event not sent"); } - return Void(); + if (!err.isOk()) { + ALOGW("sendSessionLostState failed %s", err.description().c_str()); + } + return err; } void WVDrmPlugin::OnSessionRenewalNeeded(const CdmSessionId& cdmSessionId) {