mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
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:
commit
2c82f748bb
@ -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
|
||||||
|
|
||||||
|
@ -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."
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user