From 0a72d6559f2531047e827016b1b83f8c21fbb719 Mon Sep 17 00:00:00 2001 From: Amit KS Date: Thu, 4 Oct 2018 20:30:41 +0530 Subject: [PATCH] CONPRO-1320] Cleanup observers of deleted resource. Observers were not cleane up for deleted resource, this caused crash in trying to access deleted resource while deleting these observers when TCP connection is closed. Changes are made to clean up the observers while deleting resource itself https://github.sec.samsung.net/RS7-IOTIVITY/IoTivity/pull/318 (cherry picked from commit a7f8adbd8574db8b22a9fbf2340721ebac4c148e) Signed-off-by: Harish Kumara M Signed-off-by: Amit KS Change-Id: I2860a6aaa6324b3ff55070860e8e6b0090f6d2eb --- resource/csdk/stack/include/internal/ocobserve.h | 9 +++++++++ resource/csdk/stack/src/ocobserve.c | 24 ++++++++++++++++++++++++ resource/csdk/stack/src/ocstack.c | 5 +++++ 3 files changed, 38 insertions(+) diff --git a/resource/csdk/stack/include/internal/ocobserve.h b/resource/csdk/stack/include/internal/ocobserve.h index 2fa6724..f5fc6c1 100644 --- a/resource/csdk/stack/include/internal/ocobserve.h +++ b/resource/csdk/stack/include/internal/ocobserve.h @@ -214,6 +214,15 @@ OCStackResult AddObserver (const char *resUri, OCStackResult DeleteObserverUsingDevAddr(const OCDevAddr *devAddr); /** + * Delete all observers of a resource. + * + * @param resource Handle of resource whose observers needs to be deleted. + * + * @return ::OC_STACK_OK on success, some other value upon failure. + */ +OCStackResult DeleteObserverUsingResource(OCResource *res); + +/** * Search the list of observers for the specified token. * * @param token Token to search for. diff --git a/resource/csdk/stack/src/ocobserve.c b/resource/csdk/stack/src/ocobserve.c index 9fde469..18de8c6 100644 --- a/resource/csdk/stack/src/ocobserve.c +++ b/resource/csdk/stack/src/ocobserve.c @@ -767,6 +767,30 @@ OCStackResult DeleteObserverUsingDevAddr(const OCDevAddr *devAddr) return OC_STACK_OK; } +OCStackResult DeleteObserverUsingResource(OCResource *res) +{ + if (!res) + { + return OC_STACK_INVALID_PARAM; + } + + oc_mutex_lock(g_serverObsListMutex); + ResourceObserver *obs = NULL; + ResourceObserver *next = NULL; + LL_FOREACH_SAFE(g_serverObsList, obs, next) + { + if (obs->resource == res) + { + OIC_LOG_V(INFO, TAG, "Deleting observer: id-%u, token-", obs->observeId); + OIC_LOG_BUFFER(INFO, TAG, (const uint8_t *)obs->token, obs->tokenLength); + LL_DELETE(g_serverObsList, obs); + FreeObserver(obs); + } + } + oc_mutex_unlock(g_serverObsListMutex); + return OC_STACK_OK; +} + void DeleteObserverList() { oc_mutex_lock(g_serverObsListMutex); diff --git a/resource/csdk/stack/src/ocstack.c b/resource/csdk/stack/src/ocstack.c index f469c51..139ff3a 100755 --- a/resource/csdk/stack/src/ocstack.c +++ b/resource/csdk/stack/src/ocstack.c @@ -4649,6 +4649,9 @@ OCStackResult deleteResource(OCResource *resource) SendPresenceNotification(resource->rsrcType, OC_PRESENCE_TRIGGER_DELETE); } #endif + // Delete resource's all observers + DeleteObserverUsingResource(resource); + // Only resource in list. if (temp == headResource && temp == tailResource) { @@ -4717,6 +4720,8 @@ void deleteResourceElements(OCResource *resource) OCDeleteResourceAttributes(resource->rsrcAttributes); resource->rsrcAttributes = NULL; } + + resource->entityHandler = NULL; resource = NULL; } -- 2.7.4