linker: add test for zero shstrndx

Bug: http://b/30166532
Bug: http://b/30795430
Test: bionic-unit-tests --gtest_filter=dlfcn.dlopen_invalid*
Change-Id: I4cec73635cf403df9dd60b9a294d2298bb0abe3d
diff --git a/tests/Android.build.prebuilt.mk b/tests/Android.build.prebuilt.mk
index d50656c..2d12557 100644
--- a/tests/Android.build.prebuilt.mk
+++ b/tests/Android.build.prebuilt.mk
@@ -16,13 +16,13 @@
 
 include $(CLEAR_VARS)
 LOCAL_MULTILIB := both
-LOCAL_MODULE := $(module)
+LOCAL_MODULE := $(bionic_tests_module)
 LOCAL_MODULE_PATH_32 := $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS)/prebuilt-elf-files
 LOCAL_MODULE_PATH_64 := $(TARGET_OUT_DATA_NATIVE_TESTS)/prebuilt-elf-files
 LOCAL_MODULE_CLASS := EXECUTABLES
 
-LOCAL_SRC_FILES_arm := prebuilt-elf-files/arm/$(module)
-LOCAL_SRC_FILES_arm64 := prebuilt-elf-files/arm64/$(module)
-LOCAL_SRC_FILES_x86 := prebuilt-elf-files/x86/$(module)
-LOCAL_SRC_FILES_x86_64 := prebuilt-elf-files/x86_64/$(module)
+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)
 include $(BUILD_PREBUILT)
diff --git a/tests/Android.mk b/tests/Android.mk
index 3fe62a8..f59b439 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -20,13 +20,16 @@
 # https://github.com/google/kati/issues/83 is currently blocking it.
 
 # Move prebuilt test elf-files to $(TARGET_OUT_NATIVE_TESTS)
-module := libtest_invalid-rw_load_segment.so
+bionic_tests_module := libtest_invalid-rw_load_segment.so
 include $(LOCAL_PATH)/Android.build.prebuilt.mk
 
-module := libtest_invalid-unaligned_shdr_offset.so
+bionic_tests_module := libtest_invalid-unaligned_shdr_offset.so
 include $(LOCAL_PATH)/Android.build.prebuilt.mk
 
-module := libtest_invalid-zero_shentsize.so
+bionic_tests_module := libtest_invalid-zero_shentsize.so
+include $(LOCAL_PATH)/Android.build.prebuilt.mk
+
+bionic_tests_module := libtest_invalid-zero_shstrndx.so
 include $(LOCAL_PATH)/Android.build.prebuilt.mk
 
 ifeq ($(HOST_OS)-$(HOST_ARCH),$(filter $(HOST_OS)-$(HOST_ARCH),linux-x86 linux-x86_64))
diff --git a/tests/dlfcn_test.cpp b/tests/dlfcn_test.cpp
index 6e78082..c33bd3a 100644
--- a/tests/dlfcn_test.cpp
+++ b/tests/dlfcn_test.cpp
@@ -1178,4 +1178,12 @@
   ASSERT_SUBSTR(expected_dlerror.c_str(), dlerror());
 }
 
+TEST(dlfcn, dlopen_invalid_zero_shstrndx) {
+  std::string libpath = std::string(getenv("ANDROID_DATA")) + PREBUILT_ELF_PATH + "/libtest_invalid-zero_shstrndx.so";
+  void* handle = dlopen(libpath.c_str(), RTLD_NOW);
+  ASSERT_TRUE(handle == nullptr);
+  std::string expected_dlerror = std::string("dlopen failed: \"") + libpath + "\" has invalid e_shstrndx";
+  ASSERT_STREQ(expected_dlerror.c_str(), dlerror());
+}
+
 #endif
diff --git a/tests/prebuilt-elf-files/arm/libtest_invalid-zero_shstrndx.so b/tests/prebuilt-elf-files/arm/libtest_invalid-zero_shstrndx.so
new file mode 100755
index 0000000..25355d0
--- /dev/null
+++ b/tests/prebuilt-elf-files/arm/libtest_invalid-zero_shstrndx.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/arm64/libtest_invalid-zero_shstrndx.so b/tests/prebuilt-elf-files/arm64/libtest_invalid-zero_shstrndx.so
new file mode 100755
index 0000000..625a0e6
--- /dev/null
+++ b/tests/prebuilt-elf-files/arm64/libtest_invalid-zero_shstrndx.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/x86/libtest_invalid-zero_shstrndx.so b/tests/prebuilt-elf-files/x86/libtest_invalid-zero_shstrndx.so
new file mode 100755
index 0000000..f5ff987
--- /dev/null
+++ b/tests/prebuilt-elf-files/x86/libtest_invalid-zero_shstrndx.so
Binary files differ
diff --git a/tests/prebuilt-elf-files/x86_64/libtest_invalid-zero_shstrndx.so b/tests/prebuilt-elf-files/x86_64/libtest_invalid-zero_shstrndx.so
new file mode 100755
index 0000000..d4f6502
--- /dev/null
+++ b/tests/prebuilt-elf-files/x86_64/libtest_invalid-zero_shstrndx.so
Binary files differ