From 124ebf0d9d208b2a4b6007ec57857650d9a2bba2 Mon Sep 17 00:00:00 2001 From: Inkyun Kil Date: Mon, 9 Sep 2019 12:58:14 +0900 Subject: Change return values - When registering once alarm with wrong time, return false. Change-Id: Ia07692887dfc5aba3576c3ec9465b290d0cb047f Signed-off-by: Inkyun Kil --- alarm-manager.c | 275 +++++++++++++++++++++++++------------------------------- 1 file changed, 121 insertions(+), 154 deletions(-) diff --git a/alarm-manager.c b/alarm-manager.c index 7e7b3c6..7753cc5 100644 --- a/alarm-manager.c +++ b/alarm-manager.c @@ -156,6 +156,7 @@ static bool __alarm_update(uid_t uid, int pid, alarm_id_t alarm_id, alarm_info_t *alarm_info, int update_flag, int *error_code); static void __alarm_send_noti_to_application(const char *app_service_name, alarm_id_t alarm_id, int msec, uid_t uid); static void __alarm_expired(); +static gboolean __alarm_expired_directly(gpointer user_data); static gboolean __alarm_handler_idle(gpointer user_data); static void __on_system_time_external_changed(keynode_t *node, void *data); static void __initialize_timer(); @@ -942,13 +943,103 @@ static void __set_caller_info(bundle *b, int pid, uid_t uid, } } -static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id, - long requested_interval, uid_t uid, int pid, char *bundle_data, int *error_code) +static bool __alarm_add_and_set(__alarm_info_t *alarm_info) { time_t current_time; time_t due_time; struct tm ts_ret; char due_time_r[100] = { 0 }; + + time(¤t_time); + + SECURE_LOGW("[alarm-server]:pid=%d, app_unique_name=%s, \ + app_service_name=%s,dst_service_name=%s, c_due_time=%ld", + alarm_info->pid, alarm_info->app_unique_name, + alarm_info->app_service_name, + alarm_info->dst_service_name, + alarm_context.c_due_time); + + if (alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) + alarm_info->alarm_info.reserved_info = current_time; + + if (alarm_context.c_due_time < current_time) { + ALARM_MGR_EXCEPTION_PRINT("Caution!! alarm_context.c_due_time \ + (%ld) is less than current time(%ld)", alarm_context.c_due_time, current_time); + alarm_context.c_due_time = -1; + } + + due_time = _alarm_next_duetime(alarm_info); + + if (due_time == 0) { + ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create a new alarm: \ + due_time is 0. [alarm(%d):repeat_type(%d)]", + alarm_info->alarm_id, alarm_info->alarm_info.mode.repeat); + + if (alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) + return false; + + __alarm_add_to_list(alarm_info); + return true; + } else if (current_time == due_time) { + ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create alarm: \ + current_time(%ld) is same as due_time(%ld) [alarm(%d):repeat_type(%d)]", + current_time, due_time, alarm_info->alarm_id, alarm_info->alarm_info.mode.repeat); + + __alarm_add_to_list(alarm_info); + _clear_scheduled_alarm_list(); + _add_to_scheduled_alarm_list(alarm_info); + alarm_context.c_due_time = due_time; + + time_t *_dt = malloc(sizeof(time_t)); + if (_dt) { + *_dt = due_time; + } else { + ALARM_MGR_EXCEPTION_PRINT("Out of memory"); + return false; + } + + g_idle_add(__alarm_expired_directly, (gpointer)_dt); + + return true; + } else if (difftime(due_time, current_time) < 0) { + ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: Expired Due Time. \ + [Due time=%ld, Current Time=%ld]!!!Do not add to schedule list. \ + [alarm(%d):repeat_type(%d)]", + due_time, current_time, alarm_info->alarm_id, alarm_info->alarm_info.mode.repeat); + + if (alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) + return false; + + __alarm_add_to_list(alarm_info); + return true; + } else { + localtime_r(&due_time, &ts_ret); + strftime(due_time_r, 30, "%c", &ts_ret); + SECURE_LOGD("[alarm-server]:Create a new alarm: alarm(%d) due_time(%s)", + alarm_info->alarm_id, due_time_r); + + __alarm_add_to_list(alarm_info); + } + + ALARM_MGR_LOG_PRINT("[alarm-server]:alarm_context.c_due_time(%ld), due_time(%ld)", + alarm_context.c_due_time, due_time); + + if (alarm_context.c_due_time == -1 || due_time < alarm_context.c_due_time) { + _clear_scheduled_alarm_list(); + _add_to_scheduled_alarm_list(alarm_info); + _alarm_set_timer(&alarm_context, alarm_context.timer, due_time); + alarm_context.c_due_time = due_time; + __rtc_set(); + } else if (due_time == alarm_context.c_due_time) { + _add_to_scheduled_alarm_list(alarm_info); + } + + return true; +} + +static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id, + long requested_interval, uid_t uid, int pid, char *bundle_data, int *error_code) +{ char app_name[512] = { 0 }; bundle *b; const char *callee_appid = NULL; @@ -1028,55 +1119,16 @@ static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t)); __alarm_generate_alarm_id(__alarm_info, alarm_id); - time(¤t_time); - - if (__alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) - __alarm_info->alarm_info.reserved_info = current_time; - - if (alarm_context.c_due_time < current_time) { - ALARM_MGR_EXCEPTION_PRINT("Caution!! alarm_context.c_due_time " - "(%ld) is less than current time(%ld)", alarm_context.c_due_time, current_time); - alarm_context.c_due_time = -1; + if (__alarm_add_and_set(__alarm_info) == false) { + *error_code = ERR_ALARM_INVALID_TIME; + _release_alarm_info_t(__alarm_info); + return false; } - due_time = _alarm_next_duetime(__alarm_info); - __alarm_add_to_list(__alarm_info); - #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG __save_alarm_info_log("CREATE SVC", __alarm_info); #endif - if (due_time == 0) { - ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create a new alarm: " - "due_time is 0, alarm(%d) \n", *alarm_id); - return true; - } else if (current_time == due_time) { - ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create alarm: " - "current_time(%ld) is same as due_time(%ld)", current_time, - due_time); - return true; - } else if (difftime(due_time, current_time) < 0) { - ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: Expired Due Time.[Due time=%ld, Current Time=%ld]!!!Do not add to schedule list\n", due_time, current_time); - return true; - } else { - localtime_r(&due_time, &ts_ret); - strftime(due_time_r, 30, "%c", &ts_ret); - SECURE_LOGD("[alarm-server]:Create a new alarm: " - "alarm(%d) due_time(%s)", *alarm_id, - due_time_r); - } - - ALARM_MGR_LOG_PRINT("[alarm-server]:alarm_context.c_due_time(%ld), due_time(%ld)", alarm_context.c_due_time, due_time); - - if (alarm_context.c_due_time == -1 || due_time < alarm_context.c_due_time) { - _clear_scheduled_alarm_list(); - _add_to_scheduled_alarm_list(__alarm_info); - _alarm_set_timer(&alarm_context, alarm_context.timer, due_time); - alarm_context.c_due_time = due_time; - __rtc_set(); - } else if (due_time == alarm_context.c_due_time) { - _add_to_scheduled_alarm_list(__alarm_info); - } return true; } @@ -1087,8 +1139,6 @@ static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, uid_t const char *dst_service_name, const char *dst_service_name_mod, int *error_code) { - time_t current_time; - time_t due_time; char unique_name[MAX_APP_ID] = { 0 }; char *caller_pkgid = NULL; pkgmgrinfo_pkginfo_h caller_handle; @@ -1145,62 +1195,16 @@ static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, uid_t memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t)); __alarm_generate_alarm_id(__alarm_info, alarm_id); - time(¤t_time); - - if (__alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) - __alarm_info->alarm_info.reserved_info = current_time; - - SECURE_LOGD("[alarm-server]:pid=%d, app_unique_name=%s, " - "app_service_name=%s,dst_service_name=%s, c_due_time=%ld", \ - pid, __alarm_info->app_unique_name, \ - __alarm_info->app_service_name, \ - __alarm_info->dst_service_name, \ - alarm_context.c_due_time); - - if (alarm_context.c_due_time < current_time) { - ALARM_MGR_EXCEPTION_PRINT("Caution!! alarm_context.c_due_time " - "(%ld) is less than current time(%ld)", alarm_context.c_due_time, current_time); - alarm_context.c_due_time = -1; + if (__alarm_add_and_set(__alarm_info) == false) { + *error_code = ERR_ALARM_INVALID_TIME; + _release_alarm_info_t(__alarm_info); + return false; } - due_time = _alarm_next_duetime(__alarm_info); - __alarm_add_to_list(__alarm_info); - #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG __save_alarm_info_log("CREATE", __alarm_info); #endif - if (due_time == 0) { - ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create a new alarm: due_time is 0, alarm(%d).", *alarm_id); - return true; - } else if (current_time == due_time) { - ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create alarm: current_time(%ld) is same as due_time(%ld).", - current_time, due_time); - return true; - } else if (difftime(due_time, current_time) < 0) { - ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: Expired Due Time.[Due time=%ld, Current Time=%ld]!!!Do not add to schedule list.", - due_time, current_time); - return true; - } else { - char due_time_r[100] = { 0 }; - struct tm ts_ret; - localtime_r(&due_time, &ts_ret); - strftime(due_time_r, 30, "%c", &ts_ret); - SECURE_LOGD("[alarm-server]:Create a new alarm: alarm(%d) due_time(%s)", *alarm_id, due_time_r); - } - - ALARM_MGR_LOG_PRINT("[alarm-server]:alarm_context.c_due_time(%ld), due_time(%ld)", alarm_context.c_due_time, due_time); - - if (alarm_context.c_due_time == -1 || due_time < alarm_context.c_due_time) { - _clear_scheduled_alarm_list(); - _add_to_scheduled_alarm_list(__alarm_info); - _alarm_set_timer(&alarm_context, alarm_context.timer, due_time); - alarm_context.c_due_time = due_time; - __rtc_set(); - } else if (due_time == alarm_context.c_due_time) { - _add_to_scheduled_alarm_list(__alarm_info); - } - return true; } @@ -1253,10 +1257,6 @@ end: static bool __alarm_create_noti(alarm_info_t *alarm_info, alarm_id_t *alarm_id, long requested_interval, uid_t uid, int pid, char *noti_data, int *error_code) { - time_t current_time; - time_t due_time; - struct tm ts_ret; - char due_time_r[100] = { 0 }; char app_name[512] = { 0 }; char *caller_pkgid = NULL; pkgmgrinfo_pkginfo_h caller_handle; @@ -1314,60 +1314,16 @@ static bool __alarm_create_noti(alarm_info_t *alarm_info, alarm_id_t *alarm_id, memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t)); __alarm_generate_alarm_id(__alarm_info, alarm_id); - time(¤t_time); - - if (__alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) - __alarm_info->alarm_info.reserved_info = current_time; - - SECURE_LOGD("[alarm-server]:pid=%d, app_unique_name=%s, " - "app_service_name=%s,dst_service_name=%s, c_due_time=%ld", \ - pid, __alarm_info->app_unique_name, \ - __alarm_info->app_service_name, \ - __alarm_info->dst_service_name, \ - alarm_context.c_due_time); - - if (alarm_context.c_due_time < current_time) { - ALARM_MGR_EXCEPTION_PRINT("Caution!! alarm_context.c_due_time " - "(%ld) is less than current time(%ld)", alarm_context.c_due_time, current_time); - alarm_context.c_due_time = -1; + if (__alarm_add_and_set(__alarm_info) == false) { + *error_code = ERR_ALARM_INVALID_TIME; + _release_alarm_info_t(__alarm_info); + return false; } - due_time = _alarm_next_duetime(__alarm_info); - __alarm_add_to_list(__alarm_info); - #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG __save_alarm_info_log("CREATE NOTI", __alarm_info); #endif - if (due_time == 0) { - ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create a new alarm: due_time is 0, alarm(%d).", *alarm_id); - return true; - } else if (current_time == due_time) { - ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Create alarm: current_time(%ld) is same as due_time(%ld).", - current_time, due_time); - return true; - } else if (difftime(due_time, current_time) < 0) { - ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: Expired Due Time.[Due time=%ld, Current Time=%ld]!!!Do not add to schedule list.", - due_time, current_time); - return true; - } else { - localtime_r(&due_time, &ts_ret); - strftime(due_time_r, 30, "%c", &ts_ret); - SECURE_LOGD("[alarm-server]:Create a new alarm: alarm(%d) due_time(%s)", *alarm_id, due_time_r); - } - - ALARM_MGR_LOG_PRINT("[alarm-server]:alarm_context.c_due_time(%ld), due_time(%ld)", alarm_context.c_due_time, due_time); - - if (alarm_context.c_due_time == -1 || due_time < alarm_context.c_due_time) { - _clear_scheduled_alarm_list(); - _add_to_scheduled_alarm_list(__alarm_info); - _alarm_set_timer(&alarm_context, alarm_context.timer, due_time); - alarm_context.c_due_time = due_time; - __rtc_set(); - } else if (due_time == alarm_context.c_due_time) { - _add_to_scheduled_alarm_list(__alarm_info); - } - return true; } @@ -2791,17 +2747,17 @@ static long __get_proper_interval(long interval, int alarm_type) return maxInterval; } -gboolean __alarm_expired_directly(gpointer user_data) +static gboolean __alarm_expired_directly(gpointer user_data) { if (g_scheduled_alarm_list == NULL || g_scheduled_alarm_list->data == NULL) return false; - int time_sec = (int)(intptr_t)user_data; + time_t *time_sec = (time_t *)user_data; __scheduled_alarm_t *alarm = g_scheduled_alarm_list->data; __alarm_info_t *alarm_info = alarm->__alarm_info; /* Expire alarms with duetime equal to newtime by force */ - if (alarm_info->due_time == time_sec) { + if (alarm_info->due_time == *time_sec) { if (__display_lock_state(DEVICED_LCD_OFF, DEVICED_STAY_CUR_STATE, 0) != ALARMMGR_RESULT_SUCCESS) ALARM_MGR_EXCEPTION_PRINT("__display_lock_state() is failed"); @@ -2819,6 +2775,9 @@ gboolean __alarm_expired_directly(gpointer user_data) ALARM_MGR_EXCEPTION_PRINT("__display_unlock_state() is failed"); } + if (time_sec) + free(time_sec); + return false; } @@ -2827,7 +2786,7 @@ void __reschedule_alarms_with_newtime(int cur_time, int new_time, double diff_ti #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; #endif - + time_t *_new_time; vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED, (int)diff_time); bundle *b = NULL; b = bundle_create(); @@ -2851,7 +2810,15 @@ void __reschedule_alarms_with_newtime(int cur_time, int new_time, double diff_ti __save_module_log("CHANGE TIME", log_message); #endif - g_idle_add(__alarm_expired_directly, (gpointer)(intptr_t)new_time); /* Expire alarms with duetime equal to newtime directly */ + _new_time = malloc(sizeof(time_t)); + if (_new_time) { + *_new_time = new_time; + } else { + ALARM_MGR_EXCEPTION_PRINT("Out of memory"); + return; + } + + g_idle_add(__alarm_expired_directly, (gpointer)_new_time); /* Expire alarms with duetime equal to newtime directly */ return; } -- cgit v1.2.3