Skip to content

Commit 0844bba

Browse files
committed
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>
1 parent debe2ed commit 0844bba

2 files changed

Lines changed: 19 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: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,24 @@ test('database.applyChangeset() - wrong arguments', (t) => {
496496
});
497497
});
498498

499+
test('database.applyChangeset() - malformed changeset returns SQLITE_CORRUPT', (t) => {
500+
const database = new DatabaseSync(':memory:');
501+
database.exec('CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, d)');
502+
503+
const changeset = Buffer.from(
504+
'540401000000743100177e0072286565286565',
505+
'hex');
506+
507+
t.assert.throws(() => {
508+
database.applyChangeset(changeset);
509+
}, {
510+
name: 'Error',
511+
message: 'database disk image is malformed',
512+
errcode: 11,
513+
code: 'ERR_SQLITE_ERROR',
514+
});
515+
});
516+
499517
test('session.patchset()', (t) => {
500518
const database = new DatabaseSync(':memory:');
501519
database.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)');

0 commit comments

Comments
 (0)