Merge pull request #3624 from ethereum/jsonio-libraries-hex

Ensure that library addresses supplied are of correct length and hex prefixed
This commit is contained in:
Alex Beregszaszi 2018-03-01 12:37:14 +01:00 committed by GitHub
commit 2c82f748bb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 47 additions and 10 deletions

View File

@ -15,7 +15,8 @@ Bugfixes:
* JSON-AST: Add "documentation" property to function, event and modifier definition. * JSON-AST: Add "documentation" property to function, event and modifier definition.
* Resolver: Properly determine shadowing for imports with aliases. * Resolver: Properly determine shadowing for imports with aliases.
* Standalone Assembly: Do not ignore input after closing brace of top level block. * Standalone Assembly: Do not ignore input after closing brace of top level block.
* Standard JSON: catch errors properly when invalid "sources" are passed * Standard JSON: Catch errors properly when invalid "sources" are passed.
* Standard JSON: Ensure that library addresses supplied are of correct length and hex prefixed.
* Type Checker: Properly warn when using ``_offset`` and ``_slot`` for constants in inline assembly. * Type Checker: Properly warn when using ``_offset`` and ``_slot`` for constants in inline assembly.
* Commandline interface: throw error if option is unknown * Commandline interface: throw error if option is unknown

View File

@ -27,6 +27,8 @@
#include <libdevcore/JSON.h> #include <libdevcore/JSON.h>
#include <libdevcore/SHA3.h> #include <libdevcore/SHA3.h>
#include <boost/algorithm/string.hpp>
using namespace std; using namespace std;
using namespace dev; using namespace dev;
using namespace dev::solidity; using namespace dev::solidity;
@ -337,16 +339,30 @@ Json::Value StandardCompiler::compileInternal(Json::Value const& _input)
return formatFatalError("JSONError", "library entry is not a JSON object."); return formatFatalError("JSONError", "library entry is not a JSON object.");
for (auto const& library: jsonSourceName.getMemberNames()) for (auto const& library: jsonSourceName.getMemberNames())
{ {
string address = jsonSourceName[library].asString();
if (!boost::starts_with(address, "0x"))
return formatFatalError(
"JSONError",
"Library address is not prefixed with \"0x\"."
);
if (address.length() != 42)
return formatFatalError(
"JSONError",
"Library address is of invalid length."
);
try try
{ {
// @TODO use libraries only for the given source // @TODO use libraries only for the given source
libraries[library] = h160(jsonSourceName[library].asString()); libraries[library] = h160(address);
} }
catch (dev::BadHexCharacter) catch (dev::BadHexCharacter)
{ {
return formatFatalError( return formatFatalError(
"JSONError", "JSONError",
"Invalid library address (\"" + jsonSourceName[library].asString() + "\") supplied." "Invalid library address (\"" + address + "\") supplied."
); );
} }
} }

View File

@ -633,7 +633,7 @@ BOOST_AUTO_TEST_CASE(libraries_invalid_hex)
BOOST_CHECK(containsError(result, "JSONError", "Invalid library address (\"0x4200000000000000000000000000000000000xx1\") supplied.")); BOOST_CHECK(containsError(result, "JSONError", "Invalid library address (\"0x4200000000000000000000000000000000000xx1\") supplied."));
} }
BOOST_AUTO_TEST_CASE(libraries_various_addresses) BOOST_AUTO_TEST_CASE(libraries_invalid_length)
{ {
char const* input = R"( char const* input = R"(
{ {
@ -641,11 +641,8 @@ BOOST_AUTO_TEST_CASE(libraries_various_addresses)
"settings": { "settings": {
"libraries": { "libraries": {
"library.sol": { "library.sol": {
"L": 42, "L1": "0x42",
"L3": "42", "L2": "0x4200000000000000000000000000000000000001ff"
"L4": "0x42",
"L5": "0x4200000000000000000000000000000000000001",
"L6": "4200000000000000000000000000000000000001"
} }
} }
}, },
@ -657,7 +654,30 @@ BOOST_AUTO_TEST_CASE(libraries_various_addresses)
} }
)"; )";
Json::Value result = compile(input); Json::Value result = compile(input);
BOOST_CHECK(containsAtMostWarnings(result)); BOOST_CHECK(containsError(result, "JSONError", "Library address is of invalid length."));
}
BOOST_AUTO_TEST_CASE(libraries_missing_hex_prefix)
{
char const* input = R"(
{
"language": "Solidity",
"settings": {
"libraries": {
"library.sol": {
"L": "4200000000000000000000000000000000000001"
}
}
},
"sources": {
"empty": {
"content": ""
}
}
}
)";
Json::Value result = compile(input);
BOOST_CHECK(containsError(result, "JSONError", "Library address is not prefixed with \"0x\"."));
} }
BOOST_AUTO_TEST_CASE(library_linking) BOOST_AUTO_TEST_CASE(library_linking)