From 1d858b055daeea363e0450f327672658548be4c6 Mon Sep 17 00:00:00 2001 From: Ryan Ofsky Date: Wed, 31 May 2023 15:22:50 -0400 Subject: walletdb: Handle when database keys are empty --- src/wallet/bdb.cpp | 2 +- src/wallet/sqlite.cpp | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/wallet/bdb.cpp b/src/wallet/bdb.cpp index dbd80718f6..7a1916ddc3 100644 --- a/src/wallet/bdb.cpp +++ b/src/wallet/bdb.cpp @@ -691,7 +691,7 @@ DatabaseCursor::Status BerkeleyCursor::Next(DataStream& ssKey, DataStream& ssVal if (ret == DB_NOTFOUND) { return Status::DONE; } - if (ret != 0 || datKey.get_data() == nullptr || datValue.get_data() == nullptr) { + if (ret != 0) { return Status::FAIL; } diff --git a/src/wallet/sqlite.cpp b/src/wallet/sqlite.cpp index 7621f2476b..55245707ed 100644 --- a/src/wallet/sqlite.cpp +++ b/src/wallet/sqlite.cpp @@ -39,7 +39,11 @@ static bool BindBlobToStatement(sqlite3_stmt* stmt, Span blob, const std::string& description) { - int res = sqlite3_bind_blob(stmt, index, blob.data(), blob.size(), SQLITE_STATIC); + // Pass a pointer to the empty string "" below instead of passing the + // blob.data() pointer if the blob.data() pointer is null. Passing a null + // data pointer to bind_blob would cause sqlite to bind the SQL NULL value + // instead of the empty blob value X'', which would mess up SQL comparisons. + int res = sqlite3_bind_blob(stmt, index, blob.data() ? static_cast(blob.data()) : "", blob.size(), SQLITE_STATIC); if (res != SQLITE_OK) { LogPrintf("Unable to bind %s to statement: %s\n", description, sqlite3_errstr(res)); sqlite3_clear_bindings(stmt); -- cgit v1.2.3