Skip to content

Commit

Permalink
Fix test failures with newer mscv compilers (related to string aliasing)
Browse files Browse the repository at this point in the history
  • Loading branch information
greg7mdp committed Apr 22, 2022
1 parent 7c66747 commit c6e5423
Showing 1 changed file with 28 additions and 26 deletions.
54 changes: 28 additions & 26 deletions src/ripple/rpc/impl/RPCHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -696,19 +696,31 @@ parseRippleLibSeed(Json::Value const& value)
std::optional<Seed>
getSeedFromRPC(Json::Value const& params, Json::Value& error)
{
// The array should be constexpr, but that makes Visual Studio unhappy.
static char const* const seedTypes[]{
jss::passphrase.c_str(), jss::seed.c_str(), jss::seed_hex.c_str()};
using string_to_seed_t =
std::function<std::optional<Seed>(const std::string&)>;
using seed_match_t = std::pair<const char*, string_to_seed_t>;

static seed_match_t const seedTypes[]{
{jss::passphrase.c_str(),
[](const std::string& s) { return parseGenericSeed(s); }},
{jss::seed.c_str(),
[](const std::string& s) { return parseBase58<Seed>(s); }},
{jss::seed_hex.c_str(), [](const std::string& s) {
uint128 i;
if (i.parseHex(s))
return std::optional<Seed>(Slice(i.data(), i.size()));
return std::optional<Seed>{};
}}};

// Identify which seed type is in use.
char const* seedType = nullptr;
const seed_match_t* seedType = nullptr;
int count = 0;
for (auto t : seedTypes)
for (const auto& t : seedTypes)
{
if (params.isMember(t))
if (params.isMember(t.first))
{
++count;
seedType = t;
seedType = &t;
}
}

Expand All @@ -722,28 +734,17 @@ getSeedFromRPC(Json::Value const& params, Json::Value& error)
}

// Make sure a string is present
if (!params[seedType].isString())
const auto& param = params[seedType->first];
if (!param.isString())
{
error = RPC::expected_field_error(seedType, "string");
error = RPC::expected_field_error(seedType->first, "string");
return std::nullopt;
}

auto const fieldContents = params[seedType].asString();
auto const fieldContents = param.asString();

// Convert string to seed.
std::optional<Seed> seed;

if (seedType == jss::seed.c_str())
seed = parseBase58<Seed>(fieldContents);
else if (seedType == jss::passphrase.c_str())
seed = parseGenericSeed(fieldContents);
else if (seedType == jss::seed_hex.c_str())
{
uint128 s;

if (s.parseHex(fieldContents))
seed.emplace(Slice(s.data(), s.size()));
}
std::optional<Seed> seed = seedType->second(fieldContents);

if (!seed)
error = rpcError(rpcBAD_SEED);
Expand All @@ -757,7 +758,6 @@ keypairForSignature(Json::Value const& params, Json::Value& error)
bool const has_key_type = params.isMember(jss::key_type);

// All of the secret types we allow, but only one at a time.
// The array should be constexpr, but that makes Visual Studio unhappy.
static char const* const secretTypes[]{
jss::passphrase.c_str(),
jss::secret.c_str(),
Expand Down Expand Up @@ -811,7 +811,8 @@ keypairForSignature(Json::Value const& params, Json::Value& error)
return {};
}

if (secretType == jss::secret.c_str())
if (strcmp(secretType, jss::secret.c_str()) ==
0) // don't assume that pointers are the same
{
error = RPC::make_param_error(
"The secret field is not allowed if " +
Expand All @@ -823,7 +824,8 @@ keypairForSignature(Json::Value const& params, Json::Value& error)
// ripple-lib encodes seed used to generate an Ed25519 wallet in a
// non-standard way. While we never encode seeds that way, we try
// to detect such keys to avoid user confusion.
if (secretType != jss::seed_hex.c_str())
if (strcmp(secretType, jss::seed_hex.c_str()) !=
0) // don't assume that pointers are the same
{
seed = RPC::parseRippleLibSeed(params[secretType]);

Expand Down

0 comments on commit c6e5423

Please sign in to comment.