Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rpcdaemon: skip tests in sanitizer build to avoid ASAN error after glaze 1.9.9 #1736

Merged
merged 5 commits into from
Jan 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 26 additions & 12 deletions silkworm/rpc/json/glaze.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,29 @@

#include "glaze.hpp"

#include <algorithm>
#include <cstring>
#include <string>
#include <string_view>

#include <silkworm/rpc/common/util.hpp>
#include <silkworm/rpc/json/types.hpp>

namespace silkworm::rpc {

static constexpr auto errorMessageSize = 1024;
//! Maximum size of RPC error message
static constexpr size_t kMaxErrorMessageSize{1024};

//! Fill a fixed error message by trimming the provided message if needed
static void fill_error_message(char fixed_msg[kMaxErrorMessageSize], const std::string& msg) {
const auto error_message_size{std::min(msg.size(), kMaxErrorMessageSize - 1)};
std::strncpy(fixed_msg, msg.c_str(), error_message_size);
fixed_msg[error_message_size] = '\0';
}

struct GlazeJsonError {
int code{-1};
char message[errorMessageSize]{};
char message[kMaxErrorMessageSize]{};
struct glaze {
using T = GlazeJsonError;
static constexpr auto value = glz::object(
Expand All @@ -46,19 +60,19 @@ struct GlazeJsonErrorRsp {
};
};

void make_glaze_json_error(const nlohmann::json& request_json, const int error_id, const std::string& message, std::string& json_reply) {
GlazeJsonErrorRsp glaze_json_error;
void make_glaze_json_error(const nlohmann::json& request, const int error_id, const std::string& message, std::string& reply) {
GlazeJsonErrorRsp glaze_json_error{};

glaze_json_error.id = make_jsonrpc_id(request_json);
glaze_json_error.id = make_jsonrpc_id(request);
glaze_json_error.json_error.code = error_id;
std::strncpy(glaze_json_error.json_error.message, message.c_str(), message.size() > errorMessageSize ? errorMessageSize : message.size() + 1);
fill_error_message(glaze_json_error.json_error.message, message);

glz::write_json(glaze_json_error, json_reply);
glz::write_json(glaze_json_error, reply);
}

struct GlazeJsonRevert {
int code{-1};
char message[errorMessageSize]{};
char message[kMaxErrorMessageSize]{};
std::string data;
struct glaze {
using T = GlazeJsonRevert;
Expand All @@ -82,12 +96,12 @@ struct GlazeJsonRevertError {
};
};

void make_glaze_json_error(const nlohmann::json& request_json, const RevertError& error, std::string& reply) {
GlazeJsonRevertError glaze_json_revert;
void make_glaze_json_error(const nlohmann::json& request, const RevertError& error, std::string& reply) {
GlazeJsonRevertError glaze_json_revert{};

glaze_json_revert.id = make_jsonrpc_id(request_json);
glaze_json_revert.id = make_jsonrpc_id(request);
glaze_json_revert.revert_data.code = error.code;
std::strncpy(glaze_json_revert.revert_data.message, error.message.c_str(), error.message.size() > errorMessageSize ? errorMessageSize : error.message.size() + 1);
fill_error_message(glaze_json_revert.revert_data.message, error.message);
glaze_json_revert.revert_data.data = "0x" + silkworm::to_hex(error.data);

glz::write_json(glaze_json_revert, reply);
Expand Down
4 changes: 2 additions & 2 deletions silkworm/rpc/json/glaze.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ inline constexpr auto kInt256HexSize = 2 + 2 * sizeof(intx::uint256) + 1;
inline constexpr auto kDataSize = 16384;
inline constexpr auto kEthCallResultFixedSize = 2048;

void make_glaze_json_error(const nlohmann::json& request_json, int error_id, const std::string& message, std::string& reply);
void make_glaze_json_error(const nlohmann::json& request_json, const RevertError& error, std::string& reply);
void make_glaze_json_error(const nlohmann::json& request, int error_id, const std::string& message, std::string& reply);
void make_glaze_json_error(const nlohmann::json& request, const RevertError& error, std::string& reply);

} // namespace silkworm::rpc
93 changes: 75 additions & 18 deletions silkworm/rpc/json/glaze_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,37 +16,94 @@

#include "glaze.hpp"

#include <optional>
#include <string>
#include <vector>

#include <catch2/catch.hpp>
#include <evmc/evmc.hpp>
#include <intx/intx.hpp>

#include <silkworm/core/common/util.hpp>
#include <silkworm/node/db/access_layer.hpp>

namespace silkworm::rpc {

TEST_CASE("make glaze json error", "[make_glaze_json_error]") {
// Necessary just to extract `id` field to fill the same into the reply
const nlohmann::json kEmptyRequest{{"jsonrpc", "2.0"}, {"id", 1}};

TEST_CASE("make glaze json error", "[silkworm][rpc][make_glaze_json_error]") {
std::string json;
make_glaze_json_error(1, 3, "generic_error", json);
CHECK(strcmp(json.c_str(),
"{\"jsonrpc\":\"2.0\",\
\"id\":1,\
\"error\":{\"code\":3,\"message\":\"generic_error\"}}"));
make_glaze_json_error(kEmptyRequest, 3, "generic_error", json);
CHECK(json == R"({"jsonrpc":"2.0","id":1,"error":{"code":3,"message":"generic_error"}})");
}

// Temporary skip in sanitizer builds due to ASAN error after upgrade to glaze 1.9.9
// https://app.circleci.com/pipelines/github/erigontech/silkworm/10176/workflows/e2c43524-e9c4-4c95-b087-199ded7baf09/jobs/45082
#ifndef SILKWORM_SANITIZE
TEST_CASE("make glaze json revert error", "[silkworm][rpc][make_glaze_json_error]") {
std::string json;
const char* data_hex{"c68341b58302c0"};
Bytes data_bytes{*from_hex(data_hex)};
make_glaze_json_error(kEmptyRequest, RevertError{{3, "generic_error"}, data_bytes}, json);
CHECK(json == R"({"jsonrpc":"2.0","id":1,"error":{"code":3,"message":"generic_error","data":"0xc68341b58302c0"}})");
}

TEST_CASE("make glaze json error (Revert)", "[make_glaze_json_error]") {
TEST_CASE("make glaze json revert error too big", "[silkworm][rpc][make_glaze_json_error]") {
std::string json;
const char* data_hex{"c68341b58302c0"};
silkworm::Bytes data_bytes{*silkworm::from_hex(data_hex)};
make_glaze_json_error(1, RevertError{{3, "generic_error"}, data_bytes}, json);
CHECK(strcmp(json.c_str(),
"{\"jsonrpc\":\"2.0\",\
\"id\":1,\
\"error\":{\"code\":3,\"message\":\"generic_error\",\"data\": \"0xc68341b58302c0\"}}"));
Bytes data_bytes{*from_hex(data_hex)};
std::string error_message(1024, '\1');
make_glaze_json_error(kEmptyRequest, RevertError{{3, error_message}, data_bytes}, json);
CHECK(std::strcmp(json.c_str(), R"({"jsonrpc":"2.0","id":1,"error":{"code":3,"message":")"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01)"
R"(\x01\x01\x01","data":"0xc68341b58302c0"}})"));
}
#endif // SILKWORM_SANITIZE

} // namespace silkworm::rpc