dnssd: Fix issue where Browse Unavailable callback was not received 02/133702/1 accepted/tizen/unified/20170630.083014 submit/tizen/20170615.020639
authorSaurav Babu <saurav.babu@samsung.com>
Tue, 13 Jun 2017 06:52:02 +0000 (12:22 +0530)
committerSaurav Babu <saurav.babu@samsung.com>
Tue, 13 Jun 2017 06:52:02 +0000 (12:22 +0530)
In a special scenario when registered service name contains "space" then
Browse Unavailable callback was not received when service was
deregistered. This was because mdnsd replaced "space" with "\032" in
DNSServiceResolve callback. This patch fixes the issue by using service
name from DNSServiceBrowse callback rather than DNSServiceResolve
callback

Change-Id: I51388110b9b2d1f210ef6cdd55c0b10199f66a18
Signed-off-by: Saurav Babu <saurav.babu@samsung.com>
src/dns-sd/dns-sd-util.h
src/dns-sd/dns-sd.c

index c4815fbcd5f4bb8db9fba172f817f2c0a9db0cd3..30106f7fc8253e546eaed44440cbf6d24b8bef47 100644 (file)
@@ -118,6 +118,7 @@ typedef struct _resolve_reply_data {
        dnssd_handle_s *dnssd_handle;
        DNSServiceRef sd_ref;
        int watch_id;
+       char *service_name;
 } resolve_reply_data;
 
 #endif /* __TIZEN_NET_DNSSD_UTIL_H__ */
index 123b3abf5283a9cae4e7a6e26c68a639b4327e1c..4b6a7dab1e0982331ac04234cf9b2c9bcd17a7dc 100644 (file)
@@ -997,7 +997,7 @@ static void __dnssd_getaddrinfo_reply_cb(DNSServiceRef sd_ref,
 
 //LCOV_EXCL_START
 static int __dnssd_getaddrinfo(dnssd_handle_s *dnssd_handle, unsigned int flags,
-               unsigned int if_index, const char *host_name,
+               unsigned int if_index, const char *host_name, char *service_name,
                const char *fullname, const char *txt_record,
                unsigned short txt_len, int port)
 {
@@ -1023,11 +1023,11 @@ static int __dnssd_getaddrinfo(dnssd_handle_s *dnssd_handle, unsigned int flags,
        domain = strtok_r(NULL, ".", &save_str);
        domain = strtok_r(NULL, ".", &save_str);
        domain = strtok_r(NULL, ".", &save_str);
+       g_free(name);
 
        local_handle = g_try_malloc0(FOUND_SIZE);
        if (local_handle == NULL) {
                DNSSD_LOGD("g_try_malloc failed");
-               g_free(name);
                __DNSSD_LOG_FUNC_EXIT__;
                return DNSSD_ERROR_OUT_OF_MEMORY;
        }
@@ -1044,8 +1044,7 @@ static int __dnssd_getaddrinfo(dnssd_handle_s *dnssd_handle, unsigned int flags,
                local_handle->service_type = g_strdup(dnssd_handle->service_type);
 
        found->browse_handler = dnssd_handle->service_handler;
-       found->service_name = g_strdup(name);
-       g_free(name);
+       found->service_name = g_strdup(service_name);
        if (txt_record != NULL) {
                found->txt_record = g_strndup(txt_record, txt_len);
                found->txt_len = txt_len;
@@ -1109,8 +1108,8 @@ static void __dnssd_resolve_reply_cb(DNSServiceRef sd_ref, unsigned int flags,
 
        /* Get Address Info details and send browse callback */
        __dnssd_getaddrinfo(resolve_data->dnssd_handle, flags, if_index,
-                       host_name, fullname, (const char *) txt_record,
-                       txt_len, port);
+                       host_name, resolve_data->service_name, fullname,
+                       (const char *) txt_record, txt_len, port);
        g_idle_add_full(G_PRIORITY_HIGH, __remove_service_resolve_socket,
                                        resolve_data, NULL);
 }
@@ -1135,6 +1134,7 @@ static int __dnssd_resolve_dns_service(dnssd_handle_s *dnssd_handle,
 
        data->dnssd_handle =  dnssd_handle;
        data->watch_id = 0;
+       data->service_name = g_strdup(service_name);
 
        resolve_handle_list = g_slist_prepend(resolve_handle_list, data);
 
@@ -1502,6 +1502,7 @@ int dnssd_stop_browsing_service(dnssd_browser_h dnssd_service)
                if (resolve_data->dnssd_handle == local_handle) {
                        resolve_handle_list = g_slist_remove(resolve_handle_list,
                                        resolve_data);
+                       g_free(resolve_data->service_name);
                        g_free(resolve_data);
                }
                //LCOV_EXCL_STOP