Merge pull request #5849 from therealyingtong/acct-counter-overflow

Check for overflow in IncrementAccountCounter().
This commit is contained in:
Marshall Gaucher 2022-04-08 16:12:29 -07:00 committed by GitHub
commit a660b95032
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 4 deletions

View File

@ -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

View File

@ -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) {