Control: tags -1 - confirmed

On Thu, Oct 03, 2024 at 05:29:32PM +0200, László Böszörményi (GCS) wrote:
> On Wed, Oct 2, 2024 at 3:44 PM Adrian Bunk <b...@debian.org> wrote:
> > Thanks for noticing, debdiff is now attached.
>  With my maintainer hat on, I ACK this update.
> I recommend two more updates which are very straightforward ones. The
> first one is a stack overflow [1] and the second is a signed integer
> overflow [2] fix. The choice is yours of course to include these or
> not.

Thanks for the feedback, and apologies for the late reply.

I agree that these make sense, an updated debdiff is attached.

> Regards,
> Laszlo/GCS
> [1] https://sqlite.org/src/info/074002718b2ecb9f
> [2] https://sqlite.org/src/info/e6bec37ea1ca51e1

cu
Adrian
diffstat for sqlite3-3.40.1 sqlite3-3.40.1

 changelog                                                               |   11 
+
 patches/0001-Fix-a-buffer-overread-in-the-sessions-extension-that.patch |   45 
+++++
 patches/0002-Avoid-a-stack-overflow-that-could-be-caused-by-a-rec.patch |   58 
++++++
 patches/0003-Fix-a-technically-undefined-signed-integer-overflow-.patch |   90 
++++++++++
 patches/series                                                          |    3 
 5 files changed, 207 insertions(+)

diff -Nru sqlite3-3.40.1/debian/changelog sqlite3-3.40.1/debian/changelog
--- sqlite3-3.40.1/debian/changelog     2023-03-16 20:54:28.000000000 +0200
+++ sqlite3-3.40.1/debian/changelog     2024-11-02 22:03:43.000000000 +0200
@@ -1,3 +1,14 @@
+sqlite3 (3.40.1-2+deb12u1) bookworm; urgency=medium
+
+  * Non-maintainer upload.
+  * CVE-2023-7104: Session extension buffer overread
+  * Backport fix for a stack overflow that could be caused by a
+    recursively defined WINDOW() with a strategically embedded error.
+  * Backport fix for a technically undefined signed integer overflow
+    in fts5.
+
+ -- Adrian Bunk <b...@debian.org>  Sat, 02 Nov 2024 22:03:43 +0200
+
 sqlite3 (3.40.1-2) unstable; urgency=medium
 
   [ Cyril Brulebois <cy...@debamax.com> ]
diff -Nru 
sqlite3-3.40.1/debian/patches/0001-Fix-a-buffer-overread-in-the-sessions-extension-that.patch
 
sqlite3-3.40.1/debian/patches/0001-Fix-a-buffer-overread-in-the-sessions-extension-that.patch
--- 
sqlite3-3.40.1/debian/patches/0001-Fix-a-buffer-overread-in-the-sessions-extension-that.patch
       1970-01-01 02:00:00.000000000 +0200
+++ 
sqlite3-3.40.1/debian/patches/0001-Fix-a-buffer-overread-in-the-sessions-extension-that.patch
       2024-11-02 22:03:43.000000000 +0200
@@ -0,0 +1,45 @@
+From a13638ed10eff960cebe88554bca48704a66a268 Mon Sep 17 00:00:00 2001
+From: dan <Dan Kennedy>
+Date: Thu, 7 Sep 2023 13:53:09 +0000
+Subject: Fix a buffer overread in the sessions extension that could occur when
+ processing a corrupt changeset.
+
+FossilOrigin-Name: 
0e4e7a05c4204b47a324d67e18e76d2a98e26b2723d19d5c655ec9fd2e41f4b7
+---
+ ext/session/sqlite3session.c | 18 +++++++++++-------
+ 1 file changed, 11 insertions(+), 7 deletions(-)
+
+diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c
+index fd06f3b4d6..776797ff29 100644
+--- a/ext/session/sqlite3session.c
++++ b/ext/session/sqlite3session.c
+@@ -3050,15 +3050,19 @@ static int sessionReadRecord(
+         }
+       }
+       if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){
+-        sqlite3_int64 v = sessionGetI64(aVal);
+-        if( eType==SQLITE_INTEGER ){
+-          sqlite3VdbeMemSetInt64(apOut[i], v);
++        if( (pIn->nData-pIn->iNext)<8 ){
++          rc = SQLITE_CORRUPT_BKPT;
+         }else{
+-          double d;
+-          memcpy(&d, &v, 8);
+-          sqlite3VdbeMemSetDouble(apOut[i], d);
++          sqlite3_int64 v = sessionGetI64(aVal);
++          if( eType==SQLITE_INTEGER ){
++            sqlite3VdbeMemSetInt64(apOut[i], v);
++          }else{
++            double d;
++            memcpy(&d, &v, 8);
++            sqlite3VdbeMemSetDouble(apOut[i], d);
++          }
++          pIn->iNext += 8;
+         }
+-        pIn->iNext += 8;
+       }
+     }
+   }
+-- 
+2.30.2
+
diff -Nru 
sqlite3-3.40.1/debian/patches/0002-Avoid-a-stack-overflow-that-could-be-caused-by-a-rec.patch
 
sqlite3-3.40.1/debian/patches/0002-Avoid-a-stack-overflow-that-could-be-caused-by-a-rec.patch
--- 
sqlite3-3.40.1/debian/patches/0002-Avoid-a-stack-overflow-that-could-be-caused-by-a-rec.patch
       1970-01-01 02:00:00.000000000 +0200
+++ 
sqlite3-3.40.1/debian/patches/0002-Avoid-a-stack-overflow-that-could-be-caused-by-a-rec.patch
       2024-11-02 22:03:43.000000000 +0200
@@ -0,0 +1,58 @@
+From da3b3bb73b5483cf9b277501c7020c882db14740 Mon Sep 17 00:00:00 2001
+From: dan <Dan Kennedy>
+Date: Sat, 24 Aug 2024 15:54:15 +0000
+Subject: Avoid a stack overflow that could be caused by a recursively defined
+ WINDOW() with a strategically embedded error.
+
+FossilOrigin-Name: 
bada54bd6bf54190e40aa721b77081015957d204c7b6a9fdbe8c67bcf20798f8
+---
+ src/resolve.c     |  2 +-
+ test/windowE.test | 20 ++++++++++++++++++++
+ 2 files changed, 21 insertions(+), 1 deletion(-)
+
+diff --git a/src/resolve.c b/src/resolve.c
+index 1c3a9d9097..05d23ce029 100644
+--- a/src/resolve.c
++++ b/src/resolve.c
+@@ -1159,7 +1159,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
+       sqlite3WalkExprList(pWalker, pList);
+       if( is_agg ){
+ #ifndef SQLITE_OMIT_WINDOWFUNC
+-        if( pWin ){
++        if( pWin && pParse->nErr==0 ){
+           Select *pSel = pNC->pWinSelect;
+           assert( pWin==0 || (ExprUseYWin(pExpr) && pWin==pExpr->y.pWin) );
+           if( IN_RENAME_OBJECT==0 ){
+diff --git a/test/windowE.test b/test/windowE.test
+index f20bcdaaa8..9128468b3c 100644
+--- a/test/windowE.test
++++ b/test/windowE.test
+@@ -54,5 +54,25 @@ do_execsql_test 1.3 {
+   5 5,4 5,4,1 5,4,1,6 5,4,1,6,3 5,4,1,6,3,2
+ }
+ 
++#-------------------------------------------------------------------------
++reset_db
++do_execsql_test 2.0 {
++  CREATE TABLE t1(x);
++}
++
++sqlite3_create_aggregate db
++
++breakpoint
++do_catchsql_test 2.1 {
++  SELECT min(x) OVER w1 FROM t1
++    WINDOW w1 AS (PARTITION BY x_count(x) OVER w1);
++} {1 {x_count() may not be used as a window function}}
++
++do_catchsql_test 2.2 {
++  SELECT min(x) FILTER (WHERE x_count(x) OVER w1) OVER w1 FROM t1
++    WINDOW w1 AS (PARTITION BY x OVER w1);
++} {1 {near "OVER": syntax error}}
++
++
+ finish_test
+ 
+-- 
+2.30.2
+
diff -Nru 
sqlite3-3.40.1/debian/patches/0003-Fix-a-technically-undefined-signed-integer-overflow-.patch
 
sqlite3-3.40.1/debian/patches/0003-Fix-a-technically-undefined-signed-integer-overflow-.patch
--- 
sqlite3-3.40.1/debian/patches/0003-Fix-a-technically-undefined-signed-integer-overflow-.patch
       1970-01-01 02:00:00.000000000 +0200
+++ 
sqlite3-3.40.1/debian/patches/0003-Fix-a-technically-undefined-signed-integer-overflow-.patch
       2024-11-02 22:03:43.000000000 +0200
@@ -0,0 +1,90 @@
+From b8ab0b5de0243b7a4a849148d584b2e6199e10b3 Mon Sep 17 00:00:00 2001
+From: dan <Dan Kennedy>
+Date: Mon, 2 Sep 2024 18:41:59 +0000
+Subject: Fix a technically undefined signed integer overflow in fts5.
+
+FossilOrigin-Name: 
e6bec37ea1ca51e1d048941ce4c5211d8fc5c5e3556a1441f9c79b036843f9e3
+---
+ ext/fts5/fts5_index.c             |  2 +-
+ ext/fts5/test/fts5integrity2.test | 56 +++++++++++++++++++++++++++++++
+ 2 files changed, 57 insertions(+), 1 deletion(-)
+ create mode 100644 ext/fts5/test/fts5integrity2.test
+
+diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c
+index 7eca9b1321..86d90deb69 100644
+--- a/ext/fts5/fts5_index.c
++++ b/ext/fts5/fts5_index.c
+@@ -1977,7 +1977,7 @@ static void fts5SegIterNext_None(
+ 
+   if( iOff<pIter->iEndofDoclist ){
+     /* Next entry is on the current page */
+-    i64 iDelta;
++    u64 iDelta;
+     iOff += sqlite3Fts5GetVarint(&pIter->pLeaf->p[iOff], (u64*)&iDelta);
+     pIter->iLeafOffset = iOff;
+     pIter->iRowid += iDelta;
+diff --git a/ext/fts5/test/fts5integrity2.test 
b/ext/fts5/test/fts5integrity2.test
+new file mode 100644
+index 0000000000..968be3bddf
+--- /dev/null
++++ b/ext/fts5/test/fts5integrity2.test
+@@ -0,0 +1,56 @@
++# 2024 September 3
++#
++# 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.
++#
++#***********************************************************************
++#
++# This file contains tests focused on the integrity-check procedure.
++#
++
++source [file join [file dirname [info script]] fts5_common.tcl]
++set testprefix fts5integrity2
++
++# If SQLITE_ENABLE_FTS5 is not defined, omit this file.
++ifcapable !fts5 {
++  finish_test
++  return
++}
++
++do_execsql_test 2.0 {
++  CREATE VIRTUAL TABLE t2 USING fts5(a, detail='none');
++  BEGIN;
++    INSERT INTO t2(rowid, a) VALUES(-1, 'hello world');
++    INSERT INTO t2(rowid, a) VALUES(9223372036854775807, 'hello world');
++  COMMIT;
++}
++
++do_execsql_test 2.1 {
++  SELECT rowid FROM t2('hello AND world');
++} {-1 9223372036854775807}
++
++#-------------------------------------------------------------------------
++do_execsql_test 2.0 {
++  CREATE VIRTUAL TABLE t1 USING fts5(a, detail='none');
++  CREATE TABLE r1(r);
++  
++  WITH c(x) AS (VALUES(1) UNION SELECT x<<1 FROM c)
++    INSERT INTO r1(r) SELECT -1-x FROM c;
++
++  INSERT INTO t1(rowid, a) SELECT r, 'abc' FROM r1;
++}
++
++do_execsql_test 2.1 {
++  PRAGMA integrity_check;
++} {ok}
++
++do_execsql_test 2.2 {
++  SELECT rowid FROM t1('abc') ORDER BY +rowid;
++} [db eval {SELECT r FROM r1 ORDER BY r}]
++
++
++finish_test
+-- 
+2.30.2
+
diff -Nru sqlite3-3.40.1/debian/patches/series 
sqlite3-3.40.1/debian/patches/series
--- sqlite3-3.40.1/debian/patches/series        2022-12-31 10:41:40.000000000 
+0200
+++ sqlite3-3.40.1/debian/patches/series        2024-11-02 22:03:43.000000000 
+0200
@@ -7,3 +7,6 @@
 32-dynamic_link.patch
 02-use-packaged-lempar.c.patch
 40-amalgamation_configure.patch
+0001-Fix-a-buffer-overread-in-the-sessions-extension-that.patch
+0002-Avoid-a-stack-overflow-that-could-be-caused-by-a-rec.patch
+0003-Fix-a-technically-undefined-signed-integer-overflow-.patch

Reply via email to