Procházet zdrojové kódy

LibELF: Fix stack overflow in ELFImage::relocations()

Thanks to braindead for finding the bug! :^)
Andreas Kling před 5 roky
rodič
revize
7ae7a60caa
2 změnil soubory, kde provedl 8 přidání a 10 odebrání
  1. 7 9
      Libraries/LibELF/ELFImage.cpp
  2. 1 1
      Libraries/LibELF/ELFImage.h

+ 7 - 9
Libraries/LibELF/ELFImage.cpp

@@ -1,5 +1,6 @@
-#include "ELFImage.h"
+#include <AK/StringBuilder.h>
 #include <AK/kstdio.h>
 #include <AK/kstdio.h>
+#include <LibELF/ELFImage.h>
 
 
 ELFImage::ELFImage(const u8* buffer)
 ELFImage::ELFImage(const u8* buffer)
     : m_buffer(buffer)
     : m_buffer(buffer)
@@ -194,14 +195,11 @@ const ELFImage::Relocation ELFImage::RelocationSection::relocation(unsigned inde
 
 
 const ELFImage::RelocationSection ELFImage::Section::relocations() const
 const ELFImage::RelocationSection ELFImage::Section::relocations() const
 {
 {
-    // FIXME: This is ugly.
-    char relocation_sectionName[128];
-    sprintf(relocation_sectionName, ".rel%s", name());
+    StringBuilder builder;
+    builder.append(".rel");
+    builder.append(name());
 
 
-#ifdef ELFIMAGE_DEBUG
-    dbgprintf("looking for '%s'\n", relocation_sectionName);
-#endif
-    auto relocation_section = m_image.lookup_section(relocation_sectionName);
+    auto relocation_section = m_image.lookup_section(builder.to_string());
     if (relocation_section.type() != SHT_REL)
     if (relocation_section.type() != SHT_REL)
         return static_cast<const RelocationSection>(m_image.section(0));
         return static_cast<const RelocationSection>(m_image.section(0));
 
 
@@ -211,7 +209,7 @@ const ELFImage::RelocationSection ELFImage::Section::relocations() const
     return static_cast<const RelocationSection>(relocation_section);
     return static_cast<const RelocationSection>(relocation_section);
 }
 }
 
 
-const ELFImage::Section ELFImage::lookup_section(const char* name) const
+const ELFImage::Section ELFImage::lookup_section(const String& name) const
 {
 {
     if (auto it = m_sections.find(name); it != m_sections.end())
     if (auto it = m_sections.find(name); it != m_sections.end())
         return section((*it).value);
         return section((*it).value);

+ 1 - 1
Libraries/LibELF/ELFImage.h

@@ -171,7 +171,7 @@ public:
 
 
     // NOTE: Returns section(0) if section with name is not found.
     // NOTE: Returns section(0) if section with name is not found.
     // FIXME: I don't love this API.
     // FIXME: I don't love this API.
-    const Section lookup_section(const char* name) const;
+    const Section lookup_section(const String& name) const;
 
 
     bool is_executable() const { return header().e_type == ET_EXEC; }
     bool is_executable() const { return header().e_type == ET_EXEC; }
     bool is_relocatable() const { return header().e_type == ET_REL; }
     bool is_relocatable() const { return header().e_type == ET_REL; }