Fix the crash when browsing is stopped 43/308743/1 accepted/tizen_unified_dev accepted/tizen/unified/20240401.165618 accepted/tizen/unified/dev/20240620.004310 accepted/tizen/unified/x/20240402.012047
authorSeonah Moon <seonah1.moon@samsung.com>
Fri, 29 Mar 2024 10:41:38 +0000 (19:41 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Fri, 29 Mar 2024 10:41:43 +0000 (19:41 +0900)
Removing an item in the iterator can cause a crash.

Change-Id: I071c7d2897172d8f87cda53b4815e1dc3f7db747

packaging/capi-network-nsd.spec
src/dns-sd/dns-sd.c

index 61cf69f2f6e551a1f6095fce70fc279b78fb294d..699e051f99c6b63de88098407629e6ca7ccbb458 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-network-nsd
 Summary:    A Network Service Discovery libraries in Native API
-Version:    0.2.2
+Version:    0.2.3
 Release:    1
 Group:      System/Network
 License:    Apache-2.0
index 62ddd0280d66bb02f9914fa6276bf6bf9eb6b165..8f40f2f40fa482d0804fe1fecc8188f2a8ce8560 100644 (file)
@@ -1151,6 +1151,7 @@ static gboolean __remove_service_getaddrinfo_socket(gpointer user_data)
 
 static void __update_found_address(const struct sockaddr *address, dnssd_found_data_s *found)
 {
+       __DNSSD_LOG_FUNC_ENTER__;
        if (!address || !found)
                return;
 
@@ -1177,6 +1178,7 @@ static void __update_found_address(const struct sockaddr *address, dnssd_found_d
 
                memcpy(found->ip_v6_addr, addr, IPV6_LEN);
        }
+       __DNSSD_LOG_FUNC_EXIT__;
 }
 
 static void __dnssd_getaddrinfo_reply_cb(DNSServiceRef sd_ref,
@@ -1221,6 +1223,7 @@ static void __dnssd_getaddrinfo_reply_cb(DNSServiceRef sd_ref,
                return;
        }
 
+       LOGD("local_handle[%p]", local_handle);
        if(local_handle->op_type == DNSSD_TYPE_FOUND_NOT_RESOLVED) {
                local_handle->op_type = DNSSD_TYPE_FOUND;
                found->callback.resolved_cb(DNSSD_ERROR_NONE,
@@ -1371,7 +1374,7 @@ static int __dnssd_getaddrinfo(dnssd_handle_s *dnssd_handle, unsigned int flags,
 static gboolean __remove_service_resolve_socket(gpointer user_data)
 {
        DNSSD_LOCK;
-       DNSSD_LOGD("Remove DNSServiceResolve socket");
+       DNSSD_LOGD("Remove DNSServiceResolve socket [%p]", user_data);
        resolve_reply_data *resolve_data = user_data;
        if (resolve_data->watch_id > 0) {
                GMainContext *context = g_main_context_get_thread_default();
@@ -1393,7 +1396,7 @@ static void __dnssd_resolve_reply_cb(DNSServiceRef sd_ref, unsigned int flags,
 {
        DNSSD_LOCK;
        resolve_reply_data *resolve_data = user_data;
-       DNSSD_LOGD("Received Resolve Reply");
+       DNSSD_LOGD("Received Resolve Reply[%p]", resolve_data);
 
        if (flags & kDNSServiceFlagsMoreComing) {
                DNSSD_LOGD("More results are queued");
@@ -1429,6 +1432,11 @@ static int __dnssd_resolve_dns_service(dnssd_handle_s *dnssd_handle,
        data->watch_id = 0;
        data->service_name = g_strdup(service_name);
        resolve_handle_list = g_slist_prepend(resolve_handle_list, data);
+       DNSSD_LOGD("[%p] is added to resolve_handle_list", data);
+       DNSSD_LOGD("resolve_data[%p] dnssd_handle[%p]", data, dnssd_handle);
+
+
+       DNSSD_LOGD("resolve_handle_list length [%d] [%p]", g_slist_length(resolve_handle_list), resolve_handle_list);
 
        ret = DNSServiceResolve(&(data->sd_ref), flags, if_index, service_name,
                        type, domain, __dnssd_resolve_reply_cb, data);
@@ -1841,9 +1849,11 @@ static void __destroy_resolve_data(dnssd_handle_s *browsing_handle,
 static void __destroy_related_resolve_data(dnssd_handle_s *dnssd_handle)
 {
        GSList *list = resolve_handle_list;
+       GSList *next = NULL;
        while (list) {
+               next = list->next;
                __destroy_resolve_data(dnssd_handle, (resolve_reply_data *)list->data);
-               list = list->next;
+               list = next;
        }
 }