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

Commit 50e44460 authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Snap for 5450365 from e6ef013d to pi-platform-release

Change-Id: I51d6a1b331634e927247a13a96bfdd10d4e00f4f
parents 5d1d32dc e6ef013d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@ cc_library_static {
        "action.cpp",
        "action_manager.cpp",
        "action_parser.cpp",
        "boringssl_self_test.cpp",
        "bootchart.cpp",
        "builtins.cpp",
        "capabilities.cpp",
+56 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "boringssl_self_test.h"

#include <android-base/logging.h>
#include <cutils/android_reboot.h>
#include <openssl/crypto.h>
#include <sys/types.h>
#include <unistd.h>

namespace android {
namespace init {

Result<Success> StartBoringSslSelfTest(const BuiltinArguments&) {
    pid_t id = fork();

    if (id == 0) {
        if (BORINGSSL_self_test() != 1) {
            LOG(INFO) << "BoringSSL crypto self tests failed";

            // This check has failed, so the device should refuse
            // to boot. Rebooting to bootloader to wait for
            // further action from the user.

            int result =
                android_reboot(ANDROID_RB_RESTART2, 0, "bootloader,boringssl-self-check-failed");
            if (result != 0) {
                LOG(ERROR) << "Failed to reboot into bootloader";
            }
        }

        _exit(0);
    } else if (id == -1) {
        // Failed to fork, so cannot run the test. Refuse to continue.
        PLOG(FATAL) << "Failed to fork for BoringSSL self test";
    }

    return Success();
}

}  // namespace init
}  // namespace android
+28 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include "builtin_arguments.h"
#include "result.h"

namespace android {
namespace init {

Result<Success> StartBoringSslSelfTest(const BuiltinArguments&);

}  // namespace init
}  // namespace android
+4 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@
#include <optional>

#include "action_parser.h"
#include "boringssl_self_test.h"
#include "import_parser.h"
#include "init_first_stage.h"
#include "keychords.h"
@@ -731,6 +732,9 @@ int main(int argc, char** argv) {
    // Trigger all the boot actions to get us started.
    am.QueueEventTrigger("init");

    // Starting the BoringSSL self test, for NIAP certification compliance.
    am.QueueBuiltinAction(StartBoringSslSelfTest, "StartBoringSslSelfTest");

    // Repeat mix_hwrng_into_linux_rng in case /dev/hw_random or /dev/random
    // wasn't ready immediately after wait_for_coldboot_done
    am.QueueBuiltinAction(MixHwrngIntoLinuxRngAction, "MixHwrngIntoLinuxRng");
+42 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

#define LOG_TAG "lowmemorykiller"

#include <dirent.h>
#include <errno.h>
#include <inttypes.h>
#include <sched.h>
@@ -26,15 +27,19 @@
#include <sys/epoll.h>
#include <sys/eventfd.h>
#include <sys/mman.h>
#include <sys/resource.h>
#include <sys/socket.h>
#include <sys/sysinfo.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

#include <cutils/properties.h>
#include <cutils/sched_policy.h>
#include <cutils/sockets.h>
#include <lmkd.h>
#include <log/log.h>
#include <system/thread_defs.h>

#ifdef LMKD_LOG_STATS
#include "statslog.h"
@@ -1029,6 +1034,40 @@ static struct proc *proc_get_heaviest(int oomadj) {
    return maxprocp;
}

static void set_process_group_and_prio(int pid, SchedPolicy sp, int prio) {
    DIR* d;
    char proc_path[PATH_MAX];
    struct dirent* de;

    snprintf(proc_path, sizeof(proc_path), "/proc/%d/task", pid);
    if (!(d = opendir(proc_path))) {
        ALOGW("Failed to open %s; errno=%d: process pid(%d) might have died", proc_path, errno, pid);
        return;
    }

    while ((de = readdir(d))) {
        int t_pid;

        if (de->d_name[0] == '.') continue;
        t_pid = atoi(de->d_name);

        if (!t_pid) {
            ALOGW("Failed to get t_pid for '%s' of pid(%d)", de->d_name, pid);
            continue;
        }

        if (setpriority(PRIO_PROCESS, t_pid, prio) && errno != ESRCH) {
            ALOGW("Unable to raise priority of killing t_pid (%d): errno=%d", t_pid, errno);
        }

        if (set_cpuset_policy(t_pid, sp)) {
            ALOGW("Failed to set_cpuset_policy on pid(%d) t_pid(%d) to %d", pid, t_pid, (int)sp);
            continue;
        }
    }
    closedir(d);
}

static int last_killed_pid = -1;

/* Kill one process specified by procp.  Returns the size of the process killed */
@@ -1069,6 +1108,9 @@ static int kill_one_process(struct proc* procp) {

    /* CAP_KILL required */
    r = kill(pid, SIGKILL);

    set_process_group_and_prio(pid, SP_FOREGROUND, ANDROID_PRIORITY_HIGHEST);

    ALOGI("Kill '%s' (%d), uid %d, oom_adj %d to free %ldkB",
        taskname, pid, uid, procp->oomadj, tasksize * page_k);

Loading