Merge pull request #5849 from therealyingtong/acct-counter-overflow
Check for overflow in IncrementAccountCounter().
This commit is contained in:
commit
a660b95032
|
@ -522,7 +522,11 @@ std::pair<UnifiedFullViewingKey, libzcash::AccountId> CWallet::GenerateNewUnifie
|
|||
while (true) {
|
||||
auto accountId = hdChain.GetAccountCounter();
|
||||
auto generated = GenerateUnifiedSpendingKeyForAccount(accountId);
|
||||
hdChain.IncrementAccountCounter();
|
||||
auto account = hdChain.IncrementAccountCounter();
|
||||
if (!account.has_value()) {
|
||||
throw std::runtime_error(
|
||||
"CWallet::GenerateNewUnifiedSpendingKey(): Already generated the maxiumum number of accounts (2^31 - 2) for this wallet's mnemonic phrase. Congratulations, you need to create a new wallet!");
|
||||
}
|
||||
|
||||
if (generated.has_value()) {
|
||||
// Update the persisted chain information
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include "key.h"
|
||||
#include "keystore.h"
|
||||
#include "zcash/Address.hpp"
|
||||
#include "zcash/address/zip32.h"
|
||||
|
||||
#include <list>
|
||||
#include <stdint.h>
|
||||
|
@ -103,9 +104,16 @@ public:
|
|||
return accountCounter;
|
||||
}
|
||||
|
||||
void IncrementAccountCounter() {
|
||||
// TODO: We should check for overflow somewhere and handle it.
|
||||
accountCounter += 1;
|
||||
/** Increments the account counter by 1 and returns it. Returns std::nullopt
|
||||
* if the increment operation would cause an overflow. */
|
||||
std::optional<uint32_t> IncrementAccountCounter() {
|
||||
auto newAccountCounter = accountCounter + 1;
|
||||
if (newAccountCounter >= libzcash::ZCASH_LEGACY_ACCOUNT) {
|
||||
return std::nullopt;
|
||||
} else {
|
||||
accountCounter = newAccountCounter;
|
||||
return newAccountCounter;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t GetLegacyTKeyCounter(bool external) {
|
||||
|
|
Loading…
Reference in New Issue