source was unref in _attache_callback, this pointer url may be reused by others,... 75/169875/6 accepted/tizen/unified/20180214.144616 accepted/tizen/unified/20180219.055813 submit/tizen/20180212.075159 submit/tizen/20180213.055433 submit/tizen/20180219.005435
authoryujie.cheng <yujie.cheng@samsung.com>
Mon, 12 Feb 2018 02:36:41 +0000 (10:36 +0800)
committerhj kim <backto.kim@samsung.com>
Tue, 13 Feb 2018 05:49:25 +0000 (05:49 +0000)
Change-Id: I2b88c8486d37c9eb65793fb0443952542ad9d756

lib/media-util-register.c

index 61c7bc5..78d1d36 100755 (executable)
@@ -31,7 +31,7 @@
 static GMutex scan_req_mutex;
 
 typedef struct media_callback_data {
-       GSource *source;
+       //GSource *source;
        scan_complete_cb user_callback;
        void *user_data;
        char *sock_path;
@@ -41,6 +41,7 @@ typedef struct media_scan_data {
        GIOChannel *src;
        media_callback_data *cb_data;
        int pid;
+       guint source_id;
        char *req_path;
 } media_scan_data;
 
@@ -75,6 +76,7 @@ gboolean _read_socket(GIOChannel *src, GIOCondition condition, gpointer data)
        int recv_msg_size = 0;
        media_scan_data *req_data = NULL;
        bool flag = false;
+       guint source_id = 0;
 
        sockfd = g_io_channel_unix_get_fd(src);
        if (sockfd < 0) {
@@ -124,7 +126,7 @@ gboolean _read_socket(GIOChannel *src, GIOCondition condition, gpointer data)
 
        MSAPI_DBG("pid[%d] result[%d] request_type[%d]", req_result.pid, req_result.result, req_result.request_type);
 
-       source = ((media_callback_data *)data)->source;
+       //source = ((media_callback_data *)data)->source;
        user_callback = ((media_callback_data *)data)->user_callback;
        user_data = ((media_callback_data *)data)->user_data;
        sock_path = ((media_callback_data *)data)->sock_path;
@@ -148,7 +150,10 @@ gboolean _read_socket(GIOChannel *src, GIOCondition condition, gpointer data)
                                        g_io_channel_shutdown(src, FALSE, NULL);
                                        g_io_channel_unref(src);
 
-                                       g_source_destroy(source);
+                                       /* DF180202-00756 source was destroyed, this pointer url may be reused by others, cause Bus error */
+                                       source_id = req_data->source_id;
+                                       g_source_destroy(g_main_context_find_source_by_id(g_main_context_default(), source_id));
+
                                        close(sockfd);
                                        if (sock_path != NULL) {
                                                MSAPI_DBG("delete path :%s", sock_path);
@@ -179,7 +184,7 @@ gboolean _read_socket(GIOChannel *src, GIOCondition condition, gpointer data)
        return TRUE;
 }
 
-static int _add_request(const char * req_path, media_callback_data *cb_data, GIOChannel *channel)
+static int _add_request(const char * req_path, media_callback_data *cb_data, GIOChannel *channel, guint source_id)
 {
        media_scan_data *req_data = NULL;
 
@@ -205,6 +210,7 @@ static int _add_request(const char * req_path, media_callback_data *cb_data, GIO
        req_data->cb_data = cb_data;
        req_data->req_path = strdup(req_path);
        req_data->src = channel;
+       req_data->source_id = source_id;
 
        g_array_append_val(req_list, req_data);
 
@@ -226,6 +232,7 @@ static int _remove_request(const char * req_path)
        void *user_data = NULL;
        GSource *source = NULL;
        GIOChannel *src = NULL;
+       guint source_id = 0;
        media_request_result_s req_result;
 
         /*NEED MUTEX*/
@@ -250,8 +257,9 @@ static int _remove_request(const char * req_path)
                        req_result.request_type = MEDIA_FILES_REGISTER;
 
                        src = req_data->src;
+                       source_id = req_data->source_id;
                        cb_data = req_data->cb_data;
-                       source = ((media_callback_data *)cb_data)->source;
+                       //source = ((media_callback_data *)cb_data)->source;
                        sock_path = ((media_callback_data *)cb_data)->sock_path;
                        user_callback = ((media_callback_data *)cb_data)->user_callback;
                        user_data = ((media_callback_data *)cb_data)->user_data;
@@ -264,7 +272,8 @@ static int _remove_request(const char * req_path)
                        g_io_channel_shutdown(src, FALSE, NULL);
                        g_io_channel_unref(src);
 
-                       g_source_destroy(source);
+                       /* DF180202-00756 source was destroyed, this pointer url may be reused by others, cause Bus error */
+                       g_source_destroy(g_main_context_find_source_by_id(g_main_context_default(), source_id));
 
                        if (sock_path != NULL) {
                                MSAPI_DBG("delete path :%s", sock_path);
@@ -300,6 +309,7 @@ static int _attach_callback(const char *req_path, int *sockfd, char* sock_path,
        GMainContext *context = NULL;
        GSource *source = NULL;
        media_callback_data *cb_data;
+       guint source_id = 0;
 
        cb_data = malloc(sizeof(media_callback_data));
        MSAPI_RETVM_IF(cb_data == NULL, MS_MEDIA_ERR_OUT_OF_MEMORY, "allocate failed");
@@ -312,17 +322,17 @@ static int _attach_callback(const char *req_path, int *sockfd, char* sock_path,
        channel = g_io_channel_unix_new(*sockfd);
        source = g_io_create_watch(channel, G_IO_IN);
 
-       cb_data->source = source;
+       //cb_data->source = source;
        cb_data->user_callback = user_callback;
        cb_data->user_data = user_data;
        cb_data->sock_path = sock_path;
 
        /* Set callback to be called when socket is readable */
        g_source_set_callback(source, (GSourceFunc)_read_socket, cb_data, NULL);
-       g_source_attach(source, context);
+       source_id = g_source_attach(source, context);
        g_source_unref(source);
 
-       return _add_request(req_path, cb_data, channel);
+       return _add_request(req_path, cb_data, channel, source_id);
 }
 
 static int __media_db_request_update_async(ms_msg_type_e msg_type, const char *storage_id, const char *request_msg, scan_complete_cb user_callback, void *user_data, uid_t uid)