aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcoFalke <falke.marco@gmail.com>2022-02-25 08:45:03 +0100
committerMarcoFalke <falke.marco@gmail.com>2022-02-25 08:45:11 +0100
commitb00b60ed4f27066656e45635f1386e6b1550c6ed (patch)
tree6b87c8cdc015efac7007605c9402533e9ca0b2d7 /src
parentf1ce67f09fbaba4013443bce416e46e5b2d37c19 (diff)
parentd41ed3215355582879c8eb6c99c2da33852f6cb1 (diff)
downloadbitcoin-b00b60ed4f27066656e45635f1386e6b1550c6ed.tar.xz
Merge bitcoin/bitcoin#24201: p2p: Avoid InitError when downgrading peers.dat
d41ed3215355582879c8eb6c99c2da33852f6cb1 p2p: Avoid InitError when downgrading peers.dat (junderw) Pull request description: fixes #24188 (also see https://github.com/bitcoin/bitcoin/pull/22762#issuecomment-951063826) When downgrading, a peers.dat with a future version that has a minimum required version larger than the downgraded Bitcoin Core version would cause an InitError. This commit changes this behavior to overwrite the existing peers.dat with a new empty one. ACKs for top commit: prayank23: reACK https://github.com/bitcoin/bitcoin/pull/24201/commits/d41ed3215355582879c8eb6c99c2da33852f6cb1 kallewoof: reACK d41ed3215355582879c8eb6c99c2da33852f6cb1 Tree-SHA512: c8e625fe36ce0b1aab6c8ef7241c8954038bb856f2de27bdc4814dc9a60e51be28815c7d77d0f96eace49687a0cea02deb713978bbd3a5add742f50a675f2a40
Diffstat (limited to 'src')
-rw-r--r--src/addrdb.cpp9
-rw-r--r--src/addrman.cpp2
-rw-r--r--src/addrman.h6
3 files changed, 16 insertions, 1 deletions
diff --git a/src/addrdb.cpp b/src/addrdb.cpp
index 4f22e688db..0fa8f3c3da 100644
--- a/src/addrdb.cpp
+++ b/src/addrdb.cpp
@@ -197,6 +197,15 @@ std::optional<bilingual_str> LoadAddrman(const std::vector<bool>& asmap, const A
addrman = std::make_unique<AddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
LogPrintf("Creating peers.dat because the file was not found (%s)\n", fs::quoted(fs::PathToString(path_addr)));
DumpPeerAddresses(args, *addrman);
+ } catch (const InvalidAddrManVersionError&) {
+ if (!RenameOver(path_addr, (fs::path)path_addr + ".bak")) {
+ addrman = nullptr;
+ return strprintf(_("Failed to rename invalid peers.dat file. Please move or delete it and try again."));
+ }
+ // Addrman can be in an inconsistent state after failure, reset it
+ addrman = std::make_unique<AddrMan>(asmap, /* deterministic */ false, /* consistency_check_ratio */ check_addrman);
+ LogPrintf("Creating new peers.dat because the file version was not compatible (%s). Original backed up to peers.dat.bak\n", fs::quoted(fs::PathToString(path_addr)));
+ DumpPeerAddresses(args, *addrman);
} catch (const std::exception& e) {
addrman = nullptr;
return strprintf(_("Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start."),
diff --git a/src/addrman.cpp b/src/addrman.cpp
index 3a845b5b6e..f91a979934 100644
--- a/src/addrman.cpp
+++ b/src/addrman.cpp
@@ -248,7 +248,7 @@ void AddrManImpl::Unserialize(Stream& s_)
s >> compat;
const uint8_t lowest_compatible = compat - INCOMPATIBILITY_BASE;
if (lowest_compatible > FILE_FORMAT) {
- throw std::ios_base::failure(strprintf(
+ throw InvalidAddrManVersionError(strprintf(
"Unsupported format of addrman database: %u. It is compatible with formats >=%u, "
"but the maximum supported by this version of %s is %u.",
uint8_t{format}, uint8_t{lowest_compatible}, PACKAGE_NAME, uint8_t{FILE_FORMAT}));
diff --git a/src/addrman.h b/src/addrman.h
index 0646ef368d..472282833b 100644
--- a/src/addrman.h
+++ b/src/addrman.h
@@ -17,6 +17,12 @@
#include <utility>
#include <vector>
+class InvalidAddrManVersionError : public std::ios_base::failure
+{
+public:
+ InvalidAddrManVersionError(std::string msg) : std::ios_base::failure(msg) { }
+};
+
class AddrManImpl;
/** Default for -checkaddrman */