Skip to content

Commit d8ac301

Browse files
authored
deps: cherry-pick e807d4e379 from SQLite
Backport the SQLite session extension fix for corrupt changesets that omit old values for primary-key columns. This avoids passing NULL to sessionBindValue() while applying UPDATE changesets. Refs: https://sqlite.org/src/info/e807d4e3798efd53 Signed-off-by: junius-sec <sksch323@naver.com> PR-URL: #63525 Refs: https://hackerone.com/reports/3736889 Refs: sqlite/sqlite@b869ed6 Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
1 parent 4639dcb commit d8ac301

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

deps/sqlite/sqlite3.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238388,7 +238388,7 @@ static int sessionApplyOneOp(
238388238388
for(i=0; rc==SQLITE_OK && i<nCol; i++){
238389238389
sqlite3_value *pOld = sessionChangesetOld(pIter, i);
238390238390
sqlite3_value *pNew = sessionChangesetNew(pIter, i);
238391-
if( p->abPK[i] || (bPatchset==0 && pOld) ){
238391+
if( pOld && (p->abPK[i] || bPatchset==0) ){
238392238392
rc = sessionBindValue(pUp, i*2+2, pOld);
238393238393
}
238394238394
if( rc==SQLITE_OK && pNew ){

test/parallel/test-sqlite-session.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,27 @@ test('database.applyChangeset() - wrong arguments', (t) => {
496496
});
497497
});
498498

499+
test('database.applyChangeset() - malformed changeset returns SQLITE_CORRUPT', {
500+
skip: process.config.variables.node_shared_sqlite ?
501+
'requires the bundled SQLite session fix' : false,
502+
}, (t) => {
503+
const database = new DatabaseSync(':memory:');
504+
database.exec('CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, d)');
505+
506+
const changeset = Buffer.from(
507+
'540401000000743100177e0072286565286565',
508+
'hex');
509+
510+
t.assert.throws(() => {
511+
database.applyChangeset(changeset);
512+
}, {
513+
name: 'Error',
514+
message: 'database disk image is malformed',
515+
errcode: 11,
516+
code: 'ERR_SQLITE_ERROR',
517+
});
518+
});
519+
499520
test('session.patchset()', (t) => {
500521
const database = new DatabaseSync(':memory:');
501522
database.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)');

0 commit comments

Comments
 (0)