Skip to content

Commit c8aed8c

Browse files
authored
Merge pull request #13205 from ethereum/fix-stack-overflow-importing-large-AST-json-file
Fix segmentation fault when importing large AST from json file
2 parents a53f15f + 290bd4f commit c8aed8c

File tree

3 files changed

+14
-2
lines changed

3 files changed

+14
-2
lines changed

liblangutil/CharStream.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,15 @@ class CharStream
7373
CharStream() = default;
7474
CharStream(std::string _source, std::string _name):
7575
m_source(std::move(_source)), m_name(std::move(_name)) {}
76+
CharStream(std::string _source, std::string _name, bool _importedFromAST):
77+
m_source(std::move(_source)),
78+
m_name(std::move(_name)),
79+
m_importedFromAST(_importedFromAST)
80+
{ }
7681

7782
size_t position() const { return m_position; }
7883
bool isPastEndOfInput(size_t _charsForward = 0) const { return (m_position + _charsForward) >= m_source.size(); }
84+
bool isImportedFromAST() const { return m_importedFromAST; }
7985

8086
char get(size_t _charsForward = 0) const { return m_source[m_position + _charsForward]; }
8187
char advanceAndGet(size_t _chars = 1);
@@ -138,6 +144,7 @@ class CharStream
138144
private:
139145
std::string m_source;
140146
std::string m_name;
147+
bool m_importedFromAST{false};
141148
size_t m_position{0};
142149
};
143150

libsolidity/interface/CompilerStack.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,8 @@ void CompilerStack::importASTs(map<string, Json::Value> const& _sources)
404404
source.ast = src.second;
405405
source.charStream = make_shared<CharStream>(
406406
util::jsonCompactPrint(m_sourceJsons[src.first]),
407-
src.first
407+
src.first,
408+
true // imported from AST
408409
);
409410
m_sources[path] = move(source);
410411
}

libyul/AsmPrinter.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,11 @@ string AsmPrinter::formatSourceLocation(
278278
{
279279
sourceIndex = to_string(_nameToSourceIndex.at(*_location.sourceName));
280280

281-
if (_debugInfoSelection.snippet && _soliditySourceProvider)
281+
if (
282+
_debugInfoSelection.snippet &&
283+
_soliditySourceProvider &&
284+
!_soliditySourceProvider->charStream(*_location.sourceName).isImportedFromAST()
285+
)
282286
{
283287
solidityCodeSnippet = escapeAndQuoteString(
284288
_soliditySourceProvider->charStream(*_location.sourceName).singleLineSnippet(_location)

0 commit comments

Comments
 (0)