From: dan Date: Mon, 6 Jul 2026 14:10:43 +0000 (+0000) Subject: Fix an OOB read that could occur in RBU when using a state db with corrupt contents... X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=108288ae7f80dc1a78004a98747e789d9acd16ba;p=thirdparty%2Fsqlite.git Fix an OOB read that could occur in RBU when using a state db with corrupt contents. Bug [bugs:/info/2026-07-06T13:02:00Z | 2026-07-06T13:02:00Z]. FossilOrigin-Name: 9e54159f9a839f7fae3dee348fab862dc4bbe36ab866d0b3927f05fd10b1414a --- diff --git a/ext/rbu/rbucorrupt.test b/ext/rbu/rbucorrupt.test new file mode 100644 index 0000000000..0f9841e638 --- /dev/null +++ b/ext/rbu/rbucorrupt.test @@ -0,0 +1,61 @@ +# 2026 July 6 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# + +source [file join [file dirname [info script]] rbu_common.tcl] +if_no_rbu_support { finish_test ; return } +set ::testprefix rbucorrupt + +forcedelete rbu.db +forcedelete state.db + +do_execsql_test 1.0 { + CREATE TABLE t1(id INTEGER PRIMARY KEY, a, b); + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<63 + ) + INSERT INTO t1 SELECT i, i*10, 'row'||i FROM s; +} + +sqlite3 db rbu.db +do_execsql_test 1.1 { + CREATE TABLE data_t1(id INTEGER PRIMARY KEY, a, b, rbu_control); + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<63 + ) + INSERT INTO data_t1 SELECT i, i*100, NULL, '.x.' FROM s; +} + +db close + +do_test 1.2 { + sqlite3rbu rbu test.db rbu.db state.db + while {[rbu step]=="SQLITE_OK"} { + set st [rbu state] + if {$st=="checkpoint"} break + } + rbu close +} {SQLITE_OK} + +do_test 1.3 { + sqlite3 db state.db + db eval { UPDATE rbu_state SET v=-1 WHERE k=4 } + db close +} {} + +do_test 1.4 { + sqlite3rbu rbu test.db rbu.db state.db + rbu step + list [catch { rbu close } msg] $msg +} {1 SQLITE_CORRUPT} + + +finish_test diff --git a/ext/rbu/sqlite3rbu.c b/ext/rbu/sqlite3rbu.c index f0e08ad242..d55442b54a 100644 --- a/ext/rbu/sqlite3rbu.c +++ b/ext/rbu/sqlite3rbu.c @@ -2758,6 +2758,9 @@ static RbuState *rbuLoadState(sqlite3rbu *p){ case RBU_STATE_ROW: pRet->nRow = sqlite3_column_int(pStmt, 1); + if( pRet->nRow<0 ){ + rc = SQLITE_CORRUPT; + } break; case RBU_STATE_PROGRESS: diff --git a/manifest b/manifest index 403d0bc46b..f8471abc3b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sa\s(harmless)\s1-byte\sOOB\sread\sdue\sto\smalformed\sinputs\sin\sthe\nnormalize.c\sextension.\n[bugs:/info/2026-07-06T13:02:37Z|Bug\s2026-07-06T13:02:37Z] -D 2026-07-06T13:43:42.286 +C Fix\san\sOOB\sread\sthat\scould\soccur\sin\sRBU\swhen\susing\sa\sstate\sdb\swith\scorrupt\scontents.\sBug\s[bugs:/info/2026-07-06T13:02:00Z\s|\s2026-07-06T13:02:00Z]. +D 2026-07-06T14:10:43.203 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -446,6 +446,7 @@ F ext/rbu/rbuC.test 5326ea3954754c68fd518beb70d3e6b6690af53e1a5fa102d650e4110b26 F ext/rbu/rbu_common.tcl 15d063397a89aeaf26b4cbdf6f29911b4154a902ba61a40c4f180ab452454a63 F ext/rbu/rbubusy.test 88298187ad35aac9084436d85ca66b3722f96eaa704a09cfe5f931d452ab7237 F ext/rbu/rbucollate.test 9852ec5e5ba7f3b04ce849a24ef7298e03ae0f16e58e6031d0f845234559feec +F ext/rbu/rbucorrupt.test 289363dc1a66362368925cffce90d781dc8ac49f85943b2618027bf830bb9d7e F ext/rbu/rbucrash.test d2b5d619d9281c89cad74401b73b46172daa89906940b1d739c813ddc0cd2cf5 F ext/rbu/rbucrash2.test 0a1a72223d880215ce2893a3260320c31a9358d23cb124c610e4f0d984a93285 F ext/rbu/rbudiff.test 8b8b8b569c68fc880134e0fac4bf6b4b7a907aea4cc6eacf7e1d45e1d47b6aac @@ -471,7 +472,7 @@ F ext/rbu/rbuvacuum.test e3585cfda220038e8186c583e9bd2aaa9eccd0a5c2e40ed861de3c9 F ext/rbu/rbuvacuum2.test 1a9bd41f127be2826de2a65204df9118525a8af8d16e61e6bc63ba3ac0010a23 F ext/rbu/rbuvacuum3.test 3ce42695fdf21aaa3499e857d7d4253bc499ad759bcd6c9362042c13cd37d8de F ext/rbu/rbuvacuum4.test ffccd22f67e2d0b380d2889685742159dfe0d19a3880ca3d2d1d69eefaebb205 -F ext/rbu/sqlite3rbu.c fe93f6d115d4c856c7cc385c9acafde6b9ccbb7eda1637cc09823fc6bb79caca +F ext/rbu/sqlite3rbu.c 3b99497c995eb19163bf4409dd95988859700778380bb07391998866a9aff94f F ext/rbu/sqlite3rbu.h e3a5bf21e09ca93ce4e8740e00d6a853e90a697968ec0ea98f40826938bdb68e F ext/rbu/test_rbu.c 8b6e64e486c28c41ef29f6f4ea6be7b3091958987812784904f5e903f6b56418 F ext/recover/dbdata.c 10d3c56968a9af6853722a47280805ad1564714d79ea45ac6f7da14bb57fd137 @@ -2212,8 +2213,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 887a29a8373bc3a5405df2288840c4918c045560a3a1de5303a4984eb4b40b50 -R e4653407d0fe222d43bad82b5d39fd2c -U drh -Z 31bdf81708959ebdee36f8a70d682ac3 +P b1d7123bc619e3cb9dffa8dd52ba31cc18329b14557d8f2d9e547b729016548c +R 5b00a3394e222b46e736bcc82bff1810 +U dan +Z 5cf870c30bacf696146bc3c88c8044c7 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0c3f974736..71c712cf21 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b1d7123bc619e3cb9dffa8dd52ba31cc18329b14557d8f2d9e547b729016548c +9e54159f9a839f7fae3dee348fab862dc4bbe36ab866d0b3927f05fd10b1414a