From: Lukasz Bardeli Date: Mon, 4 Dec 2017 14:49:52 +0000 (+0100) Subject: [Iotcon] Fix preventing crash. X-Git-Tag: submit/tizen_4.0/20171206.135725~1^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e9969e132ec7ced15469c0511a26852dedfdb836;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [Iotcon] Fix preventing crash. Fix with adding id to vector to hold information about possible remote resources. If id is present in vector then map with remote resources is checked if pointer exist. If not then callback is ignored [Verification] Tested in chrome console. TCT auto tests 100% Change-Id: I2032e0c8c93846ef84ac871944bbf326b8eafac7 Signed-off-by: Lukasz Bardeli --- diff --git a/src/iotcon/iotcon_client_manager.cc b/src/iotcon/iotcon_client_manager.cc index bfa83fe9..e34193f3 100644 --- a/src/iotcon/iotcon_client_manager.cc +++ b/src/iotcon/iotcon_client_manager.cc @@ -43,6 +43,42 @@ IotconClientManager& IotconClientManager::GetInstance() { return instance; } +long long* IotconClientManager::Add(long long id) { + ScopeLogger(); + ids_.push_back(new long long(id)); + return ids_.back(); +} + +void IotconClientManager::Remove(long long id) { + ScopeLogger(); + auto it = ids_.end(); + while (it > ids_.begin()) { + --it; + if (**it == id) { + ids_.erase(it); + return; + } + } +} + +bool IotconClientManager::IfExists(long long id) { + ScopeLogger(); + for (auto v : ids_) { + if (*v == id) { + return true; + } + } + return false; +} + +FoundRemoteInfoPtr IotconClientManager::GetFoundRemoteInfoPtr(long long id) { + ScopeLogger(); + if (IfExists(id)) { + return remotes_map_.at(id); + } + return nullptr; +} + void IotconClientManager::PresenceHandler(iotcon_presence_h presence, iotcon_error_e err, iotcon_presence_response_h response, void* user_data) { ScopeLogger(); @@ -118,6 +154,7 @@ picojson::value IotconClientManager::RemoveRemoteResource(FoundRemoteInfoPtr ptr ptr->ref_count--; if (ptr->ref_count <= 0) { LoggerD("Handle not needed anymore, removing from map"); + Remove(ptr->id); remotes_map_.erase(ptr->id); return PrepareManageIdAnswer(false); } diff --git a/src/iotcon/iotcon_client_manager.h b/src/iotcon/iotcon_client_manager.h index 56bd87ed..f3fccefc 100644 --- a/src/iotcon/iotcon_client_manager.h +++ b/src/iotcon/iotcon_client_manager.h @@ -42,6 +42,10 @@ class IotconClientManager { picojson::value RemoveRemoteResource(FoundRemoteInfoPtr ptr); common::TizenResult GetRemoteById(long long id, FoundRemoteInfoPtr* res_pointer) const; picojson::value PrepareManageIdAnswer(bool keep_id, long long id = 0); + long long* Add(long long id); + void Remove(long long id); + bool IfExists(long long id); + FoundRemoteInfoPtr GetFoundRemoteInfoPtr(long long id); private: IotconClientManager() = default; @@ -55,6 +59,7 @@ class IotconClientManager { PresenceMap presence_map_; FoundRemotesMap remotes_map_; + IdVector ids_; }; } // namespace iotcon diff --git a/src/iotcon/iotcon_instance.cc b/src/iotcon/iotcon_instance.cc index c71deebb..1ca926dd 100644 --- a/src/iotcon/iotcon_instance.cc +++ b/src/iotcon/iotcon_instance.cc @@ -936,9 +936,12 @@ common::TizenResult IotconInstance::RemoteResourceMethodDelete(const picojson::o static void ObserveCallback(iotcon_remote_resource_h resource, iotcon_error_e err, int sequence_number, iotcon_response_h response, void* user_data) { ScopeLogger(); - FoundRemoteInfo* ptr = static_cast(user_data); + long long* id = static_cast(user_data); + + FoundRemoteInfoPtr ptr = IotconClientManager::GetInstance().GetFoundRemoteInfoPtr(*id); + if (nullptr == ptr) { - LoggerE("ObserveCallback() failed. Ignoring callback"); + LoggerE("ObserveCallback() failed. Ignoring callback"); return; } @@ -1015,14 +1018,17 @@ common::TizenResult IotconInstance::RemoteResourceStartObserving(const picojson: } } - result = IotconUtils::ConvertIotconError(iotcon_remote_resource_observe_register( - ptr->handle, observe_policy, query, ObserveCallback, ptr.get())); + picojson::value ret = IotconClientManager::GetInstance().StoreRemoteResource(ptr); + result = IotconUtils::ConvertIotconError( + iotcon_remote_resource_observe_register(ptr->handle, observe_policy, query, ObserveCallback, + IotconClientManager::GetInstance().Add(ptr->id))); if (!result) { + IotconClientManager::GetInstance().RemoveRemoteResource(ptr); return result; } observing_started_ = true; - return common::TizenSuccess{IotconClientManager::GetInstance().StoreRemoteResource(ptr)}; + return common::TizenSuccess{ret}; } common::TizenResult IotconInstance::RemoteResourceStopObserving(const picojson::object& args) { @@ -1078,9 +1084,12 @@ common::TizenResult IotconInstance::RemoteResourceStopObserving(const picojson:: static void RepresentationChangedCallback(iotcon_remote_resource_h resource, iotcon_representation_h representation, void* user_data) { ScopeLogger(); - FoundRemoteInfo* ptr = static_cast(user_data); + long long* id = static_cast(user_data); + + FoundRemoteInfoPtr ptr = IotconClientManager::GetInstance().GetFoundRemoteInfoPtr(*id); + if (nullptr == ptr) { - LoggerE("RepresentationChangeCallback() failed. Ignoring callback"); + LoggerE("RepresentationChangeCallback() failed. Ignoring callback"); return; } @@ -1121,14 +1130,16 @@ common::TizenResult IotconInstance::RemoteResourceStartCaching(const picojson::o Post(kRemoteResourceCacheChangeListener, common::TizenSuccess{response}); }; - result = IotconUtils::ConvertIotconError( - iotcon_remote_resource_start_caching(ptr->handle, RepresentationChangedCallback, ptr.get())); + picojson::value ret = IotconClientManager::GetInstance().StoreRemoteResource(ptr); + result = IotconUtils::ConvertIotconError(iotcon_remote_resource_start_caching( + ptr->handle, RepresentationChangedCallback, IotconClientManager::GetInstance().Add(ptr->id))); if (!result) { + IotconClientManager::GetInstance().RemoveRemoteResource(ptr); return result; } caching_started_ = true; - return common::TizenSuccess{IotconClientManager::GetInstance().StoreRemoteResource(ptr)}; + return common::TizenSuccess{ret}; } common::TizenResult IotconInstance::RemoteResourceStopCaching(const picojson::object& args) { @@ -1164,9 +1175,12 @@ common::TizenResult IotconInstance::RemoteResourceStopCaching(const picojson::ob static void MonitoringCallback(iotcon_remote_resource_h resource, iotcon_remote_resource_state_e state, void* user_data) { ScopeLogger(); - FoundRemoteInfo* ptr = static_cast(user_data); + long long* id = static_cast(user_data); + + FoundRemoteInfoPtr ptr = IotconClientManager::GetInstance().GetFoundRemoteInfoPtr(*id); + if (nullptr == ptr) { - LoggerE("MonitoringCallback() failed. Ignoring callback"); + LoggerE("MonitoringCallback() failed. Ignoring callback"); return; } @@ -1201,13 +1215,15 @@ common::TizenResult IotconInstance::RemoteResourceSetResourceStateChangeListener Post(kRemoteResourceStateChangeListener, common::TizenSuccess{response}); }; - result = IotconUtils::ConvertIotconError( - iotcon_remote_resource_start_monitoring(ptr->handle, MonitoringCallback, ptr.get())); + picojson::value ret = IotconClientManager::GetInstance().StoreRemoteResource(ptr); + result = IotconUtils::ConvertIotconError(iotcon_remote_resource_start_monitoring( + ptr->handle, MonitoringCallback, IotconClientManager::GetInstance().Add(ptr->id))); if (!result) { + IotconClientManager::GetInstance().RemoveRemoteResource(ptr); return result; } monitoring_started_ = true; - return common::TizenSuccess{IotconClientManager::GetInstance().StoreRemoteResource(ptr)}; + return common::TizenSuccess{ret}; } common::TizenResult IotconInstance::RemoteResourceUnsetResourceStateChangeListener( diff --git a/src/iotcon/iotcon_utils.h b/src/iotcon/iotcon_utils.h index aa37b5dc..47a75c9e 100644 --- a/src/iotcon/iotcon_utils.h +++ b/src/iotcon/iotcon_utils.h @@ -78,6 +78,7 @@ typedef std::shared_ptr PresenceEventPtr; typedef std::map PresenceMap; typedef std::shared_ptr FoundRemoteInfoPtr; typedef std::map FoundRemotesMap; +typedef std::vector IdVector; using ResponsePtr = std::shared_ptr::type>;