diff --git a/init/Android.mk b/init/Android.mk index ecdf5db70..111fe895f 100644 --- a/init/Android.mk +++ b/init/Android.mk @@ -54,7 +54,7 @@ LOCAL_SRC_FILES:= \ service.cpp \ util.cpp \ -LOCAL_STATIC_LIBRARIES := libbase libselinux liblog libprocessgroup +LOCAL_STATIC_LIBRARIES := libbase libselinux liblog libprocessgroup libnl LOCAL_WHOLE_STATIC_LIBRARIES := libcap LOCAL_MODULE := libinit LOCAL_SANITIZE := integer @@ -103,7 +103,8 @@ LOCAL_STATIC_LIBRARIES := \ libdl \ libsparse_static \ libz \ - libprocessgroup + libprocessgroup \ + libnl \ # Create symlinks. LOCAL_POST_INSTALL_CMD := $(hide) mkdir -p $(TARGET_ROOT_OUT)/sbin; \ diff --git a/init/log.cpp b/init/log.cpp index 861834011..6b32526df 100644 --- a/init/log.cpp +++ b/init/log.cpp @@ -19,6 +19,8 @@ #include #include +#include +#include #include void InitKernelLogging(char* argv[]) { @@ -38,6 +40,24 @@ void InitKernelLogging(char* argv[]) { android::base::InitLogging(argv, &android::base::KernelLogger); } +static void selinux_avc_log(char* buf, size_t buf_len) { + size_t str_len = strnlen(buf, buf_len); + + // trim newline at end of string + buf[str_len - 1] = '\0'; + + struct nl_sock* sk = nl_socket_alloc(); + if (sk == NULL) { + return; + } + nl_connect(sk, NETLINK_AUDIT); + int result; + do { + result = nl_send_simple(sk, AUDIT_USER_AVC, 0, buf, str_len); + } while (result == -NLE_INTR); + nl_socket_free(sk); +} + int selinux_klog_callback(int type, const char *fmt, ...) { android::base::LogSeverity severity = android::base::ERROR; if (type == SELINUX_WARNING) { @@ -48,8 +68,15 @@ int selinux_klog_callback(int type, const char *fmt, ...) { char buf[1024]; va_list ap; va_start(ap, fmt); - vsnprintf(buf, sizeof(buf), fmt, ap); + int res = vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); - android::base::KernelLogger(android::base::MAIN, severity, "selinux", nullptr, 0, buf); + if (res <= 0) { + return 0; + } + if (type == SELINUX_AVC) { + selinux_avc_log(buf, sizeof(buf)); + } else { + android::base::KernelLogger(android::base::MAIN, severity, "selinux", nullptr, 0, buf); + } return 0; }