#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
+#include <sys/capability.h>
#include <sched.h>
#include <stdbool.h>
#include <malloc.h>
static int __init_label_monitor_fd(void)
{
+ int r;
int fd = -1;
guint pollfd;
- if (security_manager_app_labels_monitor_init(&label_monitor)
- != SECURITY_MANAGER_SUCCESS)
- return -1;
- if (security_manager_app_labels_monitor_process(label_monitor)
- != SECURITY_MANAGER_SUCCESS)
+ r = security_manager_app_labels_monitor_init(&label_monitor);
+ if (r != SECURITY_MANAGER_SUCCESS)
return -1;
- security_manager_app_labels_monitor_get_fd(label_monitor, &fd);
+ r = security_manager_app_labels_monitor_process(label_monitor);
+ if (r != SECURITY_MANAGER_SUCCESS)
+ goto err;
+
+ security_manager_app_labels_monitor_get_fd(label_monitor, &fd);
if (fd < 0) {
_E("failed to get fd");
- return -1;
+ goto err;
}
pollfd = __poll_fd(fd, G_IO_IN,
(GSourceFunc)__handle_label_monitor, 0, 0);
- if (pollfd == 0) {
+ if (pollfd == 0)
+ goto err;
+
+ return 0;
+
+err:
+ if (fd > 0)
close(fd);
+
+ if (label_monitor) {
+ security_manager_app_labels_monitor_finish(label_monitor);
+ label_monitor = NULL;
+ }
+
+ return -1;
+}
+
+static int __verify_loader_caps(const char *loader)
+{
+ cap_t cap_d;
+ cap_flag_value_t eff_state;
+ cap_flag_value_t inh_state;
+ cap_value_t values[] = {CAP_SETGID, CAP_MAC_ADMIN};
+ int r;
+ int i;
+ int size = ARRAY_SIZE(values);
+
+ /* If Dytransition feature is enabled, CAP_MAC_ADMIN is unnecessary */
+ if (label_monitor)
+ size--;
+
+ cap_d = cap_get_file(loader);
+ if (!cap_d) {
+ _E("Failed to get cap from file(%s)", loader);
return -1;
}
+ for (i = 0; i < size; i++) {
+ r = cap_get_flag(cap_d, values[i], CAP_INHERITABLE, &inh_state);
+ if (r != 0) {
+ _E("Failed to get cap inh - errno(%d)", errno);
+ cap_free(cap_d);
+ return -1;
+ }
+
+ r = cap_get_flag(cap_d, values[i], CAP_EFFECTIVE, &eff_state);
+ if (r != 0) {
+ _E("Failed to get cap eff - errno(%d)", errno);
+ cap_free(cap_d);
+ return -1;
+ }
+
+ if ((inh_state != CAP_SET) || (eff_state != CAP_SET)) {
+ _E("The %s doesn't have %d cap", loader, values[i]);
+ cap_free(cap_d);
+ return -1;
+ }
+ }
+ cap_free(cap_d);
+
return 0;
}
}
if (access(info->exe, F_OK | X_OK) == 0) {
+ if (__verify_loader_caps(info->exe) < 0)
+ return;
+
if (info->extra)
bundle_encode(info->extra, &extra, &len);
return -1;
}
- ret = __init_label_monitor_fd();
- if (ret != 0) {
- _E("__init_launchpad_fd() failed");
- return -1;
- }
-
ret = vconf_get_int(VCONFKEY_SETAPPL_APP_HW_ACCELERATION, &__sys_hwacc);
if (ret != VCONF_OK) {
_E("Failed to get vconf int: %s",
VCONFKEY_SETAPPL_APP_HW_ACCELERATION);
}
+ ret = __init_label_monitor_fd();
+ if (ret != 0)
+ _W("Failed to initialize label monitor");
+
__add_default_slots();
launcher_info_list = _launcher_info_load(LAUNCHER_INFO_PATH);