Merge "Flesh out <sys/msg.h>, <sys/sem.h>, <sys/shm.h>."
diff --git a/libc/Android.bp b/libc/Android.bp
index 44b76a2..52006a4 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -39,6 +39,7 @@
     "-Wextra",
     "-Wunused",
     "-Wno-deprecated-declarations",
+    "-Wframe-larger-than=2048",
 
     // Try to catch typical 32-bit assumptions that break with 64-bit pointers.
     "-Werror=pointer-to-int-cast",
@@ -175,6 +176,7 @@
         "-DINET6",
         "-Wno-unused-parameter",
         "-include netbsd-compat.h",
+        "-Wframe-larger-than=66000",
     ],
 
     local_include_dirs: [
@@ -203,7 +205,6 @@
         "upstream-freebsd/lib/libc/stdlib/getopt_long.c",
         "upstream-freebsd/lib/libc/stdlib/qsort.c",
         "upstream-freebsd/lib/libc/stdlib/quick_exit.c",
-        "upstream-freebsd/lib/libc/stdlib/realpath.c",
         "upstream-freebsd/lib/libc/string/wcpcpy.c",
         "upstream-freebsd/lib/libc/string/wcpncpy.c",
         "upstream-freebsd/lib/libc/string/wcscasecmp.c",
@@ -274,6 +275,25 @@
     name: "libc_freebsd",
 }
 
+cc_library_static {
+    defaults: ["libc_defaults"],
+    srcs: [
+        "upstream-freebsd/lib/libc/stdlib/realpath.c",
+    ],
+
+    cflags: [
+        "-Wno-sign-compare",
+        "-include freebsd-compat.h",
+        "-Wframe-larger-than=15000",
+    ],
+
+    local_include_dirs: [
+        "upstream-freebsd/android/include",
+    ],
+
+    name: "libc_freebsd_large_stack",
+}
+
 // ========================================================
 // libc_netbsd.a - upstream NetBSD C library code
 // ========================================================
@@ -358,7 +378,6 @@
         "upstream-openbsd/lib/libc/gen/daemon.c",
         "upstream-openbsd/lib/libc/gen/err.c",
         "upstream-openbsd/lib/libc/gen/errx.c",
-        "upstream-openbsd/lib/libc/gen/exec.c",
         "upstream-openbsd/lib/libc/gen/fnmatch.c",
         "upstream-openbsd/lib/libc/gen/ftok.c",
         "upstream-openbsd/lib/libc/gen/getprogname.c",
@@ -434,10 +453,7 @@
         "upstream-openbsd/lib/libc/stdio/ungetwc.c",
         "upstream-openbsd/lib/libc/stdio/vasprintf.c",
         "upstream-openbsd/lib/libc/stdio/vdprintf.c",
-        "upstream-openbsd/lib/libc/stdio/vfprintf.c",
         "upstream-openbsd/lib/libc/stdio/vfscanf.c",
-        "upstream-openbsd/lib/libc/stdio/vfwprintf.c",
-        "upstream-openbsd/lib/libc/stdio/vfwscanf.c",
         "upstream-openbsd/lib/libc/stdio/vsscanf.c",
         "upstream-openbsd/lib/libc/stdio/vswprintf.c",
         "upstream-openbsd/lib/libc/stdio/vswscanf.c",
@@ -498,6 +514,29 @@
     ],
 }
 
+cc_library_static {
+    name: "libc_openbsd_large_stack",
+    defaults: ["libc_defaults"],
+    srcs: [
+        "upstream-openbsd/lib/libc/gen/exec.c",
+        "upstream-openbsd/lib/libc/stdio/vfprintf.c",
+        "upstream-openbsd/lib/libc/stdio/vfwprintf.c",
+        "upstream-openbsd/lib/libc/stdio/vfwscanf.c",
+    ],
+    cflags: [
+        "-include openbsd-compat.h",
+        "-Wno-sign-compare",
+        "-Wframe-larger-than=5000",
+    ],
+
+    local_include_dirs: [
+        "stdio",
+        "upstream-openbsd/android/include",
+        "upstream-openbsd/lib/libc/include",
+        "upstream-openbsd/lib/libc/gdtoa/",
+    ],
+}
+
 // ========================================================
 // libc_openbsd.a - upstream OpenBSD C library code
 // ========================================================
@@ -644,10 +683,7 @@
 
     local_include_dirs: [
         "private",
-        "stdio",
         "upstream-openbsd/android/include",
-        "upstream-openbsd/lib/libc/include",
-        "upstream-openbsd/lib/libc/gdtoa/",
     ],
 
     name: "libc_openbsd",
@@ -735,7 +771,6 @@
         "bionic/strnlen.c",
         "bionic/strrchr.cpp",
     ],
-    cflags: ["-Wframe-larger-than=2048"],
 
     arch: {
         arm: {
@@ -1333,7 +1368,6 @@
         "bionic/wctype.cpp",
         "bionic/wmempcpy.cpp",
     ],
-    cflags: ["-Wframe-larger-than=2048"],
 
     multilib: {
         lib32: {
@@ -1383,7 +1417,6 @@
         "bionic/pthread_sigmask.cpp",
         "bionic/pthread_spinlock.cpp",
     ],
-    cflags: ["-Wframe-larger-than=2048"],
 
     cppflags: ["-Wold-style-cast"],
     include_dirs: ["bionic/libstdc++/include"],
@@ -1478,9 +1511,11 @@
     whole_static_libs: [
         "libc_bionic_ndk",
         "libc_freebsd",
+        "libc_freebsd_large_stack",
         "libc_gdtoa",
         "libc_malloc",
         "libc_netbsd",
+        "libc_openbsd_large_stack",
         "libc_openbsd_ndk",
         "libc_stack_protector",
         "libc_syscalls",
@@ -1510,10 +1545,12 @@
         "libc_bionic_ndk",
         "libc_dns",
         "libc_freebsd",
+        "libc_freebsd_large_stack",
         "libc_gdtoa",
         "libc_malloc",
         "libc_netbsd",
         "libc_openbsd",
+        "libc_openbsd_large_stack",
         "libc_openbsd_ndk",
         "libc_pthread",
         "libc_stack_protector",
diff --git a/libc/include/netdb.h b/libc/include/netdb.h
index 95f0986..816acc5 100644
--- a/libc/include/netdb.h
+++ b/libc/include/netdb.h
@@ -220,10 +220,11 @@
 void herror(const char*);
 const char* hstrerror(int);
 
-int getaddrinfo(const char *, const char *, const struct addrinfo *, struct addrinfo **);
-int getnameinfo(const struct sockaddr *, socklen_t, char *, size_t, char *, size_t, int);
-void freeaddrinfo(struct addrinfo *);
-const char	*gai_strerror(int);
+int getaddrinfo(const char*, const char*, const struct addrinfo*, struct addrinfo**);
+/* POSIX getnameinfo uses socklen_t, not size_t, but LP64 sizeof(socklen_t) != sizeof(size_t). */
+int getnameinfo(const struct sockaddr*, socklen_t, char*, size_t, char*, size_t, int);
+void freeaddrinfo(struct addrinfo*);
+const char* gai_strerror(int);
 void setservent(int);
 
 __END_DECLS
diff --git a/tests/Android.build.prebuilt.mk b/tests/Android.build.prebuilt.mk
index 09c2366..db2dfe4 100644
--- a/tests/Android.build.prebuilt.mk
+++ b/tests/Android.build.prebuilt.mk
@@ -21,10 +21,10 @@
 LOCAL_MODULE_PATH_64 := $(TARGET_OUT_DATA_NATIVE_TESTS)/prebuilt-elf-files
 LOCAL_MODULE_CLASS := EXECUTABLES
 
-LOCAL_MODULE_TARGET_ARCH := arm arm64 x86 x86_64
-
 LOCAL_SRC_FILES_arm := prebuilt-elf-files/arm/$(bionic_tests_module)
 LOCAL_SRC_FILES_arm64 := prebuilt-elf-files/arm64/$(bionic_tests_module)
 LOCAL_SRC_FILES_x86 := prebuilt-elf-files/x86/$(bionic_tests_module)
 LOCAL_SRC_FILES_x86_64 := prebuilt-elf-files/x86_64/$(bionic_tests_module)
+LOCAL_SRC_FILES_mips := prebuilt-elf-files/mips/$(bionic_tests_module)
+LOCAL_SRC_FILES_mips64 := prebuilt-elf-files/mips64/$(bionic_tests_module)
 include $(BUILD_PREBUILT)
diff --git a/tests/dlfcn_test.cpp b/tests/dlfcn_test.cpp
index ecc2a12..f474ed9 100644
--- a/tests/dlfcn_test.cpp
+++ b/tests/dlfcn_test.cpp
@@ -1144,7 +1144,7 @@
 }
 
 // Bionic specific tests
-#if defined(__BIONIC__) && !defined(__mips__)
+#if defined(__BIONIC__)
 
 #if defined(__LP64__)
 #define NATIVE_TESTS_PATH "/nativetest64"
diff --git a/tests/prebuilt-elf-files/mips/libtest_invalid-empty_shdr_table.so b/tests/prebuilt-elf-files/mips/libtest_invalid-empty_shdr_table.so
new file mode 100755
index 0000000..7973498
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips/libtest_invalid-empty_shdr_table.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips/libtest_invalid-rw_load_segment.so b/tests/prebuilt-elf-files/mips/libtest_invalid-rw_load_segment.so
new file mode 100755
index 0000000..f938d13
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips/libtest_invalid-rw_load_segment.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips/libtest_invalid-unaligned_shdr_offset.so b/tests/prebuilt-elf-files/mips/libtest_invalid-unaligned_shdr_offset.so
new file mode 100755
index 0000000..1e8ea7d
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips/libtest_invalid-unaligned_shdr_offset.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips/libtest_invalid-zero_shdr_table_content.so b/tests/prebuilt-elf-files/mips/libtest_invalid-zero_shdr_table_content.so
new file mode 100755
index 0000000..8fe1f63
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips/libtest_invalid-zero_shdr_table_content.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips/libtest_invalid-zero_shdr_table_offset.so b/tests/prebuilt-elf-files/mips/libtest_invalid-zero_shdr_table_offset.so
new file mode 100755
index 0000000..64f3a88
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips/libtest_invalid-zero_shdr_table_offset.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips/libtest_invalid-zero_shentsize.so b/tests/prebuilt-elf-files/mips/libtest_invalid-zero_shentsize.so
new file mode 100755
index 0000000..285db43
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips/libtest_invalid-zero_shentsize.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips/libtest_invalid-zero_shstrndx.so b/tests/prebuilt-elf-files/mips/libtest_invalid-zero_shstrndx.so
new file mode 100755
index 0000000..fb1a421
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips/libtest_invalid-zero_shstrndx.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips64/libtest_invalid-empty_shdr_table.so b/tests/prebuilt-elf-files/mips64/libtest_invalid-empty_shdr_table.so
new file mode 100755
index 0000000..5984a85
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips64/libtest_invalid-empty_shdr_table.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips64/libtest_invalid-rw_load_segment.so b/tests/prebuilt-elf-files/mips64/libtest_invalid-rw_load_segment.so
new file mode 100755
index 0000000..d8bab60
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips64/libtest_invalid-rw_load_segment.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips64/libtest_invalid-unaligned_shdr_offset.so b/tests/prebuilt-elf-files/mips64/libtest_invalid-unaligned_shdr_offset.so
new file mode 100755
index 0000000..a2aff50
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips64/libtest_invalid-unaligned_shdr_offset.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips64/libtest_invalid-zero_shdr_table_content.so b/tests/prebuilt-elf-files/mips64/libtest_invalid-zero_shdr_table_content.so
new file mode 100755
index 0000000..ac4a69c
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips64/libtest_invalid-zero_shdr_table_content.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips64/libtest_invalid-zero_shdr_table_offset.so b/tests/prebuilt-elf-files/mips64/libtest_invalid-zero_shdr_table_offset.so
new file mode 100755
index 0000000..01c229b
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips64/libtest_invalid-zero_shdr_table_offset.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips64/libtest_invalid-zero_shentsize.so b/tests/prebuilt-elf-files/mips64/libtest_invalid-zero_shentsize.so
new file mode 100755
index 0000000..abcd27b
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips64/libtest_invalid-zero_shentsize.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/mips64/libtest_invalid-zero_shstrndx.so b/tests/prebuilt-elf-files/mips64/libtest_invalid-zero_shstrndx.so
new file mode 100755
index 0000000..d3aa35f
--- /dev/null
+++ b/tests/prebuilt-elf-files/mips64/libtest_invalid-zero_shstrndx.so
Binary files differ