Skip to content

Commit e9e295b

Browse files
junius-secaduh95
authored andcommitted
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 Backport-PR-URL: #66246 Refs: https://hackerone.com/reports/3736889 Refs: sqlite/sqlite@b869ed6 Signed-off-by: RafaelGSS <rafael.nunu@hotmail.com> Reviewed-By: Richard Lau <richard.lau@ibm.com> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com> Reviewed-By: Xuguang Mei <meixuguang@gmail.com> Reviewed-By: Guilherme Araújo <arauujogui@gmail.com> Reviewed-By: Ulises Gascón <ulisesgascongonzalez@gmail.com> Reviewed-By: Gürgün Dayıoğlu <hey@gurgun.day>
1 parent 512a9b6 commit e9e295b

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
@@ -471,6 +471,27 @@ test('database.applyChangeset() - wrong arguments', (t) => {
471471
});
472472
});
473473

474+
test('database.applyChangeset() - malformed changeset returns SQLITE_CORRUPT', {
475+
skip: process.config.variables.node_shared_sqlite ?
476+
'requires the bundled SQLite session fix' : false,
477+
}, (t) => {
478+
const database = new DatabaseSync(':memory:');
479+
database.exec('CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, d)');
480+
481+
const changeset = Buffer.from(
482+
'540401000000743100177e0072286565286565',
483+
'hex');
484+
485+
t.assert.throws(() => {
486+
database.applyChangeset(changeset);
487+
}, {
488+
name: 'Error',
489+
message: 'database disk image is malformed',
490+
errcode: 11,
491+
code: 'ERR_SQLITE_ERROR',
492+
});
493+
});
494+
474495
test('session.patchset()', (t) => {
475496
const database = new DatabaseSync(':memory:');
476497
database.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)');

0 commit comments

Comments
 (0)