diff options
author | Andrii Kalinich (GitHub) <AKalinich@luxoft.com> | 2020-01-07 18:24:32 +0200 |
---|---|---|
committer | Collin <iCollin@users.noreply.github.com> | 2020-01-07 11:24:32 -0500 |
commit | 9abffa7e47d96d93ffb582d4f7a309757b1a5fe2 (patch) | |
tree | f99bc0a018f1fcb59eef4331a1fe89cde843f737 /src/components/application_manager/rpc_plugins | |
parent | e137556512215ded94228e33d21ab4c3e1af3017 (diff) | |
download | sdl_core-9abffa7e47d96d93ffb582d4f7a309757b1a5fe2.tar.gz |
Fix undefined behavior after changing HMICapabilities smart object field (#3116)
* Fix undefined behavior after SO cleanup
After cleanup_data() call, delete is used to deallocate
memory by pointer, however pointer still hold a value
of address of deallocated memory. By that reason SO
still have an ability to access that data what might
cause UB including core crash in the random places.
This function has been updated to set pointers to NULL
as well as smart object type to prevent accident access
to deallocated memory.
* fixup! Fix undefined behavior after SO cleanup
* Fix CSmartSchema corruption while copying
The issue is that HMICapabilities class is storing
different capability fields by raw pointer. In some
cases when one thread is trying to copy smart object
by pointer, another thread may try to set the same
field and destroys a previous one. This may cause a
half-copied smart object instance, like smart object
with the schema pointing to already destroyed schema
item. When such smart object is destroyed, we may see
a core crash or unexpected SDL behavior.
To avoid such issues, raw pointers were raplced with
shared pointers, set by swap() operation. This provide
a guarantee that object will not be destroyed while
copying by some thread.
Diffstat (limited to 'src/components/application_manager/rpc_plugins')
8 files changed, 110 insertions, 88 deletions
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc index c2f4418b66..e08d2a3e0c 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc @@ -551,30 +551,30 @@ RegisterAppInterfaceRequest::GetLockScreenIconUrlNotification( void FillVRRelatedFields(smart_objects::SmartObject& response_params, const HMICapabilities& hmi_capabilities) { response_params[strings::language] = hmi_capabilities.active_vr_language(); - if (hmi_capabilities.vr_capabilities()) { - response_params[strings::vr_capabilities] = - *hmi_capabilities.vr_capabilities(); + auto vr_capabilities = hmi_capabilities.vr_capabilities(); + if (vr_capabilities) { + response_params[strings::vr_capabilities] = *vr_capabilities; } } void FillVIRelatedFields(smart_objects::SmartObject& response_params, const HMICapabilities& hmi_capabilities) { - if (hmi_capabilities.vehicle_type()) { - response_params[hmi_response::vehicle_type] = - *hmi_capabilities.vehicle_type(); + auto vehicle_type = hmi_capabilities.vehicle_type(); + if (vehicle_type) { + response_params[hmi_response::vehicle_type] = *vehicle_type; } } void FillTTSRelatedFields(smart_objects::SmartObject& response_params, const HMICapabilities& hmi_capabilities) { response_params[strings::language] = hmi_capabilities.active_tts_language(); - if (hmi_capabilities.speech_capabilities()) { - response_params[strings::speech_capabilities] = - *hmi_capabilities.speech_capabilities(); + auto speech_capabilities = hmi_capabilities.speech_capabilities(); + if (speech_capabilities) { + response_params[strings::speech_capabilities] = *speech_capabilities; } - if (hmi_capabilities.prerecorded_speech()) { - response_params[strings::prerecorded_speech] = - *(hmi_capabilities.prerecorded_speech()); + auto prerecorded_speech = hmi_capabilities.prerecorded_speech(); + if (prerecorded_speech) { + response_params[strings::prerecorded_speech] = *prerecorded_speech; } } @@ -582,82 +582,70 @@ void FillUIRelatedFields(smart_objects::SmartObject& response_params, const HMICapabilities& hmi_capabilities) { response_params[strings::hmi_display_language] = hmi_capabilities.active_ui_language(); - if (hmi_capabilities.display_capabilities()) { + + auto display_capabilities = hmi_capabilities.display_capabilities(); + if (display_capabilities) { response_params[hmi_response::display_capabilities] = smart_objects::SmartObject(smart_objects::SmartType_Map); smart_objects::SmartObject& display_caps = response_params[hmi_response::display_capabilities]; - if (hmi_capabilities.display_capabilities()->keyExists( - hmi_response::display_type)) { + if (display_capabilities->keyExists(hmi_response::display_type)) { display_caps[hmi_response::display_type] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::display_type); + display_capabilities->getElement(hmi_response::display_type); } - if (hmi_capabilities.display_capabilities()->keyExists( - hmi_response::display_name)) { + if (display_capabilities->keyExists(hmi_response::display_name)) { display_caps[hmi_response::display_name] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::display_name); + display_capabilities->getElement(hmi_response::display_name); } - if (hmi_capabilities.display_capabilities()->keyExists( - hmi_response::text_fields)) { + if (display_capabilities->keyExists(hmi_response::text_fields)) { display_caps[hmi_response::text_fields] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::text_fields); + display_capabilities->getElement(hmi_response::text_fields); } - if (hmi_capabilities.display_capabilities()->keyExists( - hmi_response::image_fields)) { + if (display_capabilities->keyExists(hmi_response::image_fields)) { display_caps[hmi_response::image_fields] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::image_fields); + display_capabilities->getElement(hmi_response::image_fields); } - if (hmi_capabilities.display_capabilities()->keyExists( - hmi_response::media_clock_formats)) { + if (display_capabilities->keyExists(hmi_response::media_clock_formats)) { display_caps[hmi_response::media_clock_formats] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::media_clock_formats); + display_capabilities->getElement(hmi_response::media_clock_formats); } - if (hmi_capabilities.display_capabilities()->keyExists( - hmi_response::templates_available)) { + if (display_capabilities->keyExists(hmi_response::templates_available)) { display_caps[hmi_response::templates_available] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::templates_available); + display_capabilities->getElement(hmi_response::templates_available); } - if (hmi_capabilities.display_capabilities()->keyExists( - hmi_response::screen_params)) { + if (display_capabilities->keyExists(hmi_response::screen_params)) { display_caps[hmi_response::screen_params] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::screen_params); + display_capabilities->getElement(hmi_response::screen_params); } - if (hmi_capabilities.display_capabilities()->keyExists( + if (display_capabilities->keyExists( hmi_response::num_custom_presets_available)) { display_caps[hmi_response::num_custom_presets_available] = - hmi_capabilities.display_capabilities()->getElement( + display_capabilities->getElement( hmi_response::num_custom_presets_available); } - if (hmi_capabilities.display_capabilities()->keyExists( - hmi_response::image_capabilities)) { + if (display_capabilities->keyExists(hmi_response::image_capabilities)) { display_caps[hmi_response::graphic_supported] = - (hmi_capabilities.display_capabilities() - ->getElement(hmi_response::image_capabilities) + (display_capabilities->getElement(hmi_response::image_capabilities) .length() > 0); } } - if (hmi_capabilities.audio_pass_thru_capabilities()) { + auto audio_pass_thru_capabilities = + hmi_capabilities.audio_pass_thru_capabilities(); + if (audio_pass_thru_capabilities) { // hmi_capabilities json contains array and HMI response object response_params[strings::audio_pass_thru_capabilities] = - *hmi_capabilities.audio_pass_thru_capabilities(); + *audio_pass_thru_capabilities; } response_params[strings::hmi_capabilities] = smart_objects::SmartObject(smart_objects::SmartType_Map); @@ -755,36 +743,39 @@ void RegisterAppInterfaceRequest::SendRegisterAppInterfaceResponseToMobile( FillVIRelatedFields(response_params, hmi_capabilities); } - if (hmi_capabilities.button_capabilities()) { - response_params[hmi_response::button_capabilities] = - *hmi_capabilities.button_capabilities(); + auto button_capabilities = hmi_capabilities.button_capabilities(); + if (button_capabilities) { + response_params[hmi_response::button_capabilities] = *button_capabilities; } - if (hmi_capabilities.soft_button_capabilities()) { + auto soft_button_capabilities = hmi_capabilities.soft_button_capabilities(); + if (soft_button_capabilities) { response_params[hmi_response::soft_button_capabilities] = - *hmi_capabilities.soft_button_capabilities(); + *soft_button_capabilities; } - if (hmi_capabilities.preset_bank_capabilities()) { + auto preset_bank_capabilities = hmi_capabilities.preset_bank_capabilities(); + if (preset_bank_capabilities) { response_params[hmi_response::preset_bank_capabilities] = - *hmi_capabilities.preset_bank_capabilities(); + *preset_bank_capabilities; } - if (hmi_capabilities.hmi_zone_capabilities()) { - if (smart_objects::SmartType_Array == - hmi_capabilities.hmi_zone_capabilities()->getType()) { + auto hmi_zone_capabilities = hmi_capabilities.hmi_zone_capabilities(); + if (hmi_zone_capabilities) { + if (smart_objects::SmartType_Array == hmi_zone_capabilities->getType()) { // hmi_capabilities json contains array and HMI response object response_params[hmi_response::hmi_zone_capabilities] = - *hmi_capabilities.hmi_zone_capabilities(); + *hmi_zone_capabilities; } else { response_params[hmi_response::hmi_zone_capabilities][0] = - *hmi_capabilities.hmi_zone_capabilities(); + *hmi_zone_capabilities; } } - if (hmi_capabilities.pcm_stream_capabilities()) { + auto pcm_stream_capabilities = hmi_capabilities.pcm_stream_capabilities(); + if (pcm_stream_capabilities) { response_params[strings::pcm_stream_capabilities] = - *hmi_capabilities.pcm_stream_capabilities(); + *pcm_stream_capabilities; } const std::vector<uint32_t>& diag_modes = diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_location_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_location_request.cc index 1df4d788d2..805c0f0e41 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_location_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_location_request.cc @@ -254,10 +254,10 @@ bool SendLocationRequest::CheckHMICapabilities( return false; } - if (hmi_capabilities.display_capabilities()) { - const SmartObject disp_cap = (*hmi_capabilities.display_capabilities()); + auto display_capabilities = hmi_capabilities.display_capabilities(); + if (display_capabilities) { const SmartObject& text_fields = - disp_cap.getElement(hmi_response::text_fields); + display_capabilities->getElement(hmi_response::text_fields); const size_t len = text_fields.length(); for (size_t i = 0; i < len; ++i) { const SmartObject& text_field = text_fields[i]; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_display_layout_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_display_layout_request.cc index 5ba1076084..0cd9f6635c 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_display_layout_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_display_layout_request.cc @@ -154,10 +154,13 @@ void SetDisplayLayoutRequest::on_event(const event_engine::Event& event) { if (0 == msg_params[hmi_response::display_capabilities] [hmi_response::templates_available] .length()) { - msg_params[hmi_response::display_capabilities] - [hmi_response::templates_available] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::templates_available); + auto display_capabilities = hmi_capabilities.display_capabilities(); + if (display_capabilities) { + msg_params[hmi_response::display_capabilities] + [hmi_response::templates_available] = + display_capabilities->getElement( + hmi_response::templates_available); + } } } const Version& app_version = app->version(); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc index d5e001b7ac..6376570106 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc @@ -179,6 +179,28 @@ class RegisterAppInterfaceRequestTest .WillByDefault(ReturnRef(kDummyString)); ON_CALL(mock_hmi_capabilities_, ccpu_version()) .WillByDefault(ReturnRef(kDummyString)); + ON_CALL(mock_hmi_capabilities_, speech_capabilities()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); + ON_CALL(mock_hmi_capabilities_, prerecorded_speech()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); + ON_CALL(mock_hmi_capabilities_, vr_capabilities()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); + ON_CALL(mock_hmi_capabilities_, display_capabilities()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); + ON_CALL(mock_hmi_capabilities_, audio_pass_thru_capabilities()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); + ON_CALL(mock_hmi_capabilities_, vehicle_type()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); + ON_CALL(mock_hmi_capabilities_, button_capabilities()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); + ON_CALL(mock_hmi_capabilities_, soft_button_capabilities()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); + ON_CALL(mock_hmi_capabilities_, preset_bank_capabilities()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); + ON_CALL(mock_hmi_capabilities_, hmi_zone_capabilities()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); + ON_CALL(mock_hmi_capabilities_, pcm_stream_capabilities()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); ON_CALL(app_mngr_settings_, supported_diag_modes()) .WillByDefault(ReturnRef(kDummyDiagModes)); ON_CALL(mock_policy_handler_, GetAppRequestTypes(_, _)) @@ -432,15 +454,20 @@ TEST_F(RegisterAppInterfaceRequestTest, "test_templates_available"; display_capabilities[am::hmi_response::screen_params] = "test_screen_params"; + auto vehicle_type_ptr = std::make_shared<smart_objects::SmartObject>( + (*expected_message)[am::hmi_response::vehicle_type]); ON_CALL(mock_hmi_capabilities_, vehicle_type()) - .WillByDefault( - Return(&(*expected_message)[am::hmi_response::vehicle_type])); + .WillByDefault(Return(vehicle_type_ptr)); + + auto vr_capabilities_ptr = std::make_shared<smart_objects::SmartObject>( + (*expected_message)[am::strings::vr_capabilities]); ON_CALL(mock_hmi_capabilities_, vr_capabilities()) - .WillByDefault( - Return(&(*expected_message)[am::strings::vr_capabilities])); + .WillByDefault(Return(vr_capabilities_ptr)); + + auto display_capabilities_ptr = std::make_shared<smart_objects::SmartObject>( + (*expected_message)[am::hmi_response::display_capabilities]); ON_CALL(mock_hmi_capabilities_, display_capabilities()) - .WillByDefault( - Return(&(*expected_message)[am::hmi_response::display_capabilities])); + .WillByDefault(Return(display_capabilities_ptr)); ON_CALL(app_mngr_, applications()) .WillByDefault( diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/send_location_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/send_location_request_test.cc index 5d90453278..968c91b5ce 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/send_location_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/send_location_request_test.cc @@ -110,6 +110,8 @@ class SendLocationRequestTest (*message_)[strings::msg_params] = SmartObject(smart_objects::SmartType_Map); (*message_)[strings::msg_params][strings::address] = kCorrectAddress; + ON_CALL(mock_hmi_capabilities_, display_capabilities()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); EXPECT_CALL(app_mngr_, application(kConnectionKey)) .WillOnce(Return(mock_app_)); @@ -130,8 +132,7 @@ class SendLocationRequestTest SmartObject(smart_objects::SmartType_Map); (*disp_cap_)[hmi_response::text_fields][0][strings::name] = field_name; EXPECT_CALL(mock_hmi_capabilities_, display_capabilities()) - .Times(2) - .WillRepeatedly(Return(disp_cap_.get())); + .WillOnce(Return(disp_cap_)); } void FinishSetup() { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_display_layout_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_display_layout_test.cc index cde15a2318..cc3b5925ce 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_display_layout_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_display_layout_test.cc @@ -240,7 +240,7 @@ TEST_F(SetDisplayLayoutRequestTest, OnEvent_AppVersion_v6_WARNING) { "templates_available"; EXPECT_CALL(mock_hmi_capabilities_, display_capabilities()) - .WillOnce(Return(dispaly_capabilities_msg.get())); + .WillOnce(Return(dispaly_capabilities_msg)); EXPECT_CALL( mock_rpc_service_, ManageMobileCommand(MobileResultCodeIs(mobile_result::WARNINGS), @@ -274,7 +274,7 @@ TEST_F(SetDisplayLayoutRequestTest, OnEvent_AppVersion_v5_SUCCESS) { "templates_available"; EXPECT_CALL(mock_hmi_capabilities_, display_capabilities()) - .WillOnce(Return(dispaly_capabilities_msg.get())); + .WillOnce(Return(dispaly_capabilities_msg)); EXPECT_CALL( mock_rpc_service_, ManageMobileCommand(MobileResultCodeIs(mobile_result::SUCCESS), diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/subscribe_button_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/subscribe_button_request_test.cc index 786f2b6bd1..f3bfe12ab1 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/subscribe_button_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/subscribe_button_request_test.cc @@ -162,7 +162,7 @@ TEST_F(SubscribeButtonRequestTest, Run_IsSubscribedToButton_UNSUCCESS) { (*button_caps_ptr)[0][am::hmi_response::button_name] = kButtonName; ON_CALL(mock_hmi_capabilities_, button_capabilities()) - .WillByDefault(Return(button_caps_ptr.get())); + .WillByDefault(Return(button_caps_ptr)); ON_CALL(*app, IsSubscribedToButton(_)).WillByDefault(Return(true)); @@ -193,7 +193,7 @@ TEST_F(SubscribeButtonRequestTest, Run_SUCCESS) { (*button_caps_ptr)[0][am::hmi_response::button_name] = kButtonName; ON_CALL(mock_hmi_capabilities_, button_capabilities()) - .WillByDefault(Return(button_caps_ptr.get())); + .WillByDefault(Return(button_caps_ptr)); ON_CALL(*app, IsSubscribedToButton(_)).WillByDefault(Return(false)); @@ -240,7 +240,7 @@ TEST_F(SubscribeButtonRequestTest, Run_NAV_SUCCESS) { (*button_caps_ptr)[0][am::hmi_response::button_name] = kButtonName; ON_CALL(mock_hmi_capabilities_, button_capabilities()) - .WillByDefault(Return(button_caps_ptr.get())); + .WillByDefault(Return(button_caps_ptr)); ON_CALL(*app, IsSubscribedToButton(_)).WillByDefault(Return(false)); @@ -289,7 +289,7 @@ TEST_F(SubscribeButtonRequestTest, Run_SUCCESS_App_Base_RPC_Version) { mobile_apis::ButtonName::PLAY_PAUSE; ON_CALL(mock_hmi_capabilities_, button_capabilities()) - .WillByDefault(Return(button_caps_ptr.get())); + .WillByDefault(Return(button_caps_ptr)); ON_CALL(*app, IsSubscribedToButton(_)).WillByDefault(Return(false)); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/unsubscribe_button_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/unsubscribe_button_request_test.cc index 98d20dbbc4..5735610051 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/unsubscribe_button_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/unsubscribe_button_request_test.cc @@ -70,7 +70,7 @@ TEST_F(UnsubscribeButtonRequestTest, MessageSharedPtr button_caps_ptr(CreateMessage(smart_objects::SmartType_Map)); (*button_caps_ptr)[0][am::hmi_response::button_name] = kButtonId; EXPECT_CALL(mock_hmi_capabilities_, button_capabilities()) - .WillOnce(Return(button_caps_ptr.get())); + .WillOnce(Return(button_caps_ptr)); MockAppPtr mock_app(CreateMockApp()); EXPECT_CALL(app_mngr_, application(kConnectionKey)) @@ -106,7 +106,7 @@ TEST_F(UnsubscribeButtonRequestTest, MessageSharedPtr button_caps_ptr(CreateMessage(smart_objects::SmartType_Map)); EXPECT_CALL(mock_hmi_capabilities_, button_capabilities()) - .WillOnce(Return(button_caps_ptr.get())); + .WillOnce(Return(button_caps_ptr)); EXPECT_CALL(mock_rpc_service_, ManageMobileCommand( @@ -129,7 +129,7 @@ TEST_F(UnsubscribeButtonRequestTest, Run_SUCCESS) { MessageSharedPtr button_caps_ptr(CreateMessage(smart_objects::SmartType_Map)); (*button_caps_ptr)[0][am::hmi_response::button_name] = kButtonId; EXPECT_CALL(mock_hmi_capabilities_, button_capabilities()) - .WillOnce(Return(button_caps_ptr.get())); + .WillOnce(Return(button_caps_ptr)); MockAppPtr mock_app(CreateMockApp()); EXPECT_CALL(app_mngr_, application(kConnectionKey)) @@ -172,7 +172,7 @@ TEST_F(UnsubscribeButtonRequestTest, Run_SUCCESS_Base_RPC_Version) { mobile_apis::ButtonName::PLAY_PAUSE; EXPECT_CALL(mock_hmi_capabilities_, button_capabilities()) - .WillRepeatedly(Return(button_caps_ptr.get())); + .WillRepeatedly(Return(button_caps_ptr)); MockAppPtr mock_app(CreateMockApp()); EXPECT_CALL(app_mngr_, application(kConnectionKey)) |