From ffc64b62183c35275d51eecc9cebfbde1f053e9e Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Tue, 10 Nov 2015 17:56:42 +0900 Subject: [PATCH 01/16] merge tizen 2.4 Change-Id: I6b09e6aabaa3f09f12e0ed309fdb5b8e4bf6f0c7 Signed-off-by: jongmyeongko --- CMakeLists.txt | 0 include/eventsystem.h | 0 include/eventsystem_internal.h | 1 + packaging/eventsystem.spec | 3 +- src/eventsystem.c | 261 ++++++++++++++++++++++++++++------------- 5 files changed, 182 insertions(+), 83 deletions(-) mode change 100755 => 100644 CMakeLists.txt mode change 100755 => 100644 include/eventsystem.h mode change 100755 => 100644 packaging/eventsystem.spec mode change 100755 => 100644 src/eventsystem.c diff --git a/CMakeLists.txt b/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/include/eventsystem.h b/include/eventsystem.h old mode 100755 new mode 100644 diff --git a/include/eventsystem_internal.h b/include/eventsystem_internal.h index 358882b..b70a24a 100644 --- a/include/eventsystem_internal.h +++ b/include/eventsystem_internal.h @@ -47,6 +47,7 @@ extern "C" { #define EVT_VAL_BATTERY_CHARGER_DISCONNECTED "disconnected" #define EVT_VAL_BATTERY_CHARGER_CONNECTED "connected" #define EVT_VAL_BATTERY_CHARGER_CHARGING "charging" +#define EVT_VAL_BATTERY_CHARGER_DISCHARGING "discharging" /** battery : level status */ #define SYS_EVENT_BATTERY_LEVEL_STATUS "tizen.system.event.battery_level_status" diff --git a/packaging/eventsystem.spec b/packaging/eventsystem.spec old mode 100755 new mode 100644 index 9b88f3d..f23d124 --- a/packaging/eventsystem.spec +++ b/packaging/eventsystem.spec @@ -2,7 +2,7 @@ Name: eventsystem Summary: Event system library Version: 0.0.1 Release: 1 -Group: System/Libraries +Group: Application Framework/Libraries License: Apache-2.0 Source0: %{name}-%{version}.tar.gz BuildRequires: cmake @@ -11,7 +11,6 @@ BuildRequires: pkgconfig(bundle) BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(gio-2.0) BuildRequires: pkgconfig(glib-2.0) -BuildRequires: pkgconfig(openssl) BuildRequires: pkgconfig(capi-base-common) Requires(post): /sbin/ldconfig diff --git a/src/eventsystem.c b/src/eventsystem.c old mode 100755 new mode 100644 index 2b02d34..4ed3904 --- a/src/eventsystem.c +++ b/src/eventsystem.c @@ -10,7 +10,6 @@ #include #include #include -#include #include #undef LOG_TAG @@ -57,6 +56,7 @@ pthread_mutex_t send_sync_lock = PTHREAD_MUTEX_INITIALIZER; static GList *system_event_list; static int _initialized; static GHashTable *check_tbl; +static GHashTable *filter_tbl; typedef struct eventmap { char *event_name; @@ -78,7 +78,6 @@ typedef struct eventinfo { char *object_path; char *member_name; bool is_user_event; - gboolean is_trusted; bundle *event_data; } eventinfo_s; @@ -90,10 +89,10 @@ typedef struct sysevent_info { } sysevent_info_s; static sysevent_info_s s_info; -static int __eventsystem_request_event_launch(const char *method_name, - const char *event_name, bundle *data); static int __eventsystem_check_user_send_validation(const char *event_name); static int __eventsystem_requet_destination_list(const char *event_name, GList **dest_list); +static int __eventsystem_check_sender_validation(int sender_pid, + const char *event_name, char **sender); static int __event_compare_name_cb(gconstpointer a, gconstpointer b) { @@ -119,6 +118,45 @@ static void __initialize(void) _initialized = 1; } +static int __eventsystem_get_sender_pid(GDBusConnection *conn, const char *sender_name) +{ + GDBusMessage *msg = NULL; + GDBusMessage *reply = NULL; + GError *err = NULL; + GVariant *body; + int pid = 0; + + msg = g_dbus_message_new_method_call("org.freedesktop.DBus", "/org/freedesktop/DBus", + "org.freedesktop.DBus", "GetConnectionUnixProcessID"); + if (!msg) { + _E("Can't allocate new method call"); + goto out; + } + + g_dbus_message_set_body(msg, g_variant_new("(s)", sender_name)); + reply = g_dbus_connection_send_message_with_reply_sync(conn, msg, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, -1, NULL, NULL, &err); + + if (!reply) { + if (err != NULL) { + _E("Failed to get pid [%s]", err->message); + g_error_free(err); + } + goto out; + } + + body = g_dbus_message_get_body(reply); + g_variant_get(body, "(u)", &pid); + +out: + if (msg) + g_object_unref(msg); + if (reply) + g_object_unref(reply); + + return pid; +} + static char *__get_object_path(char *interface_name) { int i; @@ -145,35 +183,27 @@ static char *__get_object_path(char *interface_name) static char *__get_encoded_interface_name(char *interface_name) { - unsigned char c[MD5_DIGEST_LENGTH] = {0, }; - char *md5_evtid = NULL; - char *temp; - int index = 0; - MD5_CTX mdContext; - - MD5_Init(&mdContext); - MD5_Update(&mdContext, interface_name, strlen(interface_name)); - MD5_Final(c, &mdContext); - - md5_evtid = (char *)calloc(EVENT_SYSTEM_PREFIX_LEN + (MD5_DIGEST_LENGTH * 2) + 1, - sizeof(char)); - if (md5_evtid == NULL) { - _D("Malloc failed!!"); - return NULL; - } - - sprintf(md5_evtid, "%s", EVENT_SYSTEM_PREFIX); + char *evtid = NULL; + int evtid_len = 0; + gchar *encoded_value; - temp = md5_evtid; + encoded_value = g_compute_checksum_for_string(G_CHECKSUM_MD5, + interface_name, strlen(interface_name)); - temp += EVENT_SYSTEM_PREFIX_LEN; + evtid_len = EVENT_SYSTEM_PREFIX_LEN + strlen(encoded_value) + 1; - for (index = 0; index < MD5_DIGEST_LENGTH; index++) { - sprintf(temp, "%02x", c[index]); - temp += 2; + evtid = (char *)calloc(evtid_len, sizeof(char)); + if (evtid == NULL) { + _D("memory alloc failed"); + g_free(encoded_value); + return NULL; } - return md5_evtid; + snprintf(evtid, evtid_len, "%s%s", EVENT_SYSTEM_PREFIX, (char *)encoded_value); + + g_free(encoded_value); + + return evtid; } static char *__get_member_name_from_eventname(char *event_name) @@ -182,6 +212,7 @@ static char *__get_member_name_from_eventname(char *event_name) char *ptr_last = NULL; char *temp_name = NULL; char *member_name = NULL; + char *save_ptr = NULL; int count = 0; temp_name = strdup(event_name); @@ -190,7 +221,7 @@ static char *__get_member_name_from_eventname(char *event_name) return NULL; } - ptr = strtok(temp_name, "."); + ptr = strtok_r(temp_name, ".", &save_ptr); if (ptr == NULL) { _E("invalid event_name(%s), count(%d)", event_name, count); FREE_AND_NULL(temp_name); @@ -199,7 +230,7 @@ static char *__get_member_name_from_eventname(char *event_name) count++; while (count < MAX_COUNT_FOR_EVENTNAME_CHECK) { - ptr = strtok(NULL, "."); + ptr = strtok_r(NULL, ".", &save_ptr); if (ptr == NULL) break; /* _D("(%d)ptr(%s)(%d)", count, ptr, strlen(ptr)); */ @@ -230,6 +261,42 @@ static char *__get_member_name_from_eventname(char *event_name) return member_name; } +static int __check_validation_usrevent_sender(int sender_pid, + const char *interface_name, const char *event_name) +{ + char *sender_id = NULL; + char *key = NULL; + char *val = NULL; + + if (__eventsystem_check_sender_validation(sender_pid, + event_name, &sender_id) < 0) { + _E("invalid user-event sender"); + return ES_R_EINVAL; + } + + if (sender_id == NULL) { + _E("sender_id is null"); + return ES_R_EINVAL; + } + + key = strdup(interface_name); + if (key == NULL) { + _E("out of memory"); + return ES_R_ENOMEM; + } + + val = strdup(sender_id); + if (val == NULL) { + _E("out of memory"); + free(key); + return ES_R_ENOMEM; + } + + g_hash_table_insert(filter_tbl, key, val); + + return ES_R_OK; +} + static int __check_validation_user_defined_name(const char *event_name) { char *event_id = NULL; @@ -260,6 +327,18 @@ static int __check_validation_user_defined_name(const char *event_name) return ret; } +static int __check_interface_validation_user(char *interface_name) +{ + int ret = 1; + int len = strlen(EVENT_SYSTEM_PREFIX); + + if (strncmp(interface_name, EVENT_SYSTEM_PREFIX, len) != 0) { + ret = 0; + } + + return ret; +} + static int __check_eventname_validation_user(char *event_name) { int ret = 1; @@ -385,7 +464,6 @@ static void __eventsystem_event_handler(GDBusConnection *connection, GList *cb_list = NULL; bundle *buf = NULL; bundle_raw *raw = NULL; - gboolean is_trusted = FALSE; em.interface_name = (char *)interface_name; em.member_name = (char *)signal_name; @@ -399,7 +477,7 @@ static void __eventsystem_event_handler(GDBusConnection *connection, return; } - g_variant_get(parameters, "(bus)", &is_trusted, &len, &raw); + g_variant_get(parameters, "(us)", &len, &raw); buf = bundle_decode((bundle_raw *)raw, len); @@ -413,8 +491,7 @@ static void __eventsystem_event_handler(GDBusConnection *connection, bundle_free(buf); } -static void __eventsystem_application_event_handler(GDBusConnection *connection, - const gchar *sender_name, const gchar *object_path, +static void __eventsystem_application_event_handler(int sender_pid, const gchar *interface_name, const gchar *signal_name, GVariant *parameters, gpointer user_data) { @@ -426,19 +503,25 @@ static void __eventsystem_application_event_handler(GDBusConnection *connection, em.interface_name = (char *)interface_name; em.member_name = (char *)signal_name; - _D("sender_name(%s), interface_name(%s), signal_name(%s)", - sender_name, interface_name, signal_name); - cb_list = g_list_find_custom(system_event_list, &em, (GCompareFunc)__event_compare_name_cb); if (cb_list == NULL) { + _E("not interested event"); return; } - g_variant_get(parameters, "(bus)", NULL, &len, &raw); - em.event_name = ((eventmap_s *)cb_list->data)->event_name; + + if (sender_pid > 0 && __check_interface_validation_user((char *)interface_name)) { + if (__check_validation_usrevent_sender(sender_pid, + (const char *)interface_name, em.event_name) < 0) { + _E("invalid sender"); + return; + } + } + + g_variant_get(parameters, "(us)", &len, &raw); em.es_cb = ((eventmap_s *)cb_list->data)->es_cb; if (em.es_cb) { em.es_cb(em.event_name, raw, len, user_data); @@ -455,14 +538,28 @@ static void __eventsystem_filter_userevent_for_application(GDBusConnection *conn const gchar *interface_name, const gchar *signal_name, GVariant *parameters, gpointer user_data) { - gboolean is_trusted = FALSE; + char *sender_id = NULL; + int sender_pid = -1; _D("sender_name(%s), interface_name(%s)", sender_name, interface_name); - g_variant_get(parameters, "(bus)", &is_trusted, NULL, NULL); + if (filter_tbl == NULL) { + filter_tbl = g_hash_table_new(g_str_hash, g_str_equal); + } - __eventsystem_application_event_handler(connection, sender_name, - object_path, interface_name, signal_name, parameters, user_data); + sender_id = (char *)g_hash_table_lookup(filter_tbl, interface_name); + + if (sender_id == NULL) { + sender_pid = __eventsystem_get_sender_pid(connection, sender_name); + if (sender_pid <= 0) { + _E("failed to get pid of sender(%s)", sender_name); + return; + } + _D("sender_pid(%d)", sender_pid); + } + + __eventsystem_application_event_handler(sender_pid, interface_name, + signal_name, parameters, user_data); } /** @@ -475,8 +572,8 @@ static void __eventsystem_filter_sysevent_for_application(GDBusConnection *conne { _D("sender_name(%s), interface_name(%s)", sender_name, interface_name); - __eventsystem_application_event_handler(connection, sender_name, - object_path, interface_name, signal_name, parameters, user_data); + __eventsystem_application_event_handler(-1, interface_name, + signal_name, parameters, user_data); } /** @@ -730,7 +827,7 @@ int eventsystem_unregister_event(unsigned int reg_id) return ES_R_OK; } -static int eventsystem_send_event(GDBusConnection *conn, eventinfo_s *evti, bundle *data) +static int __eventsystem_send_event(GDBusConnection *conn, eventinfo_s *evti, bundle *data) { GError *error = NULL; GVariant *param = NULL; @@ -742,10 +839,7 @@ static int eventsystem_send_event(GDBusConnection *conn, eventinfo_s *evti, bund bundle_encode(buf, &raw, &len); - if (!evti->is_user_event) - evti->is_trusted = FALSE; - - param = g_variant_new("(bus)", evti->is_trusted, len, raw); + param = g_variant_new("(us)", len, raw); ret = g_dbus_connection_emit_signal(conn, evti->destination_name, evti->object_path, @@ -781,7 +875,6 @@ static int __eventsystem_send_trusted_event(GDBusConnection *conn, eventinfo_s * { GList *tmp_list = NULL; int ret = 0; - int real_sent = 0; if (dest_list) { tmp_list = g_list_first(dest_list); @@ -791,22 +884,16 @@ static int __eventsystem_send_trusted_event(GDBusConnection *conn, eventinfo_s * if (dest_name && dest_name[0] != '\0') { _D("dest_name(%s)", dest_name); evti->destination_name = dest_name; - ret = eventsystem_send_event(conn, evti, data); + ret = __eventsystem_send_event(conn, evti, data); if (ret != ES_R_OK) { _E("send error"); ret = ES_R_ERROR; break; } - real_sent = 1; } tmp_list = g_list_next(tmp_list); } g_list_free_full(dest_list, __eventsystem_free_trusted_list); - - if (real_sent) { - __eventsystem_request_event_launch("RequestTrustedEventLaunch", - evti->event_name, data); - } } else { _E("dest_list is null"); } @@ -867,11 +954,10 @@ int eventsystem_send_user_event(const char *event_name, bundle *data, bool is_tr evti->destination_name = NULL; evti->is_user_event = true; - evti->is_trusted = (gboolean)is_trusted; GDBusConnection *conn = NULL; if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SESSION, ES_TYPE_USER) == ES_R_OK) { - if (evti->is_trusted) { + if (is_trusted) { GList *dest_list = NULL; ret = __eventsystem_requet_destination_list(evti->event_name, &dest_list); if (ret < 0) { @@ -882,11 +968,7 @@ int eventsystem_send_user_event(const char *event_name, bundle *data, bool is_tr data, dest_list); } } else { - ret = eventsystem_send_event(conn, evti, data); - if (ret == ES_R_OK) { - __eventsystem_request_event_launch("RequestEventLaunch", - evti->event_name, data); - } + ret = __eventsystem_send_event(conn, evti, data); } } else { _E("getting gdbus-connetion error"); @@ -966,11 +1048,10 @@ int eventsystem_send_system_event(const char *event_name, bundle *data) } evti->destination_name = NULL; evti->is_user_event = false; - evti->is_trusted = FALSE; GDBusConnection *conn = NULL; if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) == ES_R_OK) { - ret = eventsystem_send_event(conn, evti, data); + ret = __eventsystem_send_event(conn, evti, data); } else { _E("getting gdbus-connection error"); ret = ES_R_ERROR; @@ -1061,20 +1142,16 @@ out_1: return ret; } -static int __eventsystem_request_event_launch(const char *method_name, - const char *event_name, bundle *data) +static int __eventsystem_check_sender_validation(int sender_pid, const char *event_name, + char **sender_id) { - int ret = 0; + int ret = ES_R_EINVAL; GDBusConnection *conn = NULL; GError *error = NULL; GDBusProxy *proxy = NULL; GVariant *param = NULL; GVariant *value = NULL; gint result = 0; - bundle_raw *raw = NULL; - int len = 0; - - _D("event_name(%s)", event_name); if (!_initialized) { __initialize(); @@ -1097,10 +1174,8 @@ static int __eventsystem_request_event_launch(const char *method_name, goto out_1; } - bundle_encode(data, &raw, &len); - - param = g_variant_new("(ssi)", event_name, raw, len); - value = g_dbus_proxy_call_sync(proxy, method_name, param, + param = g_variant_new("(is)", sender_pid, event_name); + value = g_dbus_proxy_call_sync(proxy, "CheckSenderValidation", param, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); if (error != NULL) { _E("proxy call sync error(%s)", error->message); @@ -1109,12 +1184,13 @@ static int __eventsystem_request_event_launch(const char *method_name, goto out_2; } - g_variant_get(value, "(i)", &result); + g_variant_get(value, "(is)", &result, sender_id); _D("result(%d)", result); - ret = ES_R_OK; - + if (result == 1) { + ret = ES_R_OK; + } out_2: g_variant_unref(value); out_1: @@ -1692,6 +1768,29 @@ int eventsystem_application_finalize(void) g_hash_table_unref(check_tbl); } + if (filter_tbl) { + GHashTableIter iter; + + g_hash_table_iter_init(&iter, filter_tbl); + + while (g_hash_table_iter_next(&iter, &key, &value)) { + char *key_item = (char *)key; + if (key_item) { + free(key_item); + } else { + _E("filter_tbl, key_item is NULL"); + } + char *val_item = (char *)value; + if (val_item) { + free(val_item); + } else { + _E("filter_tbl, val_item is NULL"); + } + g_hash_table_iter_remove(&iter); + } + g_hash_table_unref(filter_tbl); + } + FREE_AND_NULL(s_info.own_name_system_bus); FREE_AND_NULL(s_info.own_name_session_bus); -- 2.7.4 From 13b10c39fff21cbd3633545b0ce3571457d2242b Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Fri, 27 Nov 2015 00:54:05 +0900 Subject: [PATCH 02/16] change owning name for dbus policy Change-Id: Ie78815debd2bc62b6393747320274adcd3b3b519 Signed-off-by: jongmyeongko --- src/eventsystem.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/eventsystem.c b/src/eventsystem.c index 4ed3904..1753e7e 100644 --- a/src/eventsystem.c +++ b/src/eventsystem.c @@ -393,9 +393,9 @@ static int __get_gdbus_shared_connection(GDBusConnection **connection, GBusType _E("failed to get guid"); return ES_R_ERROR; } - snprintf(own_name, 128, "%s_%s_%s_%d", "event.busname", + snprintf(own_name, 128, "%s.%s.id%s_%d_%d", "event.busname", (bus_type == G_BUS_TYPE_SESSION ? "session" : "system"), - guid, getpid()); + guid, getuid(), getpid()); g_free(guid); _D("bus_name is [%s]", own_name); -- 2.7.4 From ee586d724ba72533f730ac40e82582df0363b512 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Tue, 15 Dec 2015 19:46:31 +0900 Subject: [PATCH 03/16] Apply coding rule Change-Id: I7df3e5aa9ffe648f2eab3cb1ed4b24a4ead23b1a Signed-off-by: Hwankyu Jhun --- src/eventsystem.c | 195 +++++++++++++++++++++--------------------------------- 1 file changed, 76 insertions(+), 119 deletions(-) diff --git a/src/eventsystem.c b/src/eventsystem.c index 1753e7e..1cef92c 100644 --- a/src/eventsystem.c +++ b/src/eventsystem.c @@ -160,7 +160,7 @@ out: static char *__get_object_path(char *interface_name) { int i; - char *object_path = (char *)calloc(strlen(interface_name), sizeof(char)+2); + char *object_path = (char *)calloc(strlen(interface_name), sizeof(char) + 2); if (object_path == NULL) { _E("failed to allocate memory"); @@ -169,13 +169,11 @@ static char *__get_object_path(char *interface_name) object_path[0] = '/'; - for (i = 0 ; interface_name[i] ; i++) { - - if (interface_name[i] == '.') { - object_path[i+1] = '/'; - } else { - object_path[i+1] = interface_name[i]; - } + for (i = 0; interface_name[i]; i++) { + if (interface_name[i] == '.') + object_path[i + 1] = '/'; + else + object_path[i + 1] = interface_name[i]; } return object_path; @@ -303,12 +301,10 @@ static int __check_validation_user_defined_name(const char *event_name) char *key = NULL; int ret = 1; - if (check_tbl == NULL) { + if (check_tbl == NULL) check_tbl = g_hash_table_new(g_str_hash, g_str_equal); - } event_id = (char *)g_hash_table_lookup(check_tbl, event_name); - if (event_id == NULL) { if (__eventsystem_check_user_send_validation(event_name) < 0) { _E("invalid user-event name"); @@ -329,38 +325,32 @@ static int __check_validation_user_defined_name(const char *event_name) static int __check_interface_validation_user(char *interface_name) { - int ret = 1; int len = strlen(EVENT_SYSTEM_PREFIX); - if (strncmp(interface_name, EVENT_SYSTEM_PREFIX, len) != 0) { - ret = 0; - } + if (strncmp(interface_name, EVENT_SYSTEM_PREFIX, len) != 0) + return 0; - return ret; + return 1; } static int __check_eventname_validation_user(char *event_name) { - int ret = 1; int len = strlen(USER_EVENT_NAME_PREFIX); - if (strncmp(event_name, USER_EVENT_NAME_PREFIX, len) != 0) { - ret = 0; - } + if (strncmp(event_name, USER_EVENT_NAME_PREFIX, len) != 0) + return 0; - return ret; + return 1; } static int __check_eventname_validation_system(char *event_name) { - int ret = 1; int len = strlen(SYS_EVENT_NAME_PREFIX); - if (strncmp(event_name, SYS_EVENT_NAME_PREFIX, len) != 0) { - ret = 0; - } + if (strncmp(event_name, SYS_EVENT_NAME_PREFIX, len) != 0) + return 0; - return ret; + return 1; } static int __get_gdbus_shared_connection(GDBusConnection **connection, GBusType bus_type, @@ -368,10 +358,12 @@ static int __get_gdbus_shared_connection(GDBusConnection **connection, GBusType { GError *error = NULL; guint owner_id = 0; + gchar *guid = NULL; + char own_name[128] = {0, }; + GDBusConnection *conn_system = NULL; - if (!_initialized) { + if (!_initialized) __initialize(); - } *connection = g_bus_get_sync(bus_type, NULL, &error); if (*connection == NULL) { @@ -385,9 +377,6 @@ static int __get_gdbus_shared_connection(GDBusConnection **connection, GBusType if (((bus_type == G_BUS_TYPE_SYSTEM && !s_info.owner_id) || (bus_type == G_BUS_TYPE_SESSION && !s_info.owner_id_session))) { - gchar *guid = NULL; - char own_name[128] = {0, }; - guid = g_dbus_generate_guid(); if (guid == NULL) { _E("failed to get guid"); @@ -409,8 +398,6 @@ static int __get_gdbus_shared_connection(GDBusConnection **connection, GBusType if (bus_type == G_BUS_TYPE_SESSION && event_type == ES_TYPE_USER) { /* set same name on system-bus */ - GDBusConnection *conn_system = NULL; - error = NULL; conn_system = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); if (conn_system == NULL) { @@ -473,9 +460,8 @@ static void __eventsystem_event_handler(GDBusConnection *connection, cb_list = g_list_find_custom(system_event_list, &em, (GCompareFunc)__event_compare_name_cb); - if (cb_list == NULL) { + if (cb_list == NULL) return; - } g_variant_get(parameters, "(us)", &len, &raw); @@ -483,9 +469,8 @@ static void __eventsystem_event_handler(GDBusConnection *connection, em.event_name = ((eventmap_s *)cb_list->data)->event_name; em.ep_cb = ((eventmap_s *)cb_list->data)->ep_cb; - if (em.ep_cb) { + if (em.ep_cb) em.ep_cb(em.event_name, buf, user_data); - } bundle_free_encoded_rawdata(&raw); bundle_free(buf); @@ -523,9 +508,8 @@ static void __eventsystem_application_event_handler(int sender_pid, g_variant_get(parameters, "(us)", &len, &raw); em.es_cb = ((eventmap_s *)cb_list->data)->es_cb; - if (em.es_cb) { + if (em.es_cb) em.es_cb(em.event_name, raw, len, user_data); - } bundle_free_encoded_rawdata(&raw); } @@ -543,12 +527,10 @@ static void __eventsystem_filter_userevent_for_application(GDBusConnection *conn _D("sender_name(%s), interface_name(%s)", sender_name, interface_name); - if (filter_tbl == NULL) { + if (filter_tbl == NULL) filter_tbl = g_hash_table_new(g_str_hash, g_str_equal); - } sender_id = (char *)g_hash_table_lookup(filter_tbl, interface_name); - if (sender_id == NULL) { sender_pid = __eventsystem_get_sender_pid(connection, sender_name); if (sender_pid <= 0) { @@ -741,9 +723,8 @@ out_3: out_2: FREE_AND_NULL(interface_name); out_1: - if (conn) { + if (conn) g_object_unref(conn); - } return ret; } @@ -762,12 +743,10 @@ int eventsystem_register_event(const char *event_name, unsigned int *reg_id, retvm_if(!reg_id, ES_R_EINVAL, "Invalid argument : reg_id"); retvm_if(!callback, ES_R_EINVAL, "Invalid argument : callback"); - if (!_initialized) { + if (!_initialized) __initialize(); - } ret = __eventsystem_register_event_internal(event_name, &em, user_data); - if (ret == ES_R_OK && em) { em->ep_cb = callback; system_event_list = g_list_append(system_event_list, em); @@ -794,9 +773,8 @@ int eventsystem_unregister_event(unsigned int reg_id) retvm_if(reg_id == 0, ES_R_EINVAL, "Invalid argument : reg_id"); - if (!_initialized) { + if (!_initialized) __initialize(); - } em.reg_id = reg_id; cb_list = g_list_find_custom(system_event_list, &em, @@ -875,12 +853,13 @@ static int __eventsystem_send_trusted_event(GDBusConnection *conn, eventinfo_s * { GList *tmp_list = NULL; int ret = 0; + char *dest_name; if (dest_list) { tmp_list = g_list_first(dest_list); while (tmp_list != NULL) { - char *dest_name = (char *)tmp_list->data; + dest_name = (char *)tmp_list->data; if (dest_name && dest_name[0] != '\0') { _D("dest_name(%s)", dest_name); evti->destination_name = dest_name; @@ -907,6 +886,7 @@ static int __eventsystem_send_trusted_event(GDBusConnection *conn, eventinfo_s * int eventsystem_send_user_event(const char *event_name, bundle *data, bool is_trusted) { int ret = 0; + eventinfo_s *evti = NULL; /* check validation */ retvm_if(!event_name, ES_R_EINVAL, "Invalid argument : event_name is NULL"); @@ -919,7 +899,6 @@ int eventsystem_send_user_event(const char *event_name, bundle *data, bool is_tr return ES_R_EINVAL; } - eventinfo_s *evti = NULL; evti = calloc(1, sizeof(eventinfo_s)); if (!evti) { _E("memory alloc failed"); @@ -975,9 +954,9 @@ int eventsystem_send_user_event(const char *event_name, bundle *data, bool is_tr ret = ES_R_ERROR; } - if (conn) { + if (conn) g_object_unref(conn); - } + FREE_AND_NULL(evti->object_path); out_4: FREE_AND_NULL(evti->member_name); @@ -997,6 +976,8 @@ out_1: int eventsystem_send_system_event(const char *event_name, bundle *data) { int ret = 0; + eventinfo_s *evti = NULL; + GDBusConnection *conn = NULL; pthread_mutex_lock(&send_sync_lock); @@ -1010,7 +991,6 @@ int eventsystem_send_system_event(const char *event_name, bundle *data) _D("event_name(%s)", event_name); - eventinfo_s *evti = NULL; evti = calloc(1, sizeof(eventinfo_s)); if (!evti) { _E("memory alloc failed"); @@ -1049,7 +1029,6 @@ int eventsystem_send_system_event(const char *event_name, bundle *data) evti->destination_name = NULL; evti->is_user_event = false; - GDBusConnection *conn = NULL; if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) == ES_R_OK) { ret = __eventsystem_send_event(conn, evti, data); } else { @@ -1057,9 +1036,9 @@ int eventsystem_send_system_event(const char *event_name, bundle *data) ret = ES_R_ERROR; } - if (conn) { + if (conn) g_object_unref(conn); - } + FREE_AND_NULL(evti->object_path); out_4: FREE_AND_NULL(evti->member_name); @@ -1093,9 +1072,8 @@ int eventsystem_request_sending_system_event(const char *event_name, bundle *dat _D("event_name(%s)", event_name); - if (!_initialized) { + if (!_initialized) __initialize(); - } if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) < 0) { _E("getting gdbus-connetion error"); @@ -1135,9 +1113,8 @@ int eventsystem_request_sending_system_event(const char *event_name, bundle *dat out_2: g_variant_unref(value); out_1: - if (conn) { + if (conn) g_object_unref(conn); - } return ret; } @@ -1153,9 +1130,8 @@ static int __eventsystem_check_sender_validation(int sender_pid, const char *eve GVariant *value = NULL; gint result = 0; - if (!_initialized) { + if (!_initialized) __initialize(); - } if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) < 0) { _E("getting gdbus-connetion error"); @@ -1188,15 +1164,13 @@ static int __eventsystem_check_sender_validation(int sender_pid, const char *eve _D("result(%d)", result); - if (result == 1) { + if (result == 1) ret = ES_R_OK; - } out_2: g_variant_unref(value); out_1: - if (conn) { + if (conn) g_object_unref(conn); - } return ret; } @@ -1211,9 +1185,8 @@ static int __eventsystem_check_user_send_validation(const char *event_name) GVariant *value = NULL; gint result = 0; - if (!_initialized) { + if (!_initialized) __initialize(); - } if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) < 0) { _E("getting gdbus-connetion error"); @@ -1246,15 +1219,13 @@ static int __eventsystem_check_user_send_validation(const char *event_name) _D("result(%d)", result); - if (result == 1) { + if (result == 1) ret = ES_R_OK; - } out_2: g_variant_unref(value); out_1: - if (conn) { + if (conn) g_object_unref(conn); - } return ret; } @@ -1269,9 +1240,8 @@ static int __eventsystem_check_privilege_validation(const char *event_name) GVariant *value = NULL; gint result = 0; - if (!_initialized) { + if (!_initialized) __initialize(); - } if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) < 0) { _E("getting gdbus-connetion error"); @@ -1304,15 +1274,13 @@ static int __eventsystem_check_privilege_validation(const char *event_name) _D("result(%d)", result); - if (result == 1) { + if (result == 1) ret = ES_R_OK; - } out_2: g_variant_unref(value); out_1: - if (conn) { + if (conn) g_object_unref(conn); - } return ret; } @@ -1327,9 +1295,8 @@ static int __eventsystem_setup_trusted_peer(const char *event_name, const char * GVariant *value = NULL; gint result = 0; - if (!_initialized) { + if (!_initialized) __initialize(); - } if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) < 0) { _E("getting gdbus-connetion error"); @@ -1363,15 +1330,13 @@ static int __eventsystem_setup_trusted_peer(const char *event_name, const char * _D("result(%d)", result); - if (result == 1) { + if (result == 1) ret = ES_R_OK; - } out_2: g_variant_unref(value); out_1: - if (conn) { + if (conn) g_object_unref(conn); - } return ret; } @@ -1389,9 +1354,8 @@ static int __eventsystem_requet_destination_list(const char *event_name, GList * char *dest_name = NULL; gint result = 0; - if (!_initialized) { + if (!_initialized) __initialize(); - } if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) < 0) { _E("getting gdbus-connetion error"); @@ -1444,9 +1408,8 @@ static int __eventsystem_requet_destination_list(const char *event_name, GList * out_2: g_variant_unref(value); out_1: - if (conn) { + if (conn) g_object_unref(conn); - } return ret; } @@ -1460,13 +1423,13 @@ static int __eventsystem_request_earlier_data(const char *event_name, GError *error = NULL; GDBusProxy *proxy = NULL; GVariant *param = NULL; + GVariant *value = NULL; gint result = 0; bundle_raw *raw = NULL; int len = 0; - if (!_initialized) { + if (!_initialized) __initialize(); - } if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, ES_TYPE_SYSTEM) < 0) { _E("getting gdbus-connetion error"); @@ -1487,7 +1450,7 @@ static int __eventsystem_request_earlier_data(const char *event_name, } param = g_variant_new("(s)", event_name); - GVariant *value = g_dbus_proxy_call_sync(proxy, "GetEarlierData", param, + value = g_dbus_proxy_call_sync(proxy, "GetEarlierData", param, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); if (error != NULL) { _E("proxy call sync error(%s)", error->message); @@ -1511,9 +1474,8 @@ static int __eventsystem_request_earlier_data(const char *event_name, out_2: g_variant_unref(value); out_1: - if (conn) { + if (conn) g_object_unref(conn); - } return ret; } @@ -1533,9 +1495,8 @@ int eventsystem_register_application_event(const char *event_name, unsigned int int ret = 0; GDBusConnection *conn = NULL; - if (!_initialized) { + if (!_initialized) __initialize(); - } if (__check_eventname_validation_system((char *)event_name)) { if (__eventsystem_check_privilege_validation(event_name) != ES_R_OK) { @@ -1687,9 +1648,8 @@ int eventsystem_register_application_event(const char *event_name, unsigned int FREE_AND_NULL(interface_name); FREE_AND_NULL(object_path); FREE_AND_NULL(member_name); - if (conn) { + if (conn) g_object_unref(conn); - } return ret; } @@ -1705,9 +1665,8 @@ int eventsystem_unregister_application_event(unsigned int reg_id) retvm_if(reg_id == 0, ES_R_EINVAL, "Invalid argument : reg_id"); - if (!_initialized) { + if (!_initialized) __initialize(); - } em.reg_id = reg_id; cb_list = g_list_find_custom(system_event_list, &em, @@ -1743,49 +1702,47 @@ int eventsystem_unregister_application_event(unsigned int reg_id) int eventsystem_application_finalize(void) { - gpointer key, value; + gpointer key; + gpointer value; + GHashTableIter iter; + char *key_item; + char *val_item; _D("release all resouces"); - if (system_event_list) { + if (system_event_list) g_list_free(system_event_list); - } if (check_tbl) { - GHashTableIter iter; - g_hash_table_iter_init(&iter, check_tbl); while (g_hash_table_iter_next(&iter, &key, &value)) { - char *val_item = (char *)value; - if (val_item) { + val_item = (char *)value; + if (val_item) free(val_item); - } else { + else _E("check_tbl, val_item is NULL"); - } g_hash_table_iter_remove(&iter); } g_hash_table_unref(check_tbl); } if (filter_tbl) { - GHashTableIter iter; - g_hash_table_iter_init(&iter, filter_tbl); while (g_hash_table_iter_next(&iter, &key, &value)) { - char *key_item = (char *)key; - if (key_item) { + key_item = (char *)key; + if (key_item) free(key_item); - } else { + else _E("filter_tbl, key_item is NULL"); - } - char *val_item = (char *)value; - if (val_item) { + + val_item = (char *)value; + if (val_item) free(val_item); - } else { + else _E("filter_tbl, val_item is NULL"); - } + g_hash_table_iter_remove(&iter); } g_hash_table_unref(filter_tbl); -- 2.7.4 From 77f7c036710e57b1222e64f14e75aa3c0db39819 Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Mon, 15 Feb 2016 16:19:24 +0900 Subject: [PATCH 04/16] add new system-event : network_status Change-Id: Ie7d61439a4264c04c616a5cc648e8debc4583887 Signed-off-by: jongmyeongko --- include/eventsystem_internal.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/include/eventsystem_internal.h b/include/eventsystem_internal.h index b70a24a..544e851 100644 --- a/include/eventsystem_internal.h +++ b/include/eventsystem_internal.h @@ -267,6 +267,18 @@ extern "C" { * font name of string type by font-config. */ +/** network : connection type */ +#define SYS_EVENT_NETWORK_STATUS "tizen.system.event.network_status" +/* key */ +#define EVT_KEY_NETWORK_STATUS "network_status" +/* value */ +#define EVT_VAL_NETWORK_DISCONNECTED "disconnected" +#define EVT_VAL_NETWORK_WIFI "wifi" +#define EVT_VAL_NETWORK_CELLULAR "cellular" +#define EVT_VAL_NETWORK_ETHERNET "ethernet" +#define EVT_VAL_NETWORK_BT "bt" +#define EVT_VAL_NETWORK_NET_PROXY "net_proxy" + #ifdef __cplusplus } #endif -- 2.7.4 From 00e4a2ed3edb3aaef89a03a9402587fee94c9cca Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Wed, 16 Mar 2016 21:24:17 +0900 Subject: [PATCH 05/16] add new system-event (outgoing msg) Change-Id: I291323be11cff585551093669130bd51a49635ae Signed-off-by: jongmyeongko --- include/eventsystem_internal.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/include/eventsystem_internal.h b/include/eventsystem_internal.h index 544e851..4cd65f6 100644 --- a/include/eventsystem_internal.h +++ b/include/eventsystem_internal.h @@ -174,6 +174,19 @@ extern "C" { *"{unsigned int value}" : new message id */ +/** message : outgoing msg */ +#define SYS_EVENT_OUTGOING_MSG "tizen.system.event.outgoing_msg" +/* key */ +#define EVT_KEY_OUT_MSG_TYPE "msg_type" +/* value */ +#define EVT_VAL_OUT_MSG_SMS "sms" +#define EVT_VAL_OUT_MSG_MMS "mms" +/* key */ +#define EVT_KEY_OUT_MSG_ID "msg_id" +/* value description + *"{unsigned int value}" : new message id + */ + /** setting : time changed */ #define SYS_EVENT_TIME_CHANGED "tizen.system.event.time_changed" /* key */ -- 2.7.4 From ba8c375c5c67db319b97db9cf5d1164a99236493 Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Thu, 17 Mar 2016 09:23:18 +0900 Subject: [PATCH 06/16] add mms value for incoming_msg event Change-Id: I4ba30714b94f012d809618ec4dee1d275a259f4f Signed-off-by: jongmyeongko --- include/eventsystem_internal.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/eventsystem_internal.h b/include/eventsystem_internal.h index 4cd65f6..154e2cb 100644 --- a/include/eventsystem_internal.h +++ b/include/eventsystem_internal.h @@ -166,6 +166,7 @@ extern "C" { #define EVT_KEY_MSG_TYPE "msg_type" /* value */ #define EVT_VAL_SMS "sms" +#define EVT_VAL_MMS "mms" #define EVT_VAL_PUSH "push" #define EVT_VAL_CB "cb" /* key */ -- 2.7.4 From ecd5ee1e74538f83a71c4714ade2a8279ccbcaf5 Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Fri, 12 Feb 2016 14:27:57 +0900 Subject: [PATCH 07/16] fix g_varinent_get related leak Change-Id: Ic49c6928a6d7dcc601475e755f37b9e75b36e5c8 Signed-off-by: jongmyeongko --- include/eventsystem.h | 8 -------- src/eventsystem.c | 12 ++++++++++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/include/eventsystem.h b/include/eventsystem.h index ae4b723..e6e1467 100644 --- a/include/eventsystem.h +++ b/include/eventsystem.h @@ -45,14 +45,6 @@ typedef enum _eventsystem_event_type { ES_TYPE_SYSTEM /* system event */ } eventsystem_event_type; -#define FREE_AND_NULL(ptr) do { \ - if (ptr) { \ - free((void *)ptr); \ - ptr = NULL; \ - } \ -} while (0) - - /** * APIs for Application Framework. */ diff --git a/src/eventsystem.c b/src/eventsystem.c index 1cef92c..6b61845 100644 --- a/src/eventsystem.c +++ b/src/eventsystem.c @@ -23,6 +23,13 @@ #define VALID_LAST_COUNT_FOR_EVENTNAME (VALID_COUNT_OF_EVENTNAME_TOKEN + 1) #define MAX_COUNT_FOR_EVENTNAME_CHECK (VALID_LAST_COUNT_FOR_EVENTNAME + 1) +#define FREE_AND_NULL(ptr) do { \ + if (ptr) { \ + free((void *)ptr); \ + ptr = NULL; \ + } \ +} while (0) + #define _E(fmt, arg...) LOGE(fmt, ##arg) #define _D(fmt, arg...) LOGD(fmt, ##arg) #define _W(fmt, arg...) LOGW(fmt, ##arg) @@ -280,6 +287,7 @@ static int __check_validation_usrevent_sender(int sender_pid, key = strdup(interface_name); if (key == NULL) { _E("out of memory"); + g_free(sender_id); return ES_R_ENOMEM; } @@ -287,10 +295,12 @@ static int __check_validation_usrevent_sender(int sender_pid, if (val == NULL) { _E("out of memory"); free(key); + g_free(sender_id); return ES_R_ENOMEM; } g_hash_table_insert(filter_tbl, key, val); + g_free(sender_id); return ES_R_OK; } @@ -1316,7 +1326,6 @@ static int __eventsystem_setup_trusted_peer(const char *event_name, const char * } param = g_variant_new("(ss)", event_name, dest_bus_name); - value = g_dbus_proxy_call_sync(proxy, "SetupTrustedPeer", param, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); if (error != NULL) { @@ -1375,7 +1384,6 @@ static int __eventsystem_requet_destination_list(const char *event_name, GList * } param = g_variant_new("(s)", event_name); - value = g_dbus_proxy_call_sync(proxy, "GetTrustedPeerList", param, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); if (error != NULL) { -- 2.7.4 From d20cbfa6da9ec348df0a7b1356502892ed62bd5a Mon Sep 17 00:00:00 2001 From: Jiwoong Im Date: Wed, 6 Apr 2016 19:13:01 +0900 Subject: [PATCH 08/16] fix memory problem - access ptr_last after free temp_name Change-Id: Ic075c1b38c96fb5df9d122f22fde5ff65b5183af Signed-off-by: Jiwoong Im --- src/eventsystem.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/eventsystem.c b/src/eventsystem.c index 6b61845..99d72c1 100644 --- a/src/eventsystem.c +++ b/src/eventsystem.c @@ -242,10 +242,10 @@ static char *__get_member_name_from_eventname(char *event_name) ptr_last = ptr; count++; } - FREE_AND_NULL(temp_name); if (count != VALID_LAST_COUNT_FOR_EVENTNAME) { _E("invalid event_name(%s), count(%d)", event_name, count); + FREE_AND_NULL(temp_name); return NULL; } @@ -254,15 +254,18 @@ static char *__get_member_name_from_eventname(char *event_name) member_name = strdup(ptr_last); if (!member_name) { _E("out_of_memory"); + FREE_AND_NULL(temp_name); return NULL; } } else { _E("ptr_last is NULL"); + FREE_AND_NULL(temp_name); return NULL; } _D("member_name(%s)", member_name); + FREE_AND_NULL(temp_name); return member_name; } -- 2.7.4 From 1e4b42f70ebca5ce16c7b1a4283d63634b388d5c Mon Sep 17 00:00:00 2001 From: Jiwoong Im Date: Wed, 29 Jun 2016 22:49:14 +0900 Subject: [PATCH 09/16] add eventsystem_keep_last_event_data api - To keep last event data for future event receiver Change-Id: Ib7b72fc44977a7f61c9ec6cb6011a03d181d7e71 Signed-off-by: Jiwoong Im --- include/eventsystem.h | 4 + include/eventsystem_internal.h | 7 ++ src/eventsystem.c | 252 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 261 insertions(+), 2 deletions(-) diff --git a/include/eventsystem.h b/include/eventsystem.h index e6e1467..90cbb79 100644 --- a/include/eventsystem.h +++ b/include/eventsystem.h @@ -161,6 +161,10 @@ API int eventsystem_send_system_event(const char *event_name, bundle *data); */ API int eventsystem_request_sending_system_event(const char *event_name, bundle *data); +/** + * function : Request to keep last event data + */ +API int eventsystem_keep_last_event_data(const char *event_name); #ifdef __cplusplus } diff --git a/include/eventsystem_internal.h b/include/eventsystem_internal.h index 154e2cb..ccbc2de 100644 --- a/include/eventsystem_internal.h +++ b/include/eventsystem_internal.h @@ -39,6 +39,13 @@ extern "C" { #define EVT_VAL_ESD_STARTED "started" #define EVT_VAL_ESD_STOPPED "stopped" +/** esd : for sending saved event date request */ +#define SYS_EVENT_REQUEST_LAST_DATA "tizen.system.event.request_last_data" +/* key */ +#define EVT_KEY_KEPT_EVENT_NAME "kept_event_name" +#define EVT_KEY_KEPT_OWN_NAME "kept_own_name" +#define EVT_KEY_KEPT_IS_TRUSTED "kept_is_trusted" + /** battery : charger status */ #define SYS_EVENT_BATTERY_CHARGER_STATUS "tizen.system.event.battery_charger_status" /* key */ diff --git a/src/eventsystem.c b/src/eventsystem.c index 99d72c1..963e974 100644 --- a/src/eventsystem.c +++ b/src/eventsystem.c @@ -64,6 +64,13 @@ static GList *system_event_list; static int _initialized; static GHashTable *check_tbl; static GHashTable *filter_tbl; +static GHashTable *last_data_tbl; + +struct last_data_item { + char *event_name; + GVariant *param; + GVariant *trusted_param; +}; typedef struct eventmap { char *event_name; @@ -85,6 +92,7 @@ typedef struct eventinfo { char *object_path; char *member_name; bool is_user_event; + bool is_trusted; bundle *event_data; } eventinfo_s; @@ -843,14 +851,14 @@ static int __eventsystem_send_event(GDBusConnection *conn, eventinfo_s *evti, bu _D("object_path(%s)", evti->object_path); _D("member_name(%s)", evti->member_name); - bundle_free_encoded_rawdata(&raw); - if (ret == FALSE) { _E("Unable to connect to dbus: %s", error->message); g_error_free(error); return ES_R_ERROR; } + bundle_free_encoded_rawdata(&raw); + return ES_R_OK; } @@ -900,6 +908,9 @@ int eventsystem_send_user_event(const char *event_name, bundle *data, bool is_tr { int ret = 0; eventinfo_s *evti = NULL; + struct last_data_item *item; + bundle_raw *raw = NULL; + int len; /* check validation */ retvm_if(!event_name, ES_R_EINVAL, "Invalid argument : event_name is NULL"); @@ -946,6 +957,7 @@ int eventsystem_send_user_event(const char *event_name, bundle *data, bool is_tr evti->destination_name = NULL; evti->is_user_event = true; + evti->is_trusted = is_trusted; GDBusConnection *conn = NULL; if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SESSION, ES_TYPE_USER) == ES_R_OK) { @@ -962,6 +974,27 @@ int eventsystem_send_user_event(const char *event_name, bundle *data, bool is_tr } else { ret = __eventsystem_send_event(conn, evti, data); } + + if (bundle_encode(data, &raw, &len)) { + _E("Unable to encode bundle"); + ret = ES_R_ERROR; + goto out_5; + } + + item = (struct last_data_item *)g_hash_table_lookup(last_data_tbl, + evti->event_name); + if (item) { + if (!evti->is_trusted) { + if (item->param) + g_variant_unref(item->param); + item->param = g_variant_new("(us)", len, raw); + } + if (item->trusted_param) + g_variant_unref(item->trusted_param); + item->trusted_param = g_variant_new("(us)", len, raw); + } + + bundle_free_encoded_rawdata(&raw); } else { _E("getting gdbus-connetion error"); ret = ES_R_ERROR; @@ -970,6 +1003,7 @@ int eventsystem_send_user_event(const char *event_name, bundle *data, bool is_tr if (conn) g_object_unref(conn); +out_5: FREE_AND_NULL(evti->object_path); out_4: FREE_AND_NULL(evti->member_name); @@ -1492,6 +1526,198 @@ out_1: } #endif +static int __request_esd_for_last_data(const char *event_name, bool check) +{ + int ret = 0; + GDBusConnection *conn = NULL; + GError *error = NULL; + GDBusProxy *proxy = NULL; + GVariant *param = NULL; + GVariant *value = NULL; + gint result = 0; + + if (!_initialized) + __initialize(); + + if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SYSTEM, + ES_TYPE_SYSTEM) < 0) { + _E("getting gdbus-connetion error"); + ret = ES_R_ERROR; + goto out_1; + } + + proxy = g_dbus_proxy_new_sync(conn, + G_DBUS_PROXY_FLAGS_NONE, NULL, + ESD_BUS_NAME, ESD_OBJECT_PATH, ESD_INTERFACE_NAME, + NULL, &error); + + if (proxy == NULL) { + _E("failed to create new proxy, error(%s)", error->message); + g_error_free(error); + ret = ES_R_ERROR; + goto out_1; + } + + param = g_variant_new("(ss)", event_name, + check ? s_info.own_name_session_bus : + s_info.own_name_system_bus); + value = g_dbus_proxy_call_sync(proxy, + check ? "CheckLastData" : "KeepLastData", param, + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); + + if (error != NULL) { + _E("proxy call sync error(%s)", error->message); + g_error_free(error); + ret = ES_R_ERROR; + goto out_2; + } + + g_variant_get(value, "(i)", &result); + + _D("result(%d)", result); + + ret = result; + +out_2: + g_variant_unref(value); +out_1: + if (conn) + g_object_unref(conn); + + return ret; +} + +static void _send_last_user_event(const char *event_name, + bundle *data, void *user_data) +{ + GDBusConnection *conn = NULL; + GError *error = NULL; + eventinfo_s *evti = NULL; + int ret; + struct last_data_item *item; + const char *is_trusted; + + _D("send last data"); + + if (g_strcmp0(event_name, SYS_EVENT_REQUEST_LAST_DATA) != 0) + return; + + evti = calloc(1, sizeof(eventinfo_s)); + if (!evti) { + _E("memory alloc failed"); + return; + } + + evti->event_name = (char *)bundle_get_val(data, + EVT_KEY_KEPT_EVENT_NAME); + if (!evti->event_name) { + _E("memory alloc failed"); + goto out_1; + } + + item = (struct last_data_item *)g_hash_table_lookup(last_data_tbl, + evti->event_name); + if (!item) + goto out_1; + + evti->interface_name = __get_encoded_interface_name(evti->event_name); + if (!evti->interface_name) { + _E("interface_name is NULL"); + goto out_1; + } + + evti->member_name = strdup(EVENT_SYSTEM_MEMBER); + if (!evti->member_name) { + _E("memory alloc failed"); + goto out_2; + } + + evti->object_path = __get_object_path(evti->interface_name); + if (!evti->object_path) { + _E("object_path is NULL"); + goto out_3; + } + + evti->destination_name = (char *)bundle_get_val(data, + EVT_KEY_KEPT_OWN_NAME); + if (!evti->destination_name) { + _E("object_path is NULL"); + goto out_4; + } + + is_trusted = bundle_get_val(data, EVT_KEY_KEPT_IS_TRUSTED); + if (!is_trusted) { + _E("object_path is NULL"); + goto out_4; + } + + if (strncmp("true", is_trusted, sizeof("true")) != 0) { + if (!item->trusted_param) + goto out_4; + evti->is_trusted = true; + } else { + if (!item->param) + goto out_4; + evti->is_trusted = false; + } + + if (__get_gdbus_shared_connection(&conn, G_BUS_TYPE_SESSION, + ES_TYPE_USER) == ES_R_OK) { + ret = g_dbus_connection_emit_signal(conn, + evti->destination_name, + evti->object_path, + evti->interface_name, + evti->member_name, + evti->is_trusted ? item->trusted_param : item->param, + &error); + if (ret == FALSE) { + _E("Unable to connect to dbus: %s", error->message); + g_error_free(error); + } + } + + if (conn) + g_object_unref(conn); + +out_4: + FREE_AND_NULL(evti->object_path); +out_3: + FREE_AND_NULL(evti->member_name); +out_2: + FREE_AND_NULL(evti->interface_name); +out_1: + FREE_AND_NULL(evti); +} + +int eventsystem_keep_last_event_data(const char *event_name) +{ + int ret = 0; + unsigned int reg_id; + struct last_data_item *item; + + if (last_data_tbl == NULL) + last_data_tbl = g_hash_table_new(g_str_hash, g_str_equal); + + ret = __request_esd_for_last_data(event_name, false); + if (ret != ES_R_OK) + return ret; + + item = calloc(1, sizeof(*item)); + if (!item) + return ES_R_ENOMEM; + + item->event_name = strdup(event_name); + item->param = NULL; + item->trusted_param = NULL; + + g_hash_table_insert(last_data_tbl, (char *)event_name, item); + + ret = eventsystem_register_event(SYS_EVENT_REQUEST_LAST_DATA, + ®_id, _send_last_user_event, NULL); + + return ret; +} + int eventsystem_register_application_event(const char *event_name, unsigned int *reg_id, int *event_type, eventsystem_cb callback, void *user_data) { @@ -1662,6 +1888,8 @@ int eventsystem_register_application_event(const char *event_name, unsigned int if (conn) g_object_unref(conn); + __request_esd_for_last_data(event_name, true); + return ret; } @@ -1759,6 +1987,26 @@ int eventsystem_application_finalize(void) g_hash_table_unref(filter_tbl); } + if (last_data_tbl) { + g_hash_table_iter_init(&iter, last_data_tbl); + + while (g_hash_table_iter_next(&iter, &key, &value)) { + key_item = (char *)key; + if (key_item) + free(key_item); + else + _E("last_data_tbl, val_item is NULL"); + + val_item = (char *)value; + if (val_item) + free(val_item); + else + _E("last_data_tbl, val_item is NULL"); + g_hash_table_iter_remove(&iter); + } + g_hash_table_unref(check_tbl); + } + FREE_AND_NULL(s_info.own_name_system_bus); FREE_AND_NULL(s_info.own_name_session_bus); -- 2.7.4 From 488a44820e019dda774d4339bc3e5757bd97f502 Mon Sep 17 00:00:00 2001 From: Jiwoong Im Date: Fri, 18 Nov 2016 10:43:49 +0900 Subject: [PATCH 10/16] Fix CMakeLists.txt To make extendible for adding source & header files. Change-Id: Ibb73e9f65212fc384393cc4a1fee5a743e26946d Signed-off-by: Jiwoong Im --- CMakeLists.txt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 08cad00..e44e3be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) PROJECT(eventsystem C) +AUX_SOURCE_DIRECTORY(src/ SRCS) SET(VERSION 0.0.1) SET(VERSION_MAJOR 0) @@ -35,9 +36,7 @@ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed") ## build eventsystem library -add_library(eventsystem SHARED - src/eventsystem.c - ) +add_library(eventsystem SHARED ${SRCS}) #TARGET_LINK_LIBRARIES(eventsystem "-ldl") TARGET_LINK_LIBRARIES(eventsystem ${libpkgs_LDFLAGS}) @@ -50,5 +49,7 @@ configure_file(eventsystem.manifest.in eventsystem.manifest @ONLY) INSTALL(TARGETS eventsystem DESTINATION ${LIB_INSTALL_DIR} COMPONENT RuntimeLibraries) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/eventsystem.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/eventsystem.h DESTINATION include) -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/eventsystem_internal.h DESTINATION include) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/include/ DESTINATION include/ + FILES_MATCHING + PATTERN "*.h" + ) -- 2.7.4 From be37651f61d590983489063e78e13f27212f0d5d Mon Sep 17 00:00:00 2001 From: Jiwoong Im Date: Thu, 22 Dec 2016 08:14:50 +0900 Subject: [PATCH 11/16] Fix memory leak - Fix memory leak in using g_dbus_proxy_new_sync() API Change-Id: I2344392d63dddea0f13d1469b51feea297dbd586 Signed-off-by: Jiwoong Im --- src/eventsystem.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/eventsystem.c b/src/eventsystem.c index 963e974..cc316b0 100644 --- a/src/eventsystem.c +++ b/src/eventsystem.c @@ -1158,6 +1158,7 @@ int eventsystem_request_sending_system_event(const char *event_name, bundle *dat ret = ES_R_OK; out_2: + g_object_unref(proxy); g_variant_unref(value); out_1: if (conn) @@ -1214,6 +1215,7 @@ static int __eventsystem_check_sender_validation(int sender_pid, const char *eve if (result == 1) ret = ES_R_OK; out_2: + g_object_unref(proxy); g_variant_unref(value); out_1: if (conn) @@ -1269,6 +1271,7 @@ static int __eventsystem_check_user_send_validation(const char *event_name) if (result == 1) ret = ES_R_OK; out_2: + g_object_unref(proxy); g_variant_unref(value); out_1: if (conn) @@ -1324,6 +1327,7 @@ static int __eventsystem_check_privilege_validation(const char *event_name) if (result == 1) ret = ES_R_OK; out_2: + g_object_unref(proxy); g_variant_unref(value); out_1: if (conn) @@ -1379,6 +1383,7 @@ static int __eventsystem_setup_trusted_peer(const char *event_name, const char * if (result == 1) ret = ES_R_OK; out_2: + g_object_unref(proxy); g_variant_unref(value); out_1: if (conn) @@ -1451,6 +1456,7 @@ static int __eventsystem_requet_destination_list(const char *event_name, GList * g_variant_iter_free(iter); out_2: + g_object_unref(proxy); g_variant_unref(value); out_1: if (conn) @@ -1517,6 +1523,7 @@ static int __eventsystem_request_earlier_data(const char *event_name, ret = ES_R_OK; out_2: + g_object_unref(proxy); g_variant_unref(value); out_1: if (conn) @@ -1579,6 +1586,7 @@ static int __request_esd_for_last_data(const char *event_name, bool check) ret = result; out_2: + g_object_unref(proxy); g_variant_unref(value); out_1: if (conn) -- 2.7.4 From 23792796e351e43b004d5877420565a881bb2fa7 Mon Sep 17 00:00:00 2001 From: Jiwoong Im Date: Thu, 29 Dec 2016 16:16:10 +0900 Subject: [PATCH 12/16] Fix double free - g_variant_free is called repeatedly. Change-Id: I0b74943a1a68fa3e78527ed1024c674232df2749 Signed-off-by: Jiwoong Im --- src/eventsystem.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/eventsystem.c b/src/eventsystem.c index cc316b0..e51db0b 100644 --- a/src/eventsystem.c +++ b/src/eventsystem.c @@ -1511,7 +1511,6 @@ static int __eventsystem_request_earlier_data(const char *event_name, } g_variant_get(value, "(iis)", &result, &len, &raw); - g_variant_unref(value); _D("result(%d), len(%d)", result, len); -- 2.7.4 From a0741f99a3780f4a000f69433891044dd2a24844 Mon Sep 17 00:00:00 2001 From: Jiwoong Im Date: Fri, 24 Feb 2017 12:53:49 +0900 Subject: [PATCH 13/16] Release version 0.1.0 - Fix double free - Fix memory leak Change-Id: Ifbbbb47928d7db7132d3a917564c3c36e6d2b85b Signed-off-by: Jiwoong Im --- CMakeLists.txt | 7 ++----- packaging/eventsystem.spec | 6 ++++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e44e3be..5a43a4b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,9 +3,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) PROJECT(eventsystem C) AUX_SOURCE_DIRECTORY(src/ SRCS) -SET(VERSION 0.0.1) -SET(VERSION_MAJOR 0) - SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(EXEC_PREFIX "\${prefix}") SET(LIBDIR "\${prefix}/lib") @@ -40,8 +37,8 @@ add_library(eventsystem SHARED ${SRCS}) #TARGET_LINK_LIBRARIES(eventsystem "-ldl") TARGET_LINK_LIBRARIES(eventsystem ${libpkgs_LDFLAGS}) -SET_TARGET_PROPERTIES(eventsystem PROPERTIES SOVERSION ${VERSION_MAJOR}) -SET_TARGET_PROPERTIES(eventsystem PROPERTIES VERSION ${VERSION}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION ${MAJORVER}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES VERSION ${FULLVER}) # pkgconfig file CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/eventsystem.pc.in ${CMAKE_BINARY_DIR}/eventsystem.pc @ONLY) diff --git a/packaging/eventsystem.spec b/packaging/eventsystem.spec index f23d124..d384fdb 100644 --- a/packaging/eventsystem.spec +++ b/packaging/eventsystem.spec @@ -1,6 +1,6 @@ Name: eventsystem Summary: Event system library -Version: 0.0.1 +Version: 0.1.0 Release: 1 Group: Application Framework/Libraries License: Apache-2.0 @@ -35,8 +35,10 @@ export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE" export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE" export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE" +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` + +%cmake . -DFULLVER=%{version} -DMAJORVER=${MAJORVER} -%cmake . make %{?jobs:-j%jobs} %install -- 2.7.4 From 07f7405da8fa1ff5f44feb9e1bb859629a2819d7 Mon Sep 17 00:00:00 2001 From: Jiwoong Im Date: Fri, 24 Mar 2017 08:36:48 +0900 Subject: [PATCH 14/16] Set license using %license macro Change-Id: I84b05029636160eabb08ac7f35726eee2eefaa26 Signed-off-by: Jiwoong Im --- packaging/eventsystem.spec | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packaging/eventsystem.spec b/packaging/eventsystem.spec index d384fdb..76d5262 100644 --- a/packaging/eventsystem.spec +++ b/packaging/eventsystem.spec @@ -45,9 +45,6 @@ make %{?jobs:-j%jobs} rm -rf %{buildroot} %make_install -mkdir -p %{buildroot}/usr/share/license -cp LICENSE %{buildroot}/usr/share/license/%{name} - %post -p /sbin/ldconfig %postun -p /sbin/ldconfig @@ -56,7 +53,7 @@ cp LICENSE %{buildroot}/usr/share/license/%{name} %manifest eventsystem.manifest %defattr(-,root,root,-) %{_libdir}/libeventsystem.so.* -/usr/share/license/%{name} +%license LICENSE %files devel %defattr(-,root,root,-) -- 2.7.4 From ab0c46b6b1cf8c36a1c38f072a52080fa993324b Mon Sep 17 00:00:00 2001 From: Jiwoong Im Date: Mon, 27 Mar 2017 18:31:36 +0900 Subject: [PATCH 15/16] Release version 0.1.1 Changes: - Set license using %license macro Change-Id: I8d29f1f56eedda36b8e146039774fcb8fb8f9a06 Signed-off-by: Jiwoong Im --- packaging/eventsystem.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/eventsystem.spec b/packaging/eventsystem.spec index 76d5262..f395496 100644 --- a/packaging/eventsystem.spec +++ b/packaging/eventsystem.spec @@ -1,6 +1,6 @@ Name: eventsystem Summary: Event system library -Version: 0.1.0 +Version: 0.1.1 Release: 1 Group: Application Framework/Libraries License: Apache-2.0 -- 2.7.4 From b150ed52f6e1bf3c921ac42fe83092f6de339b90 Mon Sep 17 00:00:00 2001 From: jusung son Date: Tue, 10 Oct 2017 18:01:05 +0900 Subject: [PATCH 16/16] Fix memory leak Change-Id: Ib81bbeabfcd374de1e505b05d93d876686863b2c Signed-off-by: jusung son --- src/eventsystem.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) mode change 100644 => 100755 src/eventsystem.c diff --git a/src/eventsystem.c b/src/eventsystem.c old mode 100644 new mode 100755 index e51db0b..56d210c --- a/src/eventsystem.c +++ b/src/eventsystem.c @@ -851,14 +851,14 @@ static int __eventsystem_send_event(GDBusConnection *conn, eventinfo_s *evti, bu _D("object_path(%s)", evti->object_path); _D("member_name(%s)", evti->member_name); + bundle_free_encoded_rawdata(&raw); + if (ret == FALSE) { _E("Unable to connect to dbus: %s", error->message); g_error_free(error); return ES_R_ERROR; } - bundle_free_encoded_rawdata(&raw); - return ES_R_OK; } @@ -1717,7 +1717,7 @@ int eventsystem_keep_last_event_data(const char *event_name) item->param = NULL; item->trusted_param = NULL; - g_hash_table_insert(last_data_tbl, (char *)event_name, item); + g_hash_table_insert(last_data_tbl, item->event_name, item); ret = eventsystem_register_event(SYS_EVENT_REQUEST_LAST_DATA, ®_id, _send_last_user_event, NULL); @@ -1953,6 +1953,7 @@ int eventsystem_application_finalize(void) GHashTableIter iter; char *key_item; char *val_item; + struct last_data_item *last_item; _D("release all resouces"); @@ -1998,20 +1999,21 @@ int eventsystem_application_finalize(void) g_hash_table_iter_init(&iter, last_data_tbl); while (g_hash_table_iter_next(&iter, &key, &value)) { - key_item = (char *)key; - if (key_item) - free(key_item); - else - _E("last_data_tbl, val_item is NULL"); - - val_item = (char *)value; - if (val_item) - free(val_item); - else + last_item = (struct last_data_item *)value; + if (last_item) { + if (last_item->event_name) + free(last_item->event_name); + if (last_item->param) + g_variant_unref(last_item->param); + if (last_item->trusted_param) + g_variant_unref(last_item->trusted_param); + free(last_item); + } else { _E("last_data_tbl, val_item is NULL"); + } g_hash_table_iter_remove(&iter); } - g_hash_table_unref(check_tbl); + g_hash_table_unref(last_data_tbl); } FREE_AND_NULL(s_info.own_name_system_bus); -- 2.7.4