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

Commit a4f008d5 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 10214038 from e067e96d to udc-release

Change-Id: I483e1b5b2732fc0d43222660bc5d930d4171acd7
parents 533e90d9 e067e96d
Loading
Loading
Loading
Loading
+45 −0
Original line number Diff line number Diff line
@@ -2759,3 +2759,48 @@ TEST_F(CrasherTest, logd_skips_reading_logs_not_main_thread) {
  ASSERT_BACKTRACE_FRAME(result, "raise_debugger_signal");
  ASSERT_NOT_MATCH(result, kLogMessage);
}

// Disable this test since there is a high liklihood that this would
// be flaky since it requires 500 messages being in the log.
TEST_F(CrasherTest, DISABLED_max_log_messages) {
  StartProcess([]() {
    for (size_t i = 0; i < 600; i++) {
      LOG(INFO) << "Message number " << i;
    }
    abort();
  });

  unique_fd output_fd;
  StartIntercept(&output_fd);
  FinishCrasher();
  AssertDeath(SIGABRT);
  int intercept_result;
  FinishIntercept(&intercept_result);
  ASSERT_EQ(1, intercept_result) << "tombstoned reported failure";

  std::string result;
  ConsumeFd(std::move(output_fd), &result);
  ASSERT_NOT_MATCH(result, "Message number 99");
  ASSERT_MATCH(result, "Message number 100");
  ASSERT_MATCH(result, "Message number 599");
}

TEST_F(CrasherTest, log_with_newline) {
  StartProcess([]() {
    LOG(INFO) << "This line has a newline.\nThis is on the next line.";
    abort();
  });

  unique_fd output_fd;
  StartIntercept(&output_fd);
  FinishCrasher();
  AssertDeath(SIGABRT);
  int intercept_result;
  FinishIntercept(&intercept_result);
  ASSERT_EQ(1, intercept_result) << "tombstoned reported failure";

  std::string result;
  ConsumeFd(std::move(output_fd), &result);
  ASSERT_MATCH(result, ":\\s*This line has a newline.");
  ASSERT_MATCH(result, ":\\s*This is on the next line.");
}
+5 −2
Original line number Diff line number Diff line
@@ -70,6 +70,9 @@

using android::base::StringPrintf;

// The maximum number of messages to save in the protobuf per file.
static constexpr size_t kMaxLogMessages = 500;

// Use the demangler from libc++.
extern "C" char* __cxa_demangle(const char*, char*, size_t*, int* status);

@@ -491,8 +494,8 @@ static void dump_mappings(Tombstone* tombstone, unwindstack::Maps* maps,
}

static void dump_log_file(Tombstone* tombstone, const char* logger, pid_t pid) {
  logger_list* logger_list =
      android_logger_list_open(android_name_to_log_id(logger), ANDROID_LOG_NONBLOCK, 0, pid);
  logger_list* logger_list = android_logger_list_open(android_name_to_log_id(logger),
                                                      ANDROID_LOG_NONBLOCK, kMaxLogMessages, pid);

  LogBuffer buffer;

+36 −8
Original line number Diff line number Diff line
@@ -85,6 +85,26 @@ void MyLogger(android::base::LogId id, android::base::LogSeverity severity, cons
    }
}

// Find directories in format of "/lib/modules/x.y.z-*".
static int KernelVersionNameFilter(const dirent* de) {
    unsigned int major, minor;
    static std::string kernel_version;
    utsname uts;

    if (kernel_version.empty()) {
        if ((uname(&uts) != 0) || (sscanf(uts.release, "%u.%u", &major, &minor) != 2)) {
            LOG(ERROR) << "Could not parse the kernel version from uname";
            return 0;
        }
        kernel_version = android::base::StringPrintf("%u.%u", major, minor);
    }

    if (android::base::StartsWith(de->d_name, kernel_version)) {
        return 1;
    }
    return 0;
}

}  // anonymous namespace

extern "C" int modprobe_main(int argc, char** argv) {
@@ -192,9 +212,22 @@ extern "C" int modprobe_main(int argc, char** argv) {
    }

    if (mod_dirs.empty()) {
        utsname uts;
        uname(&uts);
        mod_dirs.emplace_back(android::base::StringPrintf("/lib/modules/%s", uts.release));
        static constexpr auto LIB_MODULES_PREFIX = "/lib/modules/";
        dirent** kernel_dirs = NULL;

        int n = scandir(LIB_MODULES_PREFIX, &kernel_dirs, KernelVersionNameFilter, NULL);
        if (n == -1) {
            PLOG(ERROR) << "Failed to scan dir " << LIB_MODULES_PREFIX;
            return EXIT_FAILURE;
        } else if (n > 0) {
            while (n--) {
                mod_dirs.emplace_back(LIB_MODULES_PREFIX + std::string(kernel_dirs[n]->d_name));
            }
        }
        free(kernel_dirs);

        // Allow modules to be directly inside /lib/modules
        mod_dirs.emplace_back(LIB_MODULES_PREFIX);
    }

    LOG(DEBUG) << "mode is " << mode;
@@ -212,11 +245,6 @@ extern "C" int modprobe_main(int argc, char** argv) {
            return EXIT_FAILURE;
        }
    }
    if (mod_dirs.empty()) {
        LOG(ERROR) << "No module configuration directories given.";
        print_usage();
        return EXIT_FAILURE;
    }
    if (parameter_count && modules.size() > 1) {
        LOG(ERROR) << "Only one module may be loaded when specifying module parameters.";
        print_usage();