ソースを参照

LibELF: Propagate ELF image validation errors to the caller

With this fixed dlopen() no longer crashes when given an invalid
ELF image and instead returns an error code that can be retrieved
with dlerror().

Fixes #6995.
Gunnar Beutner 4 年 前
コミット
0ab37dbd03
1 ファイル変更6 行追加2 行削除
  1. 6 2
      Userland/Libraries/LibELF/DynamicLoader.cpp

+ 6 - 2
Userland/Libraries/LibELF/DynamicLoader.cpp

@@ -54,7 +54,10 @@ Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> DynamicLoader::try_create(i
         return DlErrorMessage { "DynamicLoader::try_create mmap" };
         return DlErrorMessage { "DynamicLoader::try_create mmap" };
     }
     }
 
 
-    return adopt_ref(*new DynamicLoader(fd, move(filename), data, size));
+    auto loader = adopt_ref(*new DynamicLoader(fd, move(filename), data, size));
+    if (!loader->is_valid())
+        return DlErrorMessage { "ELF image validation failed" };
+    return loader;
 }
 }
 
 
 DynamicLoader::DynamicLoader(int fd, String filename, void* data, size_t size)
 DynamicLoader::DynamicLoader(int fd, String filename, void* data, size_t size)
@@ -64,8 +67,9 @@ DynamicLoader::DynamicLoader(int fd, String filename, void* data, size_t size)
     , m_file_data(data)
     , m_file_data(data)
     , m_elf_image((u8*)m_file_data, m_file_size)
     , m_elf_image((u8*)m_file_data, m_file_size)
 {
 {
-    m_tls_size_of_current_object = calculate_tls_size();
     m_valid = validate();
     m_valid = validate();
+    if (m_valid)
+        m_tls_size_of_current_object = calculate_tls_size();
 }
 }
 
 
 DynamicLoader::~DynamicLoader()
 DynamicLoader::~DynamicLoader()