Merge "Add null checks to <dirent.h> functions."
diff --git a/benchmarks/stdio_benchmark.cpp b/benchmarks/stdio_benchmark.cpp
index 0e7f668..97a03dc 100644
--- a/benchmarks/stdio_benchmark.cpp
+++ b/benchmarks/stdio_benchmark.cpp
@@ -171,3 +171,28 @@
FopenFgetcFclose(state, true);
}
BIONIC_BENCHMARK(BM_stdio_fopen_fgetc_fclose_no_locking);
+
+static void BM_stdio_printf_literal(benchmark::State& state) {
+ while (state.KeepRunning()) {
+ char buf[BUFSIZ];
+ snprintf(buf, sizeof(buf), "this is just a literal string with no format specifiers");
+ }
+}
+BIONIC_BENCHMARK(BM_stdio_printf_literal);
+
+static void BM_stdio_printf_s(benchmark::State& state) {
+ while (state.KeepRunning()) {
+ char buf[BUFSIZ];
+ snprintf(buf, sizeof(buf), "this is a more typical error message with detail: %s",
+ "No such file or directory");
+ }
+}
+BIONIC_BENCHMARK(BM_stdio_printf_s);
+
+static void BM_stdio_printf_d(benchmark::State& state) {
+ while (state.KeepRunning()) {
+ char buf[BUFSIZ];
+ snprintf(buf, sizeof(buf), "this is a more typical error message with detail: %d", 123456);
+ }
+}
+BIONIC_BENCHMARK(BM_stdio_printf_d);
diff --git a/benchmarks/suites/full.xml b/benchmarks/suites/full.xml
index a7bd9d4..240b5e7 100644
--- a/benchmarks/suites/full.xml
+++ b/benchmarks/suites/full.xml
@@ -189,6 +189,15 @@
<name>BM_stdio_fopen_getline_fclose_no_locking</name>
</fn>
<fn>
+ <name>BM_stdio_printf_literal</name>
+</fn>
+<fn>
+ <name>BM_stdio_printf_s</name>
+</fn>
+<fn>
+ <name>BM_stdio_printf_d</name>
+</fn>
+<fn>
<name>BM_string_memcmp</name>
<args>AT_ALIGNED_TWOBUF</args>
</fn>
diff --git a/libc/bionic/__libc_init_main_thread.cpp b/libc/bionic/__libc_init_main_thread.cpp
index 5004e24..efa7dee 100644
--- a/libc/bionic/__libc_init_main_thread.cpp
+++ b/libc/bionic/__libc_init_main_thread.cpp
@@ -85,9 +85,14 @@
// thread's stack rather than on the heap.
// The main thread has no mmap allocated space for stack or pthread_internal_t.
main_thread.mmap_size = 0;
+
pthread_attr_init(&main_thread.attr);
- main_thread.attr.guard_size = 0; // The main thread has no guard page.
- main_thread.attr.stack_size = 0; // User code should never see this; we'll compute it when asked.
+ // We don't want to explicitly set the main thread's scheduler attributes (http://b/68328561).
+ pthread_attr_setinheritsched(&main_thread.attr, PTHREAD_INHERIT_SCHED);
+ // The main thread has no guard page.
+ pthread_attr_setguardsize(&main_thread.attr, 0);
+ // User code should never see this; we'll compute it when asked.
+ pthread_attr_setstacksize(&main_thread.attr, 0);
// The TLS stack guard is set from the global, so ensure that we've initialized the global
// before we initialize the TLS. Dynamic executables will initialize their copy of the global