Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit de717d55 authored by Mark Salyzyn's avatar Mark Salyzyn Committed by android-build-merger
Browse files

Merge \\\\"logd: auditd: suppress multiple identical avc: messages to...

Merge \\\\"logd: auditd: suppress multiple identical avc: messages to kmsg\\\\" am: 02ccdc5d am: 8e7e71c5 am: 7e0c62d3
am: 505fb5a0

Change-Id: I593498b94e5e09c25b83f69d9ea57b473e6c2feb
parents 2b82d116 505fb5a0
Loading
Loading
Loading
Loading
+66 −10
Original line number Diff line number Diff line
@@ -102,17 +102,73 @@ int LogAudit::logPrint(const char *fmt, ...) {
        struct iovec iov[3];
        static const char log_info[] = { KMSG_PRIORITY(LOG_INFO) };
        static const char log_warning[] = { KMSG_PRIORITY(LOG_WARNING) };
        static const char newline[] = "\n";

        // Dedupe messages, checking for identical messages starting with avc:
        static unsigned count;
        static char *last_str;
        static bool last_info;

        if (last_str != NULL) {
            static const char avc[] = "): avc: ";
            char *avcl = strstr(last_str, avc);
            bool skip = false;

            if (avcl) {
                char *avcr = strstr(str, avc);

                skip = avcr && !strcmp(avcl + strlen(avc), avcr + strlen(avc));
                if (skip) {
                    ++count;
                    free(last_str);
                    last_str = strdup(str);
                    last_info = info;
                }
            }
            if (!skip) {
                static const char resume[] = " duplicate messages suppressed\n";

                iov[0].iov_base = last_info ?
                    const_cast<char *>(log_info) :
                    const_cast<char *>(log_warning);
                iov[0].iov_len = last_info ?
                    sizeof(log_info) :
                    sizeof(log_warning);
                iov[1].iov_base = last_str;
                iov[1].iov_len = strlen(last_str);
                if (count > 1) {
                    iov[2].iov_base = const_cast<char *>(resume);
                    iov[2].iov_len = strlen(resume);
                } else {
                    iov[2].iov_base = const_cast<char *>(newline);
                    iov[2].iov_len = strlen(newline);
                }

        iov[0].iov_base = info ? const_cast<char *>(log_info)
                               : const_cast<char *>(log_warning);
        iov[0].iov_len = info ? sizeof(log_info) : sizeof(log_warning);
                writev(fdDmesg, iov, sizeof(iov) / sizeof(iov[0]));
                free(last_str);
                last_str = NULL;
            }
        }
        if (last_str == NULL) {
            count = 0;
            last_str = strdup(str);
            last_info = info;
        }
        if (count == 0) {
            iov[0].iov_base = info ?
                const_cast<char *>(log_info) :
                const_cast<char *>(log_warning);
            iov[0].iov_len = info ?
                sizeof(log_info) :
                sizeof(log_warning);
            iov[1].iov_base = str;
            iov[1].iov_len = strlen(str);
        iov[2].iov_base = const_cast<char *>("\n");
        iov[2].iov_len = 1;
            iov[2].iov_base = const_cast<char *>(newline);
            iov[2].iov_len = strlen(newline);

            writev(fdDmesg, iov, sizeof(iov) / sizeof(iov[0]));
        }
    }

    pid_t pid = getpid();
    pid_t tid = gettid();