From c18fd9060bf62bf79baa4894adee2c69887c5b34 Mon Sep 17 00:00:00 2001 From: Nora Dossche <7771979+ndossche@users.noreply.github.com> Date: Thu, 6 Aug 2026 05:18:25 +0200 Subject: [PATCH] sqlite: fix undefined behaviour in `Session::Changeset()` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If `nChangeset == 0`, the pointer `pChangeset` may be nullptr. Passing a nullptr to `memcpy()` is undefined behaviour. This can be triggered by running the test suite under UBSAN. Signed-off-by: ndossche PR-URL: https://github.com/nodejs/node/pull/63637 Reviewed-By: René --- src/node_sqlite.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/node_sqlite.cc b/src/node_sqlite.cc index 50bd3a36173..d474f89db90 100644 --- a/src/node_sqlite.cc +++ b/src/node_sqlite.cc @@ -3936,7 +3936,9 @@ void Session::Changeset(const FunctionCallbackInfo& args) { auto freeChangeset = OnScopeLeave([&] { sqlite3_free(pChangeset); }); Local buffer = ArrayBuffer::New(env->isolate(), nChangeset); - std::memcpy(buffer->GetBackingStore()->Data(), pChangeset, nChangeset); + if (nChangeset > 0) { + std::memcpy(buffer->GetBackingStore()->Data(), pChangeset, nChangeset); + } Local uint8Array = Uint8Array::New(buffer, 0, nChangeset); args.GetReturnValue().Set(uint8Array);