--- Begin Message ---
Package: release.debian.org
Severity: normal
Tags: buster
User: release.debian....@packages.debian.org
Usertags: pu
X-Debbugs-Cc: g...@debian.org
A number of security fixes in sqlite, which don't warrant a DSA.
This has been tested on a Buster system (along with validating
included test cases that issues are correctly fixed).
Cheers,
Moritz
diff -Nru sqlite3-3.27.2/debian/changelog sqlite3-3.27.2/debian/changelog
--- sqlite3-3.27.2/debian/changelog 2019-06-01 17:38:52.000000000 +0200
+++ sqlite3-3.27.2/debian/changelog 2020-10-05 22:53:55.000000000 +0200
@@ -1,3 +1,18 @@
+sqlite3 (3.27.2-3+deb10u1) buster; urgency=medium
+
+ * CVE-2019-19923
+ * CVE-2019-19925
+ * CVE-2019-19959
+ * CVE-2019-20218
+ * CVE-2020-13434
+ * CVE-2020-13435
+ * CVE-2020-13630
+ * CVE-2020-13632
+ * CVE-2020-15358
+ * CVE-2019-16168
+
+ -- Moritz Mühlenhoff <j...@debian.org> Mon, 05 Oct 2020 22:53:55 +0200
+
sqlite3 (3.27.2-3) unstable; urgency=high
* Backport security related patches:
diff -Nru sqlite3-3.27.2/debian/patches/CVE-2019-16168.patch
sqlite3-3.27.2/debian/patches/CVE-2019-16168.patch
--- sqlite3-3.27.2/debian/patches/CVE-2019-16168.patch 1970-01-01
01:00:00.000000000 +0100
+++ sqlite3-3.27.2/debian/patches/CVE-2019-16168.patch 2020-10-05
22:53:55.000000000 +0200
@@ -0,0 +1,66 @@
+From 725dd72400872da94dcfb6af48128905b93d57fe Mon Sep 17 00:00:00 2001
+From: drh <d...@noemail.net>
+Date: Thu, 15 Aug 2019 14:35:45 +0000
+Subject: [PATCH] Ensure that the optional "sz=N" parameter that can be
+ manually added to the end of an sqlite_stat1 entry does not have an N value
+ that is too small. Ticket [e4598ecbdd18bd82]
+
+FossilOrigin-Name:
98357d8c1263920b33a3648ef9214a63c99728bafa7a8d3dd6a1241b2303fd42
+---
+ src/analyze.c | 4 +++-
+ src/where.c | 1 +
+ test/analyzeC.test | 14 ++++++++++++++
+ 5 files changed, 28 insertions(+), 11 deletions(-)
+
+diff --git a/src/analyze.c b/src/analyze.c
+index 31fb6f5b5..1904b9be0 100644
+--- a/src/analyze.c
++++ b/src/analyze.c
+@@ -1450,7 +1450,9 @@ static void decodeIntArray(
+ if( sqlite3_strglob("unordered*", z)==0 ){
+ pIndex->bUnordered = 1;
+ }else if( sqlite3_strglob("sz=[0-9]*", z)==0 ){
+- pIndex->szIdxRow = sqlite3LogEst(sqlite3Atoi(z+3));
++ int sz = sqlite3Atoi(z+3);
++ if( sz<2 ) sz = 2;
++ pIndex->szIdxRow = sqlite3LogEst(sz);
+ }else if( sqlite3_strglob("noskipscan*", z)==0 ){
+ pIndex->noSkipScan = 1;
+ }
+diff --git a/src/where.c b/src/where.c
+index 65c92863a..a37a810a2 100644
+--- a/src/where.c
++++ b/src/where.c
+@@ -2670,6 +2670,7 @@ static int whereLoopAddBtreeIndex(
+ ** it to pNew->rRun, which is currently set to the cost of the index
+ ** seek only. Then, if this is a non-covering index, add the cost of
+ ** visiting the rows in the main table. */
++ assert( pSrc->pTab->szTabRow>0 );
+ rCostIdx = pNew->nOut + 1 + (15*pProbe->szIdxRow)/pSrc->pTab->szTabRow;
+ pNew->rRun = sqlite3LogEstAdd(rLogSize, rCostIdx);
+ if( (pNew->wsFlags & (WHERE_IDX_ONLY|WHERE_IPK))==0 ){
+diff --git a/test/analyzeC.test b/test/analyzeC.test
+index 02faa9c7e..2a0a89781 100644
+--- a/test/analyzeC.test
++++ b/test/analyzeC.test
+@@ -132,6 +132,20 @@ do_execsql_test 4.3 {
+ SELECT count(a) FROM t1;
+ } {/.*INDEX t1ca.*/}
+
++# 2019-08-15.
++# Ticket https://www.sqlite.org/src/tktview/e4598ecbdd18bd82945f602901
++# The sz=N parameter in the sqlite_stat1 table needs to have a value of
++# 2 or more to avoid a division by zero in the query planner.
++#
++do_execsql_test 4.4 {
++ DROP TABLE IF EXISTS t44;
++ CREATE TABLE t44(a PRIMARY KEY);
++ INSERT INTO sqlite_stat1 VALUES('t44',null,'sz=0');
++ ANALYZE sqlite_master;
++ SELECT 0 FROM t44 WHERE a IN(1,2,3);
++} {}
++
++
+
+ # The sz=NNN parameter works even if there is other extraneous text
+ # in the sqlite_stat1.stat column.
diff -Nru sqlite3-3.27.2/debian/patches/CVE-2019-19923.patch
sqlite3-3.27.2/debian/patches/CVE-2019-19923.patch
--- sqlite3-3.27.2/debian/patches/CVE-2019-19923.patch 1970-01-01
01:00:00.000000000 +0100
+++ sqlite3-3.27.2/debian/patches/CVE-2019-19923.patch 2020-10-02
16:43:04.000000000 +0200
@@ -0,0 +1,62 @@
+From 396afe6f6aa90a31303c183e11b2b2d4b7956b35 Mon Sep 17 00:00:00 2001
+From: drh <d...@noemail.net>
+Date: Wed, 18 Dec 2019 20:51:58 +0000
+Subject: [PATCH] Continue to back away from the LEFT JOIN optimization of
+ check-in [41c27bc0ff1d3135] by disallowing query flattening if the outer
+ query is DISTINCT. Without this fix, if an index scan is run on the table
+ within the view on the right-hand side of the LEFT JOIN, stale result
+ registers might be accessed yielding incorrect results, and/or an
+ OP_IfNullRow opcode might be invoked on the un-opened table, resulting in a
+ NULL-pointer dereference. This problem was found by the Yongheng and Rui
+ fuzzer.
+
+FossilOrigin-Name:
862974312edf00e9d1068115d1a39b7235b7db68b6d86b81d38a12f025a4748e
+---
+ src/select.c | 8 ++++++--
+ test/join.test | 13 +++++++++++++
+ 4 files changed, 27 insertions(+), 10 deletions(-)
+
+--- sqlite3-3.27.2.orig/src/select.c
++++ sqlite3-3.27.2/src/select.c
+@@ -3576,6 +3576,7 @@ static void substSelect(
+ ** (3b) the FROM clause of the subquery may not contain a virtual
+ ** table and
+ ** (3c) the outer query may not be an aggregate.
++** (3d) the outer query may not be DISTINCT.
+ **
+ ** (4) The subquery can not be DISTINCT.
+ **
+@@ -3772,8 +3773,11 @@ static int flattenSubquery(
+ */
+ if( (pSubitem->fg.jointype & JT_OUTER)!=0 ){
+ isLeftJoin = 1;
+- if( pSubSrc->nSrc>1 || isAgg || IsVirtual(pSubSrc->a[0].pTab) ){
+- /* (3a) (3c) (3b) */
++ if( pSubSrc->nSrc>1 /* (3a) */
++ || isAgg /* (3b) */
++ || IsVirtual(pSubSrc->a[0].pTab) /* (3c) */
++ || (p->selFlags & SF_Distinct)!=0 /* (3d) */
++ ){
+ return 0;
+ }
+ }
+--- sqlite3-3.27.2.orig/test/join.test
++++ sqlite3-3.27.2/test/join.test
+@@ -864,4 +864,17 @@ do_execsql_test join-16.100 {
+ WHERE (b IS NOT NULL)=0;
+ } {1 {}}
+
++# 2019-12-18 problem with a LEFT JOIN where the RHS is a view.
++# Detected by Yongheng and Rui.
++# Follows from the optimization attempt of check-in 41c27bc0ff1d3135
++# on 2017-04-18
++#
++reset_db
++do_execsql_test join-22.10 {
++ CREATE TABLE t0(a, b);
++ CREATE INDEX t0a ON t0(a);
++ INSERT INTO t0 VALUES(10,10),(10,11),(10,12);
++ SELECT DISTINCT c FROM t0 LEFT JOIN (SELECT a+1 AS c FROM t0) ORDER BY c ;
++} {11}
++
+ finish_test
diff -Nru sqlite3-3.27.2/debian/patches/CVE-2019-19925.patch
sqlite3-3.27.2/debian/patches/CVE-2019-19925.patch
--- sqlite3-3.27.2/debian/patches/CVE-2019-19925.patch 1970-01-01
01:00:00.000000000 +0100
+++ sqlite3-3.27.2/debian/patches/CVE-2019-19925.patch 2020-10-02
16:51:44.000000000 +0200
@@ -0,0 +1,44 @@
+From 54d501092d88c0cf89bec4279951f548fb0b8618 Mon Sep 17 00:00:00 2001
+From: drh <d...@noemail.net>
+Date: Thu, 19 Dec 2019 15:15:40 +0000
+Subject: [PATCH] Fix the zipfile extension so that INSERT works even if the
+ pathname of the file being inserted is a NULL. Bug discovered by the
+ Yongheng and Rui fuzzer.
+
+FossilOrigin-Name:
a80f84b511231204658304226de3e075a55afc2e3f39ac063716f7a57f585c06
+---
+ ext/misc/zipfile.c | 1 +
+ test/zipfile.test | 14 ++++++++++++++
+ 4 files changed, 23 insertions(+), 8 deletions(-)
+
+--- sqlite3-3.27.2.orig/ext/misc/zipfile.c
++++ sqlite3-3.27.2/ext/misc/zipfile.c
+@@ -1618,6 +1618,7 @@ static int zipfileUpdate(
+
+ if( rc==SQLITE_OK ){
+ zPath = (const char*)sqlite3_value_text(apVal[2]);
++ if( zPath==0 ) zPath = "";
+ nPath = (int)strlen(zPath);
+ mTime = zipfileGetTime(apVal[4]);
+ }
+--- sqlite3-3.27.2.orig/test/zipfile.test
++++ sqlite3-3.27.2/test/zipfile.test
+@@ -795,4 +795,18 @@ if {$tcl_platform(platform)!="windows"}
+ } {. ./x1.txt ./x2.txt}
+ }
+
++# 2019-12-18 Yongheng and Rui fuzzer
++#
++do_execsql_test 13.10 {
++ DROP TABLE IF EXISTS t0;
++ DROP TABLE IF EXISTS t1;
++ CREATE TABLE t0(a,b,c,d,e,f,g);
++ REPLACE INTO t0(c,b,f) VALUES(10,10,10);
++ CREATE VIRTUAL TABLE t1 USING zipfile('h.zip');
++ REPLACE INTO t1 SELECT * FROM t0;
++ SELECT quote(name),quote(mode),quote(mtime),quote(sz),quote(rawdata),
++ quote(data),quote(method) FROM t1;
++} {'' 10 10 2 X'3130' X'3130' 0}
++
++
+ finish_test
diff -Nru sqlite3-3.27.2/debian/patches/CVE-2019-19959.patch
sqlite3-3.27.2/debian/patches/CVE-2019-19959.patch
--- sqlite3-3.27.2/debian/patches/CVE-2019-19959.patch 1970-01-01
01:00:00.000000000 +0100
+++ sqlite3-3.27.2/debian/patches/CVE-2019-19959.patch 2020-10-02
16:53:23.000000000 +0200
@@ -0,0 +1,67 @@
+From 1e490c4ca6b43a9cf8637d695907888349f69bec Mon Sep 17 00:00:00 2001
+From: drh <d...@noemail.net>
+Date: Mon, 23 Dec 2019 21:11:15 +0000
+Subject: [PATCH] Test case for the zipfile-extension bug fix of the previous
+ check-in.
+
+FossilOrigin-Name:
bc8bfc7fcdf33f6855584e10e9260073430517ff3268cf0c7988dcc4cd785391
+---
+ test/zipfile.test | 12 ++++++++++++
+ 3 files changed, 19 insertions(+), 7 deletions(-)
+
+From d8f2d46cbc9925e034a68aaaf60aad788d9373c1 Mon Sep 17 00:00:00 2001
+From: drh <d...@noemail.net>
+Date: Mon, 23 Dec 2019 21:04:33 +0000
+Subject: [PATCH] Fix the zipfile() function in the zipfile extension so that
+ it is able to deal with goofy filenames that contain embedded zeros.
+
+FossilOrigin-Name:
cc0fb00a128fd0773db5ff7891f7aa577a3671d570166d2cbb30df922344adcf
+---
+ ext/misc/zipfile.c | 4 ++--
+ 3 files changed, 9 insertions(+), 9 deletions(-)
+
+
+--- sqlite3-3.27.2.orig/ext/misc/zipfile.c
++++ sqlite3-3.27.2/ext/misc/zipfile.c
+@@ -1632,7 +1632,7 @@ static int zipfileUpdate(
+ zFree = sqlite3_mprintf("%s/", zPath);
+ if( zFree==0 ){ rc = SQLITE_NOMEM; }
+ zPath = (const char*)zFree;
+- nPath++;
++ nPath = (int)strlen(zPath);
+ }
+ }
+
+@@ -2033,11 +2033,11 @@ void zipfileStep(sqlite3_context *pCtx,
+ }else{
+ if( zName[nName-1]!='/' ){
+ zName = zFree = sqlite3_mprintf("%s/", zName);
+- nName++;
+ if( zName==0 ){
+ rc = SQLITE_NOMEM;
+ goto zipfile_step_out;
+ }
++ nName = (int)strlen(zName);
+ }else{
+ while( nName>1 && zName[nName-2]=='/' ) nName--;
+ }
+--- sqlite3-3.27.2.orig/test/zipfile.test
++++ sqlite3-3.27.2/test/zipfile.test
+@@ -808,5 +808,17 @@ do_execsql_test 13.10 {
+ quote(data),quote(method) FROM t1;
+ } {'' 10 10 2 X'3130' X'3130' 0}
+
++# 2019-12-23 Yongheng and Rui fuzzer
++# Run using valgrind to see the problem.
++#
++do_execsql_test 14.10 {
++ DROP TABLE t1;
++ CREATE TABLE t1(x char);
++ INSERT INTO t1(x) VALUES('1');
++ INSERT INTO t1(x) SELECT zipfile(x, 'xyz') FROM t1;
++ INSERT INTO t1(x) SELECT zipfile(x, 'uvw') FROM t1;
++ SELECT count(*) FROM t1;
++ PRAGMA integrity_check;
++} {3 ok}
+
+ finish_test
diff -Nru sqlite3-3.27.2/debian/patches/CVE-2019-20218.patch
sqlite3-3.27.2/debian/patches/CVE-2019-20218.patch
--- sqlite3-3.27.2/debian/patches/CVE-2019-20218.patch 1970-01-01
01:00:00.000000000 +0100
+++ sqlite3-3.27.2/debian/patches/CVE-2019-20218.patch 2020-10-05
22:53:55.000000000 +0200
@@ -0,0 +1,97 @@
+From a6c1a71cde082e09750465d5675699062922e387 Mon Sep 17 00:00:00 2001
+From: dan <d...@noemail.net>
+Date: Fri, 27 Dec 2019 20:54:42 +0000
+Subject: [PATCH] Do not attempt to unwind the WITH stack in the Parse object
+ following an error. This fixes a separate case to [de6e6d68].
+
+From 46a31cdf6b7c1197e01627f91af601479cd99940 Mon Sep 17 00:00:00 2001
+From: drh <d...@noemail.net>
+Date: Sat, 9 Nov 2019 14:38:58 +0000
+Subject: [PATCH] Make sure the WITH stack in the Parse object is disabled
+ following an error.
+
+diff -Naur sqlite3-3.27.2.orig/src/select.c sqlite3-3.27.2/src/select.c
+--- sqlite3-3.27.2.orig/src/select.c 2019-02-25 17:31:57.000000000 +0100
++++ sqlite3-3.27.2/src/select.c 2020-10-07 14:15:03.938758886 +0200
+@@ -4642,6 +4642,9 @@
+ With *pWith; /* WITH clause that pCte belongs to */
+
+ assert( pFrom->pTab==0 );
++ if( pParse->nErr ){
++ return SQLITE_ERROR;
++ }
+
+ pCte = searchWith(pParse->pWith, pFrom, &pWith);
+ if( pCte ){
+@@ -4911,7 +4914,7 @@
+
+ /* Process NATURAL keywords, and ON and USING clauses of joins.
+ */
+- if( db->mallocFailed || sqliteProcessJoin(pParse, p) ){
++ if( pParse->nErr || db->mallocFailed || sqliteProcessJoin(pParse, p) ){
+ return WRC_Abort;
+ }
+
+diff -Naur sqlite3-3.27.2.orig/src/util.c sqlite3-3.27.2/src/util.c
+--- sqlite3-3.27.2.orig/src/util.c 2020-10-07 14:01:30.000000000 +0200
++++ sqlite3-3.27.2/src/util.c 2020-10-07 14:15:03.938758886 +0200
+@@ -222,6 +222,7 @@
+ sqlite3DbFree(db, pParse->zErrMsg);
+ pParse->zErrMsg = zMsg;
+ pParse->rc = SQLITE_ERROR;
++ pParse->pWith = 0;
+ }
+ }
+
+diff -Naur sqlite3-3.27.2.orig/test/altertab3.test
sqlite3-3.27.2/test/altertab3.test
+--- sqlite3-3.27.2.orig/test/altertab3.test 2020-10-07 14:01:30.000000000
+0200
++++ sqlite3-3.27.2/test/altertab3.test 2020-10-07 14:14:48.427575673 +0200
+@@ -112,6 +112,28 @@
+ SELECT * FROM sqlite_master WHERE type='table' AND name!='t1';
+ } {table t3 t3 3 {CREATE TABLE t3(e, f)}}
+
++#------------------------------------------------------------------------
++#
++reset_db
++do_execsql_test 23.1 {
++ CREATE TABLE v0 (a);
++ CREATE VIEW v2 (v3) AS
++ WITH x1 AS (SELECT * FROM v2)
++ SELECT v3 AS x, v3 AS y FROM v2;
++}
++
++do_catchsql_test 23.2 {
++ SELECT * FROM v2
++} {1 {view v2 is circularly defined}}
++
++db close
++sqlite3 db test.db
++
++do_catchsql_test 23.3 {
++ ALTER TABLE v0 RENAME TO t3 ;
++} {1 {error in view v2: view v2 is circularly defined}}
++
++
+ finish_test
+
+
+diff -Naur sqlite3-3.27.2.orig/test/with3.test sqlite3-3.27.2/test/with3.test
+--- sqlite3-3.27.2.orig/test/with3.test 2019-02-25 17:31:57.000000000
+0100
++++ sqlite3-3.27.2/test/with3.test 2020-10-07 14:15:03.938758886 +0200
+@@ -30,7 +30,15 @@
+ SELECT 5 FROM t0 UNION SELECT 8 FROM m
+ )
+ SELECT * FROM i;
+-} {1 {no such table: m}}
++} {1 {no such table: t0}}
++
++# 2019-11-09 dbfuzzcheck find
++do_catchsql_test 1.1 {
++ CREATE VIEW v1(x,y) AS
++ WITH t1(a,b) AS (VALUES(1,2))
++ SELECT * FROM nosuchtable JOIN t1;
++ SELECT * FROM v1;
++} {1 {no such table: main.nosuchtable}}
+
+ # Additional test cases that came out of the work to
+ # fix for Kostya's problem.
diff -Nru sqlite3-3.27.2/debian/patches/CVE-2020-13434.patch
sqlite3-3.27.2/debian/patches/CVE-2020-13434.patch
--- sqlite3-3.27.2/debian/patches/CVE-2020-13434.patch 1970-01-01
01:00:00.000000000 +0100
+++ sqlite3-3.27.2/debian/patches/CVE-2020-13434.patch 2020-10-02
17:14:16.000000000 +0200
@@ -0,0 +1,54 @@
+From dd6c33d372f3b83f4fe57904c2bd5ebba5c38018 Mon Sep 17 00:00:00 2001
+From: drh <d...@noemail.net>
+Date: Sat, 23 May 2020 19:58:07 +0000
+Subject: [PATCH] Limit the "precision" of floating-point to text conversions
+ in the printf() function to 100,000,000. Fix for ticket [23439ea582241138].
+
+FossilOrigin-Name:
d08d3405878d394e08e5d3af281246edfbd81ca74cc8d16458808591512fb93d
+---
+ src/printf.c | 12 ++++++++++++
+ test/printf.test | 7 +++++++
+ 4 files changed, 27 insertions(+), 8 deletions(-)
+
+--- sqlite3-3.27.2.orig/src/printf.c
++++ sqlite3-3.27.2/src/printf.c
+@@ -187,6 +187,13 @@ static char *printfTempBuf(sqlite3_str *
+ #define etBUFSIZE SQLITE_PRINT_BUF_SIZE /* Size of the output buffer */
+
+ /*
++** Hard limit on the precision of floating-point conversions.
++*/
++#ifndef SQLITE_PRINTF_PRECISION_LIMIT
++# define SQLITE_FP_PRECISION_LIMIT 100000000
++#endif
++
++/*
+ ** Render a string given by "fmt" into the StrAccum object.
+ */
+ void sqlite3_str_vappendf(
+@@ -507,6 +514,11 @@ void sqlite3_str_vappendf(
+ length = 0;
+ #else
+ if( precision<0 ) precision = 6; /* Set default precision */
++#ifdef SQLITE_FP_PRECISION_LIMIT
++ if( precision>SQLITE_FP_PRECISION_LIMIT ){
++ precision = SQLITE_FP_PRECISION_LIMIT;
++ }
++#endif
+ if( realvalue<0.0 ){
+ realvalue = -realvalue;
+ prefix = '-';
+--- sqlite3-3.27.2.orig/test/printf.test
++++ sqlite3-3.27.2/test/printf.test
+@@ -3777,4 +3777,11 @@ foreach ::iRepeat {0 1} {
+ }
+ }
+
++# 2020-05-23
++# ticket 23439ea582241138
++#
++do_execsql_test printf-16.1 {
++ SELECT printf('%.*g',2147483647,0.01);
++} {0.01}
++
+ finish_test
diff -Nru sqlite3-3.27.2/debian/patches/CVE-2020-13435.patch
sqlite3-3.27.2/debian/patches/CVE-2020-13435.patch
--- sqlite3-3.27.2/debian/patches/CVE-2020-13435.patch 1970-01-01
01:00:00.000000000 +0100
+++ sqlite3-3.27.2/debian/patches/CVE-2020-13435.patch 2020-10-05
22:53:55.000000000 +0200
@@ -0,0 +1,239 @@
+From e40cc16b472071f553700c7208394e6cf73d5688 Mon Sep 17 00:00:00 2001
+From: drh <d...@noemail.net>
+Date: Sun, 24 May 2020 03:01:36 +0000
+Subject: [PATCH] Move some utility Walker callbacks into the walker.c source
+ file, as they seem to belong there better.
+
+FossilOrigin-Name:
dac438236f7c5419d4e7e094e8b3f19f83cd3b1a18bc8acb14aee90d4514fa3c
+---
+ src/expr.c | 13 ++-----------
+ src/select.c | 23 -----------------------
+ src/sqliteInt.h | 3 +++
+ src/walker.c | 37 +++++++++++++++++++++++++++++++++++++
+ 6 files changed, 52 insertions(+), 44 deletions(-)
+
+
+From c37577bb2dfb602a5cdbba8322a01b548c34c185 Mon Sep 17 00:00:00 2001
+From: drh <d...@noemail.net>
+Date: Sun, 24 May 2020 03:38:37 +0000
+Subject: [PATCH] When rewriting a query for window functions, if the rewrite
+ changes the depth of TK_AGG_FUNCTION nodes, be sure to adjust the Expr.op2
+ field appropriately. Fix for ticket [7a5279a25c57adf1]
+
+FossilOrigin-Name:
ad7bb70af9bb68d192137188bb2528f1e9e43ad164c925174ca1dafc9e1f5339
+---
+
+ src/resolve.c | 2 ++
+ src/window.c | 23 +++++++++++++++++++++++
+ 5 files changed, 50 insertions(+), 9 deletions(-)
+
+
+From 0934d640456bb168a8888ae388643c5160afe501 Mon Sep 17 00:00:00 2001
+From: drh <d...@noemail.net>
+Date: Mon, 25 May 2020 15:19:52 +0000
+Subject: [PATCH] Defensive code that tries to prevent a recurrence of problems
+ like the one described in ticket [7a5279a25c57adf1]
+
+FossilOrigin-Name:
572105de1d44bca4f18c99d373458889163611384eebbc9659474874ee1701f4
+---
+ src/expr.c | 10 ++++++++--
+ 3 files changed, 15 insertions(+), 9 deletions(-)
+
+
+--- sqlite3-3.27.2.orig/src/expr.c
++++ sqlite3-3.27.2/src/expr.c
+@@ -3456,7 +3456,10 @@ expr_code_doover:
+ switch( op ){
+ case TK_AGG_COLUMN: {
+ AggInfo *pAggInfo = pExpr->pAggInfo;
+- struct AggInfo_col *pCol = &pAggInfo->aCol[pExpr->iAgg];
++ struct AggInfo_col *pCol;
++ assert( pAggInfo!=0 );
++ assert( pExpr->iAgg>=0 && pExpr->iAgg<pAggInfo->nColumn );
++ pCol = &pAggInfo->aCol[pExpr->iAgg];
+ if( !pAggInfo->directMode ){
+ assert( pCol->iMem>0 );
+ return pCol->iMem;
+@@ -3695,7 +3698,10 @@ expr_code_doover:
+ }
+ case TK_AGG_FUNCTION: {
+ AggInfo *pInfo = pExpr->pAggInfo;
+- if( pInfo==0 ){
++ if( pInfo==0
++ || NEVER(pExpr->iAgg<0)
++ || NEVER(pExpr->iAgg>=pInfo->nFunc)
++ ){
+ assert( !ExprHasProperty(pExpr, EP_IntValue) );
+ sqlite3ErrorMsg(pParse, "misuse of aggregate: %s()", pExpr->u.zToken);
+ }else{
+@@ -5318,15 +5324,6 @@ static int analyzeAggregate(Walker *pWal
+ }
+ return WRC_Continue;
+ }
+-static int analyzeAggregatesInSelect(Walker *pWalker, Select *pSelect){
+- UNUSED_PARAMETER(pSelect);
+- pWalker->walkerDepth++;
+- return WRC_Continue;
+-}
+-static void analyzeAggregatesInSelectEnd(Walker *pWalker, Select *pSelect){
+- UNUSED_PARAMETER(pSelect);
+- pWalker->walkerDepth--;
+-}
+
+ /*
+ ** Analyze the pExpr expression looking for aggregate functions and
+@@ -5340,8 +5337,8 @@ static void analyzeAggregatesInSelectEnd
+ void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){
+ Walker w;
+ w.xExprCallback = analyzeAggregate;
+- w.xSelectCallback = analyzeAggregatesInSelect;
+- w.xSelectCallback2 = analyzeAggregatesInSelectEnd;
++ w.xSelectCallback = sqlite3WalkerDepthIncrease;
++ w.xSelectCallback2 = sqlite3WalkerDepthDecrease;
+ w.walkerDepth = 0;
+ w.u.pNC = pNC;
+ w.pParse = 0;
+--- sqlite3-3.27.2.orig/src/resolve.c
++++ sqlite3-3.27.2/src/resolve.c
+@@ -24,6 +24,8 @@
+ **
+ ** incrAggFunctionDepth(pExpr,n) is the main routine. incrAggDepth(..)
+ ** is a helper function - a callback for the tree walker.
++**
++** See also the sqlite3WindowExtraAggFuncDepth() routine in window.c
+ */
+ static int incrAggDepth(Walker *pWalker, Expr *pExpr){
+ if( pExpr->op==TK_AGG_FUNCTION ) pExpr->op2 += pWalker->u.n;
+--- sqlite3-3.27.2.orig/src/select.c
++++ sqlite3-3.27.2/src/select.c
+@@ -5091,29 +5091,6 @@ static int selectExpander(Walker *pWalke
+ return WRC_Continue;
+ }
+
+-/*
+-** No-op routine for the parse-tree walker.
+-**
+-** When this routine is the Walker.xExprCallback then expression trees
+-** are walked without any actions being taken at each node. Presumably,
+-** when this routine is used for Walker.xExprCallback then
+-** Walker.xSelectCallback is set to do something useful for every
+-** subquery in the parser tree.
+-*/
+-int sqlite3ExprWalkNoop(Walker *NotUsed, Expr *NotUsed2){
+- UNUSED_PARAMETER2(NotUsed, NotUsed2);
+- return WRC_Continue;
+-}
+-
+-/*
+-** No-op routine for the parse-tree walker for SELECT statements.
+-** subquery in the parser tree.
+-*/
+-int sqlite3SelectWalkNoop(Walker *NotUsed, Select *NotUsed2){
+- UNUSED_PARAMETER2(NotUsed, NotUsed2);
+- return WRC_Continue;
+-}
+-
+ #if SQLITE_DEBUG
+ /*
+ ** Always assert. This xSelectCallback2 implementation proves that the
+--- sqlite3-3.27.2.orig/src/sqliteInt.h
++++ sqlite3-3.27.2/src/sqliteInt.h
+@@ -3497,6 +3497,9 @@ int sqlite3WalkSelectFrom(Walker*, Selec
+ int sqlite3ExprWalkNoop(Walker*, Expr*);
+ int sqlite3SelectWalkNoop(Walker*, Select*);
+ int sqlite3SelectWalkFail(Walker*, Select*);
++int sqlite3WalkerDepthIncrease(Walker*,Select*);
++void sqlite3WalkerDepthDecrease(Walker*,Select*);
++
+ #ifdef SQLITE_DEBUG
+ void sqlite3SelectWalkAssert2(Walker*, Select*);
+ #endif
+--- sqlite3-3.27.2.orig/src/walker.c
++++ sqlite3-3.27.2/src/walker.c
+@@ -188,3 +188,40 @@ int sqlite3WalkSelect(Walker *pWalker, S
+ }while( p!=0 );
+ return WRC_Continue;
+ }
++
++/* Increase the walkerDepth when entering a subquery, and
++** descrease when leaving the subquery.
++*/
++int sqlite3WalkerDepthIncrease(Walker *pWalker, Select *pSelect){
++ UNUSED_PARAMETER(pSelect);
++ pWalker->walkerDepth++;
++ return WRC_Continue;
++}
++void sqlite3WalkerDepthDecrease(Walker *pWalker, Select *pSelect){
++ UNUSED_PARAMETER(pSelect);
++ pWalker->walkerDepth--;
++}
++
++
++/*
++** No-op routine for the parse-tree walker.
++**
++** When this routine is the Walker.xExprCallback then expression trees
++** are walked without any actions being taken at each node. Presumably,
++** when this routine is used for Walker.xExprCallback then
++** Walker.xSelectCallback is set to do something useful for every
++** subquery in the parser tree.
++*/
++int sqlite3ExprWalkNoop(Walker *NotUsed, Expr *NotUsed2){
++ UNUSED_PARAMETER2(NotUsed, NotUsed2);
++ return WRC_Continue;
++}
++
++/*
++** No-op routine for the parse-tree walker for SELECT statements.
++** subquery in the parser tree.
++*/
++int sqlite3SelectWalkNoop(Walker *NotUsed, Select *NotUsed2){
++ UNUSED_PARAMETER2(NotUsed, NotUsed2);
++ return WRC_Continue;
++}
+--- sqlite3-3.27.2.orig/src/window.c
++++ sqlite3-3.27.2/src/window.c
+@@ -738,6 +738,23 @@ static ExprList *exprListAppendList(
+ }
+
+ /*
++** When rewriting a query, if the new subquery in the FROM clause
++** contains TK_AGG_FUNCTION nodes that refer to an outer query,
++** then we have to increase the Expr->op2 values of those nodes
++** due to the extra subquery layer that was added.
++**
++** See also the incrAggDepth() routine in resolve.c
++*/
++static int sqlite3WindowExtraAggFuncDepth(Walker *pWalker, Expr *pExpr){
++ if( pExpr->op==TK_AGG_FUNCTION
++ && pExpr->op2>=pWalker->walkerDepth
++ ){
++ pExpr->op2++;
++ }
++ return WRC_Continue;
++}
++
++/*
+ ** If the SELECT statement passed as the second argument does not invoke
+ ** any SQL window functions, this function is a no-op. Otherwise, it
+ ** rewrites the SELECT statement so that window function xStep functions
+@@ -825,6 +842,7 @@ int sqlite3WindowRewrite(Parse *pParse,
+ );
+ p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0);
+ if( p->pSrc ){
++ Walker w;
+ p->pSrc->a[0].pSelect = pSub;
+ sqlite3SrcListAssignCursors(pParse, p->pSrc);
+ if( sqlite3ExpandSubquery(pParse, &p->pSrc->a[0]) ){
+@@ -833,6 +851,11 @@ int sqlite3WindowRewrite(Parse *pParse,
+ pSub->selFlags |= SF_Expanded;
+ p->selFlags &= ~SF_Aggregate;
+ sqlite3SelectPrep(pParse, pSub, 0);
++ memset(&w, 0, sizeof(w));
++ w.xExprCallback = sqlite3WindowExtraAggFuncDepth;
++ w.xSelectCallback = sqlite3WalkerDepthIncrease;
++ w.xSelectCallback2 = sqlite3WalkerDepthDecrease;
++ sqlite3WalkSelect(&w, pSub);
+ }
+
+ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pMWin->iEphCsr, pSublist->nExpr);
diff -Nru sqlite3-3.27.2/debian/patches/CVE-2020-13630.patch
sqlite3-3.27.2/debian/patches/CVE-2020-13630.patch
--- sqlite3-3.27.2/debian/patches/CVE-2020-13630.patch 1970-01-01
01:00:00.000000000 +0100
+++ sqlite3-3.27.2/debian/patches/CVE-2020-13630.patch 2020-10-02
17:28:13.000000000 +0200
@@ -0,0 +1,20 @@
+From becd68ba0dac41904aa817d96a67fb4685734b41 Mon Sep 17 00:00:00 2001
+From: dan <d...@noemail.net>
+Date: Sat, 16 May 2020 17:26:58 +0000
+Subject: [PATCH] Fix a use-after-free bug in the fts3 snippet() function.
+
+FossilOrigin-Name:
0d69f76f0865f9626078bee087a22fb826407279e78cf9d5382e1c985c9f64a9
+---
+ ext/fts3/fts3.c | 1 +
+ 4 files changed, 23 insertions(+), 9 deletions(-)
+
+--- sqlite3-3.27.2.orig/ext/fts3/fts3.c
++++ sqlite3-3.27.2/ext/fts3/fts3.c
+@@ -5238,6 +5238,7 @@ static void fts3EvalNextRow(
+ fts3EvalNextRow(pCsr, pLeft, pRc);
+ }
+ }
++ pRight->bEof = pLeft->bEof = 1;
+ }
+ }
+ break;
diff -Nru sqlite3-3.27.2/debian/patches/CVE-2020-13632.patch
sqlite3-3.27.2/debian/patches/CVE-2020-13632.patch
--- sqlite3-3.27.2/debian/patches/CVE-2020-13632.patch 1970-01-01
01:00:00.000000000 +0100
+++ sqlite3-3.27.2/debian/patches/CVE-2020-13632.patch 2020-10-02
17:31:01.000000000 +0200
@@ -0,0 +1,63 @@
+From 219b8e7e7587df8669d96ce867cdd61ca1c05730 Mon Sep 17 00:00:00 2001
+From: drh <d...@noemail.net>
+Date: Thu, 14 May 2020 23:59:24 +0000
+Subject: [PATCH] Fix a null pointer deference that can occur on a strange
+ matchinfo() query.
+
+FossilOrigin-Name:
a4dd148928ea65bd4e1654dfacc3d8057d1f85b8c9939416991d50722e5a720e
+---
+ ext/fts3/fts3_snippet.c | 2 +-
+ test/fts3matchinfo2.test | 35 +++++++++++++++++++++++++++++++++++
+ 4 files changed, 44 insertions(+), 8 deletions(-)
+ create mode 100644 test/fts3matchinfo2.test
+
+
+--- sqlite3-3.27.2.orig/ext/fts3/fts3_snippet.c
++++ sqlite3-3.27.2/ext/fts3/fts3_snippet.c
+@@ -875,7 +875,7 @@ static int fts3ExprLHits(
+ iStart = pExpr->iPhrase * ((p->nCol + 31) / 32);
+ }
+
+- while( 1 ){
++ if( pIter ) while( 1 ){
+ int nHit = fts3ColumnlistCount(&pIter);
+ if( (pPhrase->iColumn>=pTab->nColumn || pPhrase->iColumn==iCol) ){
+ if( p->flag==FTS3_MATCHINFO_LHITS ){
+--- /dev/null
++++ sqlite3-3.27.2/test/fts3matchinfo2.test
+@@ -0,0 +1,35 @@
++# 2020-05-14
++#
++# 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 implements regression tests for the FTS3 module. The focus
++# of this file is tables created with the "matchinfo=fts3" option.
++#
++
++set testdir [file dirname $argv0]
++source $testdir/tester.tcl
++
++# If SQLITE_ENABLE_FTS3 is not defined, omit this file.
++ifcapable !fts3 { finish_test ; return }
++
++set sqlite_fts3_enable_parentheses 1
++
++# Crash case found by cyg0810 at gmail.com 2020-05-14. Reported to
++# chromium (which is not vulnerable) who kindly referred it to us.
++#
++do_execsql_test 1.0 {
++ CREATE TABLE t_content(col0 INTEGER);
++ CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY,col1
VARCHAR(8),col2 BINARY,col3 BINARY);
++ INSERT INTO t0 VALUES (1, '1234','aaaa','bbbb');
++ SELECT hex(matchinfo(t0,'yxy')) FROM t0 WHERE t0 MATCH
x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d';
++} {/000000.*0000000/}
++
++
++set sqlite_fts3_enable_parentheses 0
++finish_test
diff -Nru sqlite3-3.27.2/debian/patches/CVE-2020-15358.patch
sqlite3-3.27.2/debian/patches/CVE-2020-15358.patch
--- sqlite3-3.27.2/debian/patches/CVE-2020-15358.patch 1970-01-01
01:00:00.000000000 +0100
+++ sqlite3-3.27.2/debian/patches/CVE-2020-15358.patch 2020-10-02
17:48:46.000000000 +0200
@@ -0,0 +1,82 @@
+From b7cbf5c1b2a9e099eec176e1ebeb659427a20626 Mon Sep 17 00:00:00 2001
+From: drh <d...@noemail.net>
+Date: Mon, 15 Jun 2020 13:51:34 +0000
+Subject: [PATCH] Fix a defect in the query-flattener optimization identified
+ by ticket [8f157e8010b22af0].
+
+FossilOrigin-Name:
10fa79d00f8091e5748c245f4cae5b5f499a5f8db20da741c130e05a21ede443
+---
+ src/select.c | 7 +++----
+ src/sqliteInt.h | 1 +
+ test/selectA.test | 21 +++++++++++++++++++++
+ 5 files changed, 34 insertions(+), 12 deletions(-)
+
+--- sqlite3-3.27.2.orig/src/select.c
++++ sqlite3-3.27.2/src/select.c
+@@ -2689,9 +2689,7 @@ static int multiSelect(
+ selectOpName(p->op)));
+ rc = sqlite3Select(pParse, p, &uniondest);
+ testcase( rc!=SQLITE_OK );
+- /* Query flattening in sqlite3Select() might refill p->pOrderBy.
+- ** Be sure to delete p->pOrderBy, therefore, to avoid a memory leak.
*/
+- sqlite3ExprListDelete(db, p->pOrderBy);
++ assert( p->pOrderBy==0 );
+ pDelete = p->pPrior;
+ p->pPrior = pPrior;
+ p->pOrderBy = 0;
+@@ -4011,7 +4009,7 @@ static int flattenSubquery(
+ ** We look at every expression in the outer query and every place we see
+ ** "a" we substitute "x*3" and every place we see "b" we substitute
"y+10".
+ */
+- if( pSub->pOrderBy ){
++ if( pSub->pOrderBy && (pParent->selFlags & SF_NoopOrderBy)==0 ){
+ /* At this point, any non-zero iOrderByCol values indicate that the
+ ** ORDER BY column expression is identical to the iOrderByCol'th
+ ** expression returned by SELECT statement pSub. Since these values
+@@ -5618,6 +5616,7 @@ int sqlite3Select(
+ sqlite3ExprListDelete(db, p->pOrderBy);
+ p->pOrderBy = 0;
+ p->selFlags &= ~SF_Distinct;
++ p->selFlags |= SF_NoopOrderBy;
+ }
+ sqlite3SelectPrep(pParse, p, 0);
+ if( pParse->nErr || db->mallocFailed ){
+--- sqlite3-3.27.2.orig/src/sqliteInt.h
++++ sqlite3-3.27.2/src/sqliteInt.h
+@@ -2884,6 +2884,7 @@ struct Select {
+ #define SF_Converted 0x10000 /* By convertCompoundSelectToSubquery() */
+ #define SF_IncludeHidden 0x20000 /* Include hidden columns in output */
+ #define SF_ComplexResult 0x40000 /* Result contains subquery or function */
++#define SF_NoopOrderBy 0x0400000 /* ORDER BY is ignored for this query */
+
+ /*
+ ** The results of a SELECT can be distributed in several ways, as defined
+--- sqlite3-3.27.2.orig/test/selectA.test
++++ sqlite3-3.27.2/test/selectA.test
+@@ -1446,5 +1446,26 @@ do_execsql_test 6.1 {
+ SELECT * FROM (SELECT a FROM t1 UNION SELECT b FROM t2) WHERE a=a;
+ } {12345}
+
++# 2020-06-15 ticket 8f157e8010b22af0
++#
++reset_db
++do_execsql_test 7.1 {
++ CREATE TABLE t1(c1); INSERT INTO t1
VALUES(12),(123),(1234),(NULL),('abc');
++ CREATE TABLE t2(c2); INSERT INTO t2 VALUES(44),(55),(123);
++ CREATE TABLE t3(c3,c4); INSERT INTO t3 VALUES(66,1),(123,2),(77,3);
++ CREATE VIEW t4 AS SELECT c3 FROM t3;
++ CREATE VIEW t5 AS SELECT c3 FROM t3 ORDER BY c4;
++}
++do_execsql_test 7.2 {
++ SELECT * FROM t1, t2 WHERE c1=(SELECT 123 INTERSECT SELECT c2 FROM t4) AND
c1=123;
++} {123 123}
++do_execsql_test 7.3 {
++ SELECT * FROM t1, t2 WHERE c1=(SELECT 123 INTERSECT SELECT c2 FROM t5) AND
c1=123;
++} {123 123}
++do_execsql_test 7.4 {
++ CREATE TABLE a(b);
++ CREATE VIEW c(d) AS SELECT b FROM a ORDER BY b;
++ SELECT sum(d) OVER( PARTITION BY(SELECT 0 FROM c JOIN a WHERE b =(SELECT b
INTERSECT SELECT d FROM c) AND b = 123)) FROM c;
++} {}
+
+ finish_test
diff -Nru sqlite3-3.27.2/debian/patches/series
sqlite3-3.27.2/debian/patches/series
--- sqlite3-3.27.2/debian/patches/series 2019-06-01 17:38:52.000000000
+0200
+++ sqlite3-3.27.2/debian/patches/series 2020-10-05 22:53:55.000000000
+0200
@@ -14,3 +14,13 @@
46-probably_CVE-2019-5018.patch
47-probably_CVE-2019-5827_part1.patch
48-probably_CVE-2019-5827_part2.patch
+CVE-2019-19923.patch
+CVE-2019-19925.patch
+CVE-2019-19959.patch
+CVE-2019-20218.patch
+CVE-2020-13434.patch
+CVE-2020-13435.patch
+CVE-2020-13630.patch
+CVE-2020-13632.patch
+CVE-2020-15358.patch
+CVE-2019-16168.patch
--- End Message ---