Skip to content

Commit

Permalink
Check for overflow in IncrementAccountCounter().
Browse files Browse the repository at this point in the history
  • Loading branch information
therealyingtong committed Apr 8, 2022
1 parent 8750178 commit 0da6bce
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 4 deletions.
6 changes: 5 additions & 1 deletion src/wallet/wallet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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(): Account counter overflowed (2^31 - 1).");
}

if (generated.has_value()) {
// Update the persisted chain information
Expand Down
14 changes: 11 additions & 3 deletions src/wallet/walletdb.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "key.h"
#include "keystore.h"
#include "zcash/Address.hpp"
#include "zcash/address/zip32.h"

#include <list>
#include <stdint.h>
Expand Down Expand Up @@ -103,9 +104,16 @@ class CHDChain
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 > (HARDENED_KEY_LIMIT - 1)) {
return std::nullopt;
} else {
accountCounter = newAccountCounter;
return newAccountCounter;
}
}

uint32_t GetLegacyTKeyCounter(bool external) {
Expand Down

0 comments on commit 0da6bce

Please sign in to comment.