aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichał Sałaban <michal@salaban.info>2017-11-15 15:11:38 +0100
committerMichał Sałaban <michal@salaban.info>2017-11-15 16:35:14 +0100
commit0d149f708f146f64212330088619dd6a9f98b572 (patch)
tree56393592653f00669eff961d1779249fcddd5b80
parentMerge pull request #2818 (diff)
downloadmonero-0d149f708f146f64212330088619dd6a9f98b572.tar.xz
Add out-of-bound exceptions and handle them in RPC
-rw-r--r--src/wallet/wallet2.cpp10
-rw-r--r--src/wallet/wallet_errors.h22
-rw-r--r--src/wallet/wallet_rpc_server.cpp42
3 files changed, 47 insertions, 27 deletions
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index 00b096b88..019581f19 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -644,8 +644,7 @@ void wallet2::add_subaddress_account(const std::string& label)
//----------------------------------------------------------------------------------------------------
void wallet2::add_subaddress(uint32_t index_major, const std::string& label)
{
- if (index_major >= m_subaddress_labels.size())
- throw std::runtime_error("index_major is out of bound");
+ THROW_WALLET_EXCEPTION_IF(index_major >= m_subaddress_labels.size(), error::account_index_outofbound);
uint32_t index_minor = (uint32_t)get_num_subaddresses(index_major);
expand_subaddresses({index_major, index_minor});
m_subaddress_labels[index_major][index_minor] = label;
@@ -701,10 +700,9 @@ std::string wallet2::get_subaddress_label(const cryptonote::subaddress_index& in
//----------------------------------------------------------------------------------------------------
void wallet2::set_subaddress_label(const cryptonote::subaddress_index& index, const std::string &label)
{
- if (index.major >= m_subaddress_labels.size() || index.minor >= m_subaddress_labels[index.major].size())
- MERROR("Subaddress index is out of bounds. Failed to set subaddress label.");
- else
- m_subaddress_labels[index.major][index.minor] = label;
+ THROW_WALLET_EXCEPTION_IF(index.major >= m_subaddress_labels.size(), error::account_index_outofbound);
+ THROW_WALLET_EXCEPTION_IF(index.minor >= m_subaddress_labels[index.major].size(), error::address_index_outofbound);
+ m_subaddress_labels[index.major][index.minor] = label;
}
//----------------------------------------------------------------------------------------------------
/*!
diff --git a/src/wallet/wallet_errors.h b/src/wallet/wallet_errors.h
index 41eb77451..48fce40dd 100644
--- a/src/wallet/wallet_errors.h
+++ b/src/wallet/wallet_errors.h
@@ -269,6 +269,28 @@ namespace tools
}
};
//----------------------------------------------------------------------------------------------------
+ struct index_outofbound : public wallet_logic_error
+ {
+ explicit index_outofbound(std::string&& loc, const std::string& message)
+ : wallet_logic_error(std::move(loc), message)
+ {
+ }
+ };
+ struct account_index_outofbound : public index_outofbound
+ {
+ explicit account_index_outofbound(std::string&& loc)
+ : index_outofbound(std::move(loc), "account index is out of bound")
+ {
+ }
+ };
+ struct address_index_outofbound: public index_outofbound
+ {
+ explicit address_index_outofbound(std::string&& loc)
+ : index_outofbound(std::move(loc), "address index is out of bound")
+ {
+ }
+ };
+ //----------------------------------------------------------------------------------------------------
struct acc_outs_lookup_error : public refresh_error
{
explicit acc_outs_lookup_error(std::string&& loc, const cryptonote::transaction& tx,
diff --git a/src/wallet/wallet_rpc_server.cpp b/src/wallet/wallet_rpc_server.cpp
index f5838d013..378f34122 100644
--- a/src/wallet/wallet_rpc_server.cpp
+++ b/src/wallet/wallet_rpc_server.cpp
@@ -376,27 +376,23 @@ namespace tools
bool wallet_rpc_server::on_create_address(const wallet_rpc::COMMAND_RPC_CREATE_ADDRESS::request& req, wallet_rpc::COMMAND_RPC_CREATE_ADDRESS::response& res, epee::json_rpc::error& er)
{
if (!m_wallet) return not_open(er);
- m_wallet->add_subaddress(req.account_index, req.label);
- res.address_index = m_wallet->get_num_subaddresses(req.account_index) - 1;
- res.address = m_wallet->get_subaddress_as_str({req.account_index, res.address_index});
+ try
+ {
+ m_wallet->add_subaddress(req.account_index, req.label);
+ res.address_index = m_wallet->get_num_subaddresses(req.account_index) - 1;
+ res.address = m_wallet->get_subaddress_as_str({req.account_index, res.address_index});
+ }
+ catch (const std::exception& e)
+ {
+ handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR);
+ return false;
+ }
return true;
}
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server::on_label_address(const wallet_rpc::COMMAND_RPC_LABEL_ADDRESS::request& req, wallet_rpc::COMMAND_RPC_LABEL_ADDRESS::response& res, epee::json_rpc::error& er)
{
if (!m_wallet) return not_open(er);
- if (req.index.major >= m_wallet->get_num_subaddress_accounts())
- {
- er.code = WALLET_RPC_ERROR_CODE_ACCOUNT_INDEX_OUTOFBOUND;
- er.message = "Account index is out of bound";
- return false;
- }
- if (req.index.minor >= m_wallet->get_num_subaddresses(req.index.major))
- {
- er.code = WALLET_RPC_ERROR_CODE_ADDRESS_INDEX_OUTOFBOUND;
- er.message = "Address index is out of bound";
- return false;
- }
try
{
m_wallet->set_subaddress_label(req.index, req.label);
@@ -458,12 +454,6 @@ namespace tools
bool wallet_rpc_server::on_label_account(const wallet_rpc::COMMAND_RPC_LABEL_ACCOUNT::request& req, wallet_rpc::COMMAND_RPC_LABEL_ACCOUNT::response& res, epee::json_rpc::error& er)
{
if (!m_wallet) return not_open(er);
- if (req.account_index >= m_wallet->get_num_subaddress_accounts())
- {
- er.code = WALLET_RPC_ERROR_CODE_ACCOUNT_INDEX_OUTOFBOUND;
- er.message = "Account index is out of bound";
- return false;
- }
try
{
m_wallet->set_subaddress_label({req.account_index, 0}, req.label);
@@ -2041,6 +2031,16 @@ namespace tools
er.code = WALLET_RPC_ERROR_CODE_INVALID_PASSWORD;
er.message = "Invalid password.";
}
+ catch (const error::account_index_outofbound& e)
+ {
+ er.code = WALLET_RPC_ERROR_CODE_ACCOUNT_INDEX_OUTOFBOUND;
+ er.message = e.what();
+ }
+ catch (const error::address_index_outofbound& e)
+ {
+ er.code = WALLET_RPC_ERROR_CODE_ADDRESS_INDEX_OUTOFBOUND;
+ er.message = e.what();
+ }
catch (const std::exception& e)
{
er.code = default_error_code;