From 18fec078978e13b9d6af6b6c4284f819e92ed08a Mon Sep 17 00:00:00 2001 From: Robert Shih Date: Mon, 16 Mar 2020 23:40:06 -0700 Subject: [PATCH] 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) {