]> git.saurik.com Git - apple/ld64.git/blobdiff - src/abstraction/MachOTrie.hpp
ld64-134.9.tar.gz
[apple/ld64.git] / src / abstraction / MachOTrie.hpp
index 7b30cad0580d5f47bab60d8305875ef1c5f373d4..1885e482add8ab861a8bd25822a219fd39a9e138 100644 (file)
@@ -360,8 +360,10 @@ static inline void processExportNode(const uint8_t* const start, const uint8_t*
                        ++edgeStrLen;
                }
                cummulativeString[curStrOffset+edgeStrLen] = *s++;
-               uint32_t childNodeOffet = read_uleb128(s, end);
-               processExportNode(start, start+childNodeOffet, end, cummulativeString, curStrOffset+edgeStrLen, output);        
+               uint32_t childNodeOffset = read_uleb128(s, end);
+               if (childNodeOffset == 0)
+                       throw "malformed trie, childNodeOffset==0";
+               processExportNode(start, start+childNodeOffset, end, cummulativeString, curStrOffset+edgeStrLen, output);
        }
 }
 
@@ -371,7 +373,8 @@ inline void parseTrie(const uint8_t* start, const uint8_t* end, std::vector<Entr
        // empty trie has no entries
        if ( start == end )
                return;
-       char cummulativeString[4000];
+       // worst case largest exported symbol names is length of whole trie
+       char* cummulativeString = new char[end-start]; 
        std::vector<EntryWithOffset> entries;
        processExportNode(start, start, end, cummulativeString, 0, entries);
        // to preserve tie layout order, sort by node offset
@@ -380,6 +383,7 @@ inline void parseTrie(const uint8_t* start, const uint8_t* end, std::vector<Entr
        output.reserve(entries.size());
        for (std::vector<EntryWithOffset>::iterator it=entries.begin(); it != entries.end(); ++it)
                output.push_back(it->entry);
+       delete cummulativeString;
 }