Fix fd leak 28/110028/3 accepted/tizen/3.0/common/20170113.182249 accepted/tizen/3.0/ivi/20170113.080951 accepted/tizen/3.0/mobile/20170113.080904 accepted/tizen/3.0/tv/20170113.080922 accepted/tizen/3.0/wearable/20170113.080936 accepted/tizen/common/20170113.183646 accepted/tizen/common/20170113.184547 accepted/tizen/ivi/20170113.223951 accepted/tizen/mobile/20170113.223904 accepted/tizen/tv/20170113.223920 accepted/tizen/wearable/20170113.223933 submit/tizen/20170112.124502 submit/tizen_3.0/20170112.123315 submit/tizen_common/20170112.224201
authorHyunho Kang <hhstark.kang@samsung.com>
Thu, 12 Jan 2017 12:04:29 +0000 (21:04 +0900)
committerHyunho Kang <hhstark.kang@samsung.com>
Thu, 12 Jan 2017 12:26:27 +0000 (21:26 +0900)
If consumer died after send message, provider's socket was remained
because of wrong exception handling.

Change-Id: I4e59926d6372018564a0dcd217cba80101a066b8
Signed-off-by: Hyunho Kang <hhstark.kang@samsung.com>
src/data-control-internal.c
src/data-control-provider.c

index 5d75bcea624532e7d2c54322cf1e470c8497bbe3..96f126bfceeadacc7ed712bbe6146b3feb7eaf05 100755 (executable)
@@ -456,14 +456,17 @@ int _datacontrol_get_data_changed_filter_callback_id(void)
 
 void _socket_info_free(gpointer socket)
 {
+       GError *error = NULL;
        datacontrol_socket_info *socket_info = (datacontrol_socket_info *)socket;
 
        if (socket_info != NULL) {
-               if (socket_info->socket_fd != 0) {
-                       shutdown(socket_info->socket_fd, SHUT_RDWR);
-                       LOGE("shutdown socketpair !!!! %d ", socket_info->socket_fd);
-               }
                if (socket_info->gio_read != NULL) {
+                       LOGE("shutdown socketpair !!!! %d ", socket_info->socket_fd);
+                       g_io_channel_shutdown(socket_info->gio_read, TRUE, &error);
+                       if (error) {
+                               LOGE("g_io_channel_shutdown error : %s", error->message);
+                               g_error_free(error);
+                       }
                        g_io_channel_unref(socket_info->gio_read);
                        socket_info->gio_read = NULL;
                }
index 7cf363d26e9cc30fbb238b550f16e8c20fe056f4..199701ea3031dc6cf7925f43af70eb55a0b4f91d 100755 (executable)
@@ -1656,22 +1656,31 @@ int __datacontrol_handler_cb(bundle *b, int request_id, void *data)
 {
        datacontrol_socket_info *socket_info;
        int ret = DATACONTROL_ERROR_NONE;
+       const char *caller;
+       const char *callee;
+       char *dup_caller;
 
        const char *request_type = bundle_get_val(b, OSP_K_DATACONTROL_REQUEST_TYPE);
        if (request_type == NULL) {
-               char *caller = (char *)bundle_get_val(b, AUL_K_CALLER_APPID);
-               char *callee = (char *)bundle_get_val(b, AUL_K_CALLEE_APPID);
+               caller = bundle_get_val(b, AUL_K_CALLER_APPID);
+               callee = bundle_get_val(b, AUL_K_CALLEE_APPID);
+
+               if (caller == NULL) {
+                       LOGE("Invalid data control request caller is NULL");
+                       return DATACONTROL_ERROR_INVALID_PARAMETER;
+               }
 
-               socket_info = g_hash_table_lookup(__socket_pair_hash, caller);
+               dup_caller = strdup(caller);
+               socket_info = g_hash_table_lookup(__socket_pair_hash, dup_caller);
 
                if (socket_info != NULL)
-                       g_hash_table_remove(__socket_pair_hash, caller);
+                       g_hash_table_remove(__socket_pair_hash, dup_caller);
 
-               socket_info = _add_watch_on_socket_info(caller, callee, "provider", __provider_recv_message, caller);
+               socket_info = _add_watch_on_socket_info(dup_caller, callee, "provider", __provider_recv_message, dup_caller);
                if (socket_info == NULL)
                        return DATACONTROL_ERROR_IO_ERROR;
 
-               g_hash_table_insert(__socket_pair_hash, strdup(caller), socket_info);
+               g_hash_table_insert(__socket_pair_hash, dup_caller, socket_info);
        } else {
                /* Get the request type */
                datacontrol_request_type type = atoi(request_type);