diff options
-rw-r--r-- | solc/CommandLineInterface.cpp | 64 |
1 files changed, 32 insertions, 32 deletions
diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp index 49dfd0b5..2bfd0bf2 100644 --- a/solc/CommandLineInterface.cpp +++ b/solc/CommandLineInterface.cpp @@ -616,6 +616,37 @@ Allowed options)", bool CommandLineInterface::processInput() { + ReadFile::Callback fileReader = [this](string const& _path) + { + auto path = boost::filesystem::path(_path); + auto canonicalPath = boost::filesystem::canonical(path); + bool isAllowed = false; + for (auto const& allowedDir: m_allowedDirectories) + { + // If dir is a prefix of boostPath, we are fine. + if ( + std::distance(allowedDir.begin(), allowedDir.end()) <= std::distance(canonicalPath.begin(), canonicalPath.end()) && + std::equal(allowedDir.begin(), allowedDir.end(), canonicalPath.begin()) + ) + { + isAllowed = true; + break; + } + } + if (!isAllowed) + return ReadFile::Result{false, "File outside of allowed directories."}; + else if (!boost::filesystem::exists(path)) + return ReadFile::Result{false, "File not found."}; + else if (!boost::filesystem::is_regular_file(canonicalPath)) + return ReadFile::Result{false, "Not a valid file."}; + else + { + auto contents = dev::contentsString(canonicalPath.string()); + m_sourceCodes[path.string()] = contents; + return ReadFile::Result{true, contents}; + } + }; + if (m_args.count(g_argAllowPaths)) { vector<string> paths; @@ -632,7 +663,7 @@ bool CommandLineInterface::processInput() getline(cin, tmp); input.append(tmp + "\n"); } - StandardCompiler compiler; + StandardCompiler compiler(fileReader); cout << compiler.compile(input) << endl; return true; } @@ -657,37 +688,6 @@ bool CommandLineInterface::processInput() return link(); } - ReadFile::Callback fileReader = [this](string const& _path) - { - auto path = boost::filesystem::path(_path); - auto canonicalPath = boost::filesystem::canonical(path); - bool isAllowed = false; - for (auto const& allowedDir: m_allowedDirectories) - { - // If dir is a prefix of boostPath, we are fine. - if ( - std::distance(allowedDir.begin(), allowedDir.end()) <= std::distance(canonicalPath.begin(), canonicalPath.end()) && - std::equal(allowedDir.begin(), allowedDir.end(), canonicalPath.begin()) - ) - { - isAllowed = true; - break; - } - } - if (!isAllowed) - return ReadFile::Result{false, "File outside of allowed directories."}; - else if (!boost::filesystem::exists(path)) - return ReadFile::Result{false, "File not found."}; - else if (!boost::filesystem::is_regular_file(canonicalPath)) - return ReadFile::Result{false, "Not a valid file."}; - else - { - auto contents = dev::contentsString(canonicalPath.string()); - m_sourceCodes[path.string()] = contents; - return ReadFile::Result{true, contents}; - } - }; - m_compiler.reset(new CompilerStack(fileReader)); auto scannerFromSourceName = [&](string const& _sourceName) -> solidity::Scanner const& { return m_compiler->scanner(_sourceName); }; try |