linker: cleanup solist after unsuccessful read

Bug: http://b/25560017
Change-Id: I03c5a1d7aed34c480d341aacfb3b1afdfa037b99
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 9f0b559..31ed1ec 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -1523,6 +1523,8 @@
 
   // Read the ELF header and some of the segments.
   if (!task->read(realpath.c_str(), file_stat.st_size)) {
+    soinfo_free(si);
+    task->set_soinfo(nullptr);
     return false;
   }
 
diff --git a/tests/dlext_test.cpp b/tests/dlext_test.cpp
index baf7eb5..c7d4d46 100644
--- a/tests/dlext_test.cpp
+++ b/tests/dlext_test.cpp
@@ -169,6 +169,11 @@
   ASSERT_TRUE(handle_ == nullptr);
   ASSERT_EQ("dlopen failed: \"" + lib_realpath + "\" has bad ELF magic", dlerror());
 
+  // Check if dlsym works after unsuccessful dlopen().
+  // Supply non-exiting one to make linker visit every soinfo.
+  void* sym = dlsym(RTLD_DEFAULT, "this_symbol_does_not_exist___");
+  ASSERT_TRUE(sym == nullptr);
+
   close(extinfo.library_fd);
 }