Merge changes from topic 'ndk-headers-licenses'
* changes:
Add license to ndk_headers modules.
One NOTICE file to rule them all.
diff --git a/libc/include/bits/posix_limits.h b/libc/include/bits/posix_limits.h
index 1bd87f4..c498c69 100644
--- a/libc/include/bits/posix_limits.h
+++ b/libc/include/bits/posix_limits.h
@@ -32,13 +32,13 @@
#include <sys/cdefs.h>
/* Any constant values here other than -1 or 200809L are explicitly specified by POSIX.1-2008. */
-/* Keep it sorted. */
+/* Keep this list sorted by name. */
#define _POSIX_ADVISORY_INFO 200809L
#define _POSIX_AIO_LISTIO_MAX 2
#define _POSIX_AIO_MAX 1
#define _POSIX_ARG_MAX 4096
#define _POSIX_ASYNCHRONOUS_IO -1 /* not implemented */
-#define _POSIX_BARRIERS -1 /* not implemented */
+#define _POSIX_BARRIERS 200809L
#define _POSIX_CHILD_MAX 25
#define _POSIX_CHOWN_RESTRICTED 1 /* yes, chown requires appropriate privileges */
#define _POSIX_CLOCK_SELECTION 200809L
@@ -81,7 +81,7 @@
#define _POSIX_SHELL 1 /* system() supported */
#define _POSIX_SIGQUEUE_MAX 32
#define _POSIX_SPAWN -1 /* not implemented */
-#define _POSIX_SPIN_LOCKS -1 /* not implemented */
+#define _POSIX_SPIN_LOCKS 200809L
#define _POSIX_SPORADIC_SERVER -1 /* not implemented */
#define _POSIX_SSIZE_MAX 32767
#define _POSIX_STREAM_MAX 8
diff --git a/libc/include/bits/struct_file.h b/libc/include/bits/struct_file.h
new file mode 100644
index 0000000..08e18a1
--- /dev/null
+++ b/libc/include/bits/struct_file.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef BITS_FILE_H
+#define BITS_FILE_H
+
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+
+struct __sFILE {
+#if defined(__LP64__)
+ char __private[152];
+#else
+ char __private[84];
+#endif
+} __attribute__((aligned(sizeof(void*))));
+
+__END_DECLS
+
+#endif /* BITS_FILE_H */
diff --git a/libc/include/stdio.h b/libc/include/stdio.h
index 38021ef..816bd28 100644
--- a/libc/include/stdio.h
+++ b/libc/include/stdio.h
@@ -49,6 +49,10 @@
#include <bits/seek_constants.h>
+#if __ANDROID_API__ <= 23
+#include <bits/struct_file.h>
+#endif
+
__BEGIN_DECLS
#if defined(__clang__)
@@ -73,11 +77,11 @@
#define stderr stderr
#else
/* Before M the actual symbols for stdin and friends had different names. */
-extern FILE* __sF[] __REMOVED_IN(23);
+extern FILE __sF[] __REMOVED_IN(23);
-#define stdin __sF[0]
-#define stdout __sF[1]
-#define stderr __sF[2]
+#define stdin (&__sF[0])
+#define stdout (&__sF[1])
+#define stderr (&__sF[2])
#endif
/*
diff --git a/libc/stdio/stdio.cpp b/libc/stdio/stdio.cpp
index b709b40..b0f5c60 100644
--- a/libc/stdio/stdio.cpp
+++ b/libc/stdio/stdio.cpp
@@ -848,3 +848,16 @@
int wscanf(const wchar_t* fmt, ...) {
PRINTF_IMPL(vfwscanf(stdin, fmt, ap));
}
+
+namespace {
+
+namespace phony {
+#include <bits/struct_file.h>
+}
+
+static_assert(sizeof(::__sFILE) == sizeof(phony::__sFILE),
+ "size mismatch between `struct __sFILE` implementation and public stub");
+static_assert(alignof(::__sFILE) == alignof(phony::__sFILE),
+ "alignment mismatch between `struct __sFILE` implementation and public stub");
+
+}
diff --git a/linker/linker.cpp b/linker/linker.cpp
index b2e8dbc..f8531b6 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -2880,7 +2880,7 @@
case DT_TEXTREL:
#if defined(__LP64__)
- DL_ERR("text relocations (DT_TEXTREL) found in 64-bit ELF file \"%s\"", get_realpath());
+ DL_ERR("\"%s\" has text relocations", get_realpath());
return false;
#else
has_text_relocations = true;
@@ -2898,7 +2898,7 @@
case DT_FLAGS:
if (d->d_un.d_val & DF_TEXTREL) {
#if defined(__LP64__)
- DL_ERR("text relocations (DF_TEXTREL) found in 64-bit ELF file \"%s\"", get_realpath());
+ DL_ERR("\"%s\" has text relocations", get_realpath());
return false;
#else
has_text_relocations = true;
@@ -2913,7 +2913,7 @@
set_dt_flags_1(d->d_un.d_val);
if ((d->d_un.d_val & ~SUPPORTED_DT_FLAGS_1) != 0) {
- DL_WARN("%s: unsupported flags DT_FLAGS_1=%p", get_realpath(), reinterpret_cast<void*>(d->d_un.d_val));
+ DL_WARN("\"%s\" has unsupported flags DT_FLAGS_1=%p", get_realpath(), reinterpret_cast<void*>(d->d_un.d_val));
}
break;
#if defined(__mips__)
@@ -2980,7 +2980,7 @@
default:
if (!relocating_linker) {
- DL_WARN("%s: unused DT entry: type %p arg %p", get_realpath(),
+ DL_WARN("\"%s\" unused DT entry: type %p arg %p", get_realpath(),
reinterpret_cast<void*>(d->d_tag), reinterpret_cast<void*>(d->d_un.d_val));
}
break;
@@ -3067,13 +3067,12 @@
if (has_text_relocations) {
// Fail if app is targeting sdk version > 22
if (get_application_target_sdk_version() > 22) {
- PRINT("%s: has text relocations", get_realpath());
- DL_ERR("%s: has text relocations", get_realpath());
+ DL_ERR_AND_LOG("\"%s\" has text relocations", get_realpath());
return false;
}
// Make segments writable to allow text relocations to work properly. We will later call
// phdr_table_protect_segments() after all of them are applied.
- DL_WARN("%s has text relocations. This is wasting memory and prevents "
+ DL_WARN("\"%s\" has text relocations. This is wasting memory and prevents "
"security hardening. Please fix.", get_realpath());
add_dlwarning(get_realpath(), "text relocations");
if (phdr_table_unprotect_segments(phdr, phnum, load_bias) < 0) {
diff --git a/tests/Android.mk b/tests/Android.mk
index e1efbbe..b65b456 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -41,6 +41,12 @@
bionic_tests_module := libtest_invalid-zero_shdr_table_content.so
include $(LOCAL_PATH)/Android.build.prebuilt.mk
+bionic_tests_module := libtest_invalid-textrels.so
+include $(LOCAL_PATH)/Android.build.prebuilt.mk
+
+bionic_tests_module := libtest_invalid-textrels2.so
+include $(LOCAL_PATH)/Android.build.prebuilt.mk
+
ifeq ($(HOST_OS)-$(HOST_ARCH),$(filter $(HOST_OS)-$(HOST_ARCH),linux-x86 linux-x86_64))
build_host := true
else
diff --git a/tests/dlfcn_test.cpp b/tests/dlfcn_test.cpp
index dd9660b..5908fc3 100644
--- a/tests/dlfcn_test.cpp
+++ b/tests/dlfcn_test.cpp
@@ -1227,4 +1227,26 @@
ASSERT_SUBSTR(expected_dlerror.c_str(), dlerror());
}
+TEST(dlfcn, dlopen_invalid_textrels) {
+ const std::string libpath = g_testlib_root +
+ "/" + kPrebuiltElfDir +
+ "/libtest_invalid-textrels.so";
+
+ void* handle = dlopen(libpath.c_str(), RTLD_NOW);
+ ASSERT_TRUE(handle == nullptr);
+ std::string expected_dlerror = std::string("dlopen failed: \"") + libpath + "\" has text relocations";
+ ASSERT_SUBSTR(expected_dlerror.c_str(), dlerror());
+}
+
+TEST(dlfcn, dlopen_invalid_textrels2) {
+ const std::string libpath = g_testlib_root +
+ "/" + kPrebuiltElfDir +
+ "/libtest_invalid-textrels2.so";
+
+ void* handle = dlopen(libpath.c_str(), RTLD_NOW);
+ ASSERT_TRUE(handle == nullptr);
+ std::string expected_dlerror = std::string("dlopen failed: \"") + libpath + "\" has text relocations";
+ ASSERT_SUBSTR(expected_dlerror.c_str(), dlerror());
+}
+
#endif
diff --git a/tests/libs/Android.bp b/tests/libs/Android.bp
index e1a4239..fe0d6ab 100644
--- a/tests/libs/Android.bp
+++ b/tests/libs/Android.bp
@@ -363,6 +363,9 @@
android: {
shared_libs: ["libdl"],
},
+ host: {
+ host_ldlibs: ["-ldl"],
+ },
},
}
@@ -372,6 +375,14 @@
defaults: ["bionic_testlib_defaults"],
srcs: ["dlsym_from_this_functions.cpp"],
shared_libs: ["libtest_dlsym_from_this_grandchild"],
+ target: {
+ android: {
+ shared_libs: ["libdl"],
+ },
+ host: {
+ host_ldlibs: ["-ldl"],
+ },
+ },
}
// -----------------------------------------------------------------------------
@@ -410,6 +421,9 @@
android: {
shared_libs: ["libdl"],
},
+ host: {
+ host_ldlibs: ["-ldl"],
+ },
},
}
diff --git a/tests/libs/Android.build.dt_runpath.mk b/tests/libs/Android.build.dt_runpath.mk
index 2a6d3b3..60844e5 100644
--- a/tests/libs/Android.build.dt_runpath.mk
+++ b/tests/libs/Android.build.dt_runpath.mk
@@ -67,6 +67,7 @@
libtest_dt_runpath_d_shared_libraries := libtest_dt_runpath_b libtest_dt_runpath_c
libtest_dt_runpath_d_ldflags := -Wl,--rpath,\$${ORIGIN}/dt_runpath_b_c_x -Wl,--enable-new-dtags
+libtest_dt_runpath_d_ldlibs := -ldl
module := libtest_dt_runpath_d
include $(LOCAL_PATH)/Android.build.testlib.mk
@@ -78,6 +79,7 @@
libtest_dt_runpath_d_zip_shared_libraries := libtest_dt_runpath_b libtest_dt_runpath_c
libtest_dt_runpath_d_zip_ldflags := -Wl,--rpath,\$${ORIGIN}/dt_runpath_b_c_x -Wl,--enable-new-dtags
+libtest_dt_runpath_d_zip_ldlibs := -ldl
libtest_dt_runpath_d_zip_install_to_out_data_dir := $(module)
module_tag := optional
diff --git a/tests/prebuilt-elf-files/arm/libtest_invalid-textrels.so b/tests/prebuilt-elf-files/arm/libtest_invalid-textrels.so
new file mode 100755
index 0000000..7e852c0
--- /dev/null
+++ b/tests/prebuilt-elf-files/arm/libtest_invalid-textrels.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/arm/libtest_invalid-textrels2.so b/tests/prebuilt-elf-files/arm/libtest_invalid-textrels2.so
new file mode 100755
index 0000000..26ebdb9
--- /dev/null
+++ b/tests/prebuilt-elf-files/arm/libtest_invalid-textrels2.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/arm64/libtest_invalid-textrels.so b/tests/prebuilt-elf-files/arm64/libtest_invalid-textrels.so
new file mode 100755
index 0000000..7d925cb
--- /dev/null
+++ b/tests/prebuilt-elf-files/arm64/libtest_invalid-textrels.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/arm64/libtest_invalid-textrels2.so b/tests/prebuilt-elf-files/arm64/libtest_invalid-textrels2.so
new file mode 100755
index 0000000..7eb62f5
--- /dev/null
+++ b/tests/prebuilt-elf-files/arm64/libtest_invalid-textrels2.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips/libtest_invalid-textrels.so b/tests/prebuilt-elf-files/mips/libtest_invalid-textrels.so
new file mode 100755
index 0000000..9405863
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips/libtest_invalid-textrels.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips/libtest_invalid-textrels2.so b/tests/prebuilt-elf-files/mips/libtest_invalid-textrels2.so
new file mode 100755
index 0000000..eb9d61c
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips/libtest_invalid-textrels2.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips64/libtest_invalid-textrels.so b/tests/prebuilt-elf-files/mips64/libtest_invalid-textrels.so
new file mode 100755
index 0000000..d387691
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips64/libtest_invalid-textrels.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips64/libtest_invalid-textrels2.so b/tests/prebuilt-elf-files/mips64/libtest_invalid-textrels2.so
new file mode 100755
index 0000000..eb5868a
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips64/libtest_invalid-textrels2.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/x86/libtest_invalid-textrels.so b/tests/prebuilt-elf-files/x86/libtest_invalid-textrels.so
new file mode 100755
index 0000000..ad78ed4
--- /dev/null
+++ b/tests/prebuilt-elf-files/x86/libtest_invalid-textrels.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/x86/libtest_invalid-textrels2.so b/tests/prebuilt-elf-files/x86/libtest_invalid-textrels2.so
new file mode 100755
index 0000000..f70b1fa
--- /dev/null
+++ b/tests/prebuilt-elf-files/x86/libtest_invalid-textrels2.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/x86_64/libtest_invalid-textrels.so b/tests/prebuilt-elf-files/x86_64/libtest_invalid-textrels.so
new file mode 100755
index 0000000..425eb8b
--- /dev/null
+++ b/tests/prebuilt-elf-files/x86_64/libtest_invalid-textrels.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/x86_64/libtest_invalid-textrels2.so b/tests/prebuilt-elf-files/x86_64/libtest_invalid-textrels2.so
new file mode 100755
index 0000000..ede0148
--- /dev/null
+++ b/tests/prebuilt-elf-files/x86_64/libtest_invalid-textrels2.so
Binary files differ
diff --git a/tests/time_test.cpp b/tests/time_test.cpp
index 2a46d8b..914cb61 100644
--- a/tests/time_test.cpp
+++ b/tests/time_test.cpp
@@ -628,3 +628,49 @@
in.tv_nsec = 0;
ASSERT_EQ(EINVAL, clock_nanosleep(CLOCK_THREAD_CPUTIME_ID, 0, &in, nullptr));
}
+
+TEST(time, bug_31938693) {
+ // User-visible symptoms in N:
+ // http://b/31938693
+ // https://code.google.com/p/android/issues/detail?id=225132
+
+ // Actual underlying bug (the code change, not the tzdata upgrade that first exposed the bug):
+ // http://b/31848040
+
+ // This isn't a great test, because very few time zones were actually affected, and there's
+ // no real logic to which ones were affected: it was just a coincidence of the data that came
+ // after them in the tzdata file.
+
+ time_t t = 1475619727;
+ struct tm tm;
+
+ setenv("TZ", "America/Los_Angeles", 1);
+ tzset();
+ ASSERT_TRUE(localtime_r(&t, &tm) != nullptr);
+ EXPECT_EQ(15, tm.tm_hour);
+
+ setenv("TZ", "Europe/London", 1);
+ tzset();
+ ASSERT_TRUE(localtime_r(&t, &tm) != nullptr);
+ EXPECT_EQ(23, tm.tm_hour);
+
+ setenv("TZ", "America/Atka", 1);
+ tzset();
+ ASSERT_TRUE(localtime_r(&t, &tm) != nullptr);
+ EXPECT_EQ(13, tm.tm_hour);
+
+ setenv("TZ", "Pacific/Apia", 1);
+ tzset();
+ ASSERT_TRUE(localtime_r(&t, &tm) != nullptr);
+ EXPECT_EQ(12, tm.tm_hour);
+
+ setenv("TZ", "Pacific/Honolulu", 1);
+ tzset();
+ ASSERT_TRUE(localtime_r(&t, &tm) != nullptr);
+ EXPECT_EQ(12, tm.tm_hour);
+
+ setenv("TZ", "Asia/Magadan", 1);
+ tzset();
+ ASSERT_TRUE(localtime_r(&t, &tm) != nullptr);
+ EXPECT_EQ(9, tm.tm_hour);
+}
diff --git a/tests/unistd_test.cpp b/tests/unistd_test.cpp
index 6299469..80ebf6b 100644
--- a/tests/unistd_test.cpp
+++ b/tests/unistd_test.cpp
@@ -559,6 +559,8 @@
EXPECT_GT(_POSIX_AIO_LISTIO_MAX, 0);
EXPECT_GT(_POSIX_AIO_MAX, 0);
EXPECT_GT(_POSIX_ARG_MAX, 0);
+ EXPECT_GT(_POSIX_BARRIERS, 0);
+ EXPECT_GT(_POSIX_SPIN_LOCKS, 0);
EXPECT_GT(_POSIX_CHILD_MAX, 0);
EXPECT_NE(_POSIX_CHOWN_RESTRICTED, -1);
EXPECT_EQ(_POSIX_VERSION, _POSIX_CLOCK_SELECTION);
@@ -647,12 +649,10 @@
// These tests only pass on bionic, as bionic and glibc has different support on these macros.
// Macros like _POSIX_ASYNCHRONOUS_IO are not supported on bionic yet.
EXPECT_EQ(-1, _POSIX_ASYNCHRONOUS_IO);
- EXPECT_EQ(-1, _POSIX_BARRIERS);
EXPECT_EQ(-1, _POSIX_MESSAGE_PASSING);
EXPECT_EQ(-1, _POSIX_PRIORITIZED_IO);
EXPECT_EQ(-1, _POSIX_SHARED_MEMORY_OBJECTS);
EXPECT_EQ(-1, _POSIX_SPAWN);
- EXPECT_EQ(-1, _POSIX_SPIN_LOCKS);
EXPECT_EQ(-1, _POSIX_THREAD_PROCESS_SHARED);
EXPECT_EQ(-1, _POSIX_THREAD_ROBUST_PRIO_INHERIT);
@@ -692,6 +692,7 @@
TEST(UNISTD_TEST, sysconf) {
VERIFY_SYSCONF_POSIX_VERSION(_SC_ADVISORY_INFO);
VERIFY_SYSCONF_POSITIVE(_SC_ARG_MAX);
+ VERIFY_SYSCONF_POSIX_VERSION(_SC_BARRIERS);
VERIFY_SYSCONF_POSITIVE(_SC_BC_BASE_MAX);
VERIFY_SYSCONF_POSITIVE(_SC_BC_DIM_MAX);
VERIFY_SYSCONF_POSITIVE(_SC_BC_SCALE_MAX);
@@ -731,6 +732,7 @@
VERIFY_SYSCONF_POSITIVE(_SC_RTSIG_MAX);
VERIFY_SYSCONF_POSITIVE(_SC_SEM_NSEMS_MAX);
VERIFY_SYSCONF_POSITIVE(_SC_SEM_VALUE_MAX);
+ VERIFY_SYSCONF_POSIX_VERSION(_SC_SPIN_LOCKS);
VERIFY_SYSCONF_POSITIVE(_SC_TIMER_MAX);
VERIFY_SYSCONF_POSIX_VERSION(_SC_FSYNC);
VERIFY_SYSCONF_POSIX_VERSION(_SC_MAPPED_FILES);
@@ -810,12 +812,10 @@
// Tests can only run on bionic, as bionic and glibc have different support for these options.
// Below options are not supported on bionic yet.
VERIFY_SYSCONF_UNSUPPORTED(_SC_ASYNCHRONOUS_IO);
- VERIFY_SYSCONF_UNSUPPORTED(_SC_BARRIERS);
VERIFY_SYSCONF_UNSUPPORTED(_SC_MESSAGE_PASSING);
VERIFY_SYSCONF_UNSUPPORTED(_SC_PRIORITIZED_IO);
VERIFY_SYSCONF_UNSUPPORTED(_SC_SHARED_MEMORY_OBJECTS);
VERIFY_SYSCONF_UNSUPPORTED(_SC_SPAWN);
- VERIFY_SYSCONF_UNSUPPORTED(_SC_SPIN_LOCKS);
VERIFY_SYSCONF_UNSUPPORTED(_SC_THREAD_PROCESS_SHARED);
VERIFY_SYSCONF_UNSUPPORTED(_SC_THREAD_ROBUST_PRIO_INHERIT);
VERIFY_SYSCONF_UNSUPPORTED(_SC_THREAD_ROBUST_PRIO_PROTECT);