summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorInkyun Kil <inkyun.kil@samsung.com>2018-06-19 16:42:04 +0900
committerInkyun Kil <inkyun.kil@samsung.com>2018-06-20 15:17:08 +0900
commit779713b191cab44516394bd012406ad640172125 (patch)
treee18c68f53916987acbdd502c8d3426ec83cb5a31
parent0ba2f41aff0ffa0b3177411add1c91deab3308d1 (diff)
downloadalarm-manager-779713b191cab44516394bd012406ad640172125.tar.gz
alarm-manager-779713b191cab44516394bd012406ad640172125.tar.bz2
alarm-manager-779713b191cab44516394bd012406ad640172125.zip
Add codes for checking caller
- When an application requests to delete or update an alarm, should be verified that the application is correct Change-Id: Ic947e58a88d4e37fa3ebf61ca9c9f5d4e320f055 Signed-off-by: Inkyun Kil <inkyun.kil@samsung.com>
-rw-r--r--alarm-manager.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/alarm-manager.c b/alarm-manager.c
index b44cb6c..4d3224f 100644
--- a/alarm-manager.c
+++ b/alarm-manager.c
@@ -2778,6 +2778,52 @@ cynara_out:
return ret;
}
+static int __check_modifiable(uid_t uid, pid_t pid, int alarm_id)
+{
+ bool caller_is_app = false;
+ char app_name[MAX_APP_ID] = { 0 };
+ GSList *gs_iter = NULL;
+ __alarm_info_t *entry = NULL;
+ char *caller_pkgid = NULL;
+ pkgmgrinfo_pkginfo_h caller_handle;
+
+ if (__get_cached_unique_name(pid, app_name, sizeof(app_name),
+ &caller_is_app, uid) == false)
+ return ERR_ALARM_SYSTEM_FAIL;
+
+ if (!caller_is_app) {
+ ALARM_MGR_LOG_PRINT("Daemon process is possible to modify alarms[%s]",
+ app_name);
+ return ALARMMGR_RESULT_SUCCESS;
+ } else {
+ if (pkgmgrinfo_appinfo_get_usr_appinfo(app_name, uid, &caller_handle) != PMINFO_R_OK) {
+ ALARM_MGR_EXCEPTION_PRINT("Failed to get appinfo %s", app_name);
+ return ERR_ALARM_SYSTEM_FAIL;
+ } else {
+ if (pkgmgrinfo_appinfo_get_pkgid(caller_handle, &caller_pkgid) != PMINFO_R_OK) {
+ ALARM_MGR_EXCEPTION_PRINT("Failed to get pkgid %s", app_name);
+ pkgmgrinfo_appinfo_destroy_appinfo(caller_handle);
+ return ERR_ALARM_SYSTEM_FAIL;
+ }
+ }
+ }
+
+ for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
+ entry = gs_iter->data;
+ if (entry->uid == uid && entry->alarm_id == alarm_id &&
+ strcmp(caller_pkgid, entry->caller_pkgid) == 0) {
+ ALARM_MGR_LOG_PRINT("Found alarm of app (uid:%d, pid:%d, caller_pkgid:%s) ", uid, pid, caller_pkgid);
+ pkgmgrinfo_appinfo_destroy_appinfo(caller_handle);
+ return ALARMMGR_RESULT_SUCCESS;
+ }
+ }
+
+ ALARM_MGR_EXCEPTION_PRINT("[%s] is not permitted to modify alarm_id[%d]", app_name, alarm_id);
+ pkgmgrinfo_appinfo_destroy_appinfo(caller_handle);
+
+ return ERR_ALARM_NOT_PERMITTED_APP;
+}
+
gboolean alarm_manager_alarm_set_rtc_time(AlarmManager *pObj, GDBusMethodInvocation *invoc,
int year, int mon, int day,
int hour, int min, int sec,
@@ -3419,6 +3465,11 @@ gboolean alarm_manager_alarm_delete(AlarmManager *obj, GDBusMethodInvocation *in
return true;
}
+ return_code = __check_modifiable(uid, pid, alarm_id);
+ if (return_code != ALARMMGR_RESULT_SUCCESS) {
+ g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
+ return true;
+ }
if (!__alarm_delete(uid, alarm_id, &return_code)) {
ALARM_MGR_EXCEPTION_PRINT("Unable to delete the alarm! alarm_id[%d], return_code[%d]", alarm_id, return_code);
@@ -3550,6 +3601,12 @@ gboolean alarm_manager_alarm_update(AlarmManager *pObj, GDBusMethodInvocation *i
return true;
}
+ return_code = __check_modifiable(uid, pid, alarm_id);
+ if (return_code != ALARMMGR_RESULT_SUCCESS) {
+ g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
+ return true;
+ }
+
alarm_info.start.year = start_year;
alarm_info.start.month = start_month;
alarm_info.start.day = start_day;