From 62cd9864186baf652c97f4871ed5294ebce45f9b Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 18 May 2026 19:44:04 +0000 Subject: [PATCH 1/9] When a subquery is an argument to an SQLITE_SUBTYPE function, then set the EP_SubtArg flag on the result-set expressions of that subquery. [bugs:/forumpost/8de44412fd|Bug report 8de44412fd]. FossilOrigin-Name: d75c08c8416bde3f510a135ea07cc217ba6183eacda6ba895bccbf57efe9284f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/resolve.c | 25 +++++++++++++++++++++---- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 7a6119e7f2..a353861aa6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\swindow-function\svariant\sof\sthe\sjson_group_object()\sfunction\sso\nthat\sit\scorrectly\shandles\sNULL\sentries.\n[bugs:/forumpost/0de87b23b3|Bug\sreport\s0de87b23b3]. -D 2026-05-18T17:55:40.195 +C When\sa\ssubquery\sis\san\sargument\sto\san\sSQLITE_SUBTYPE\sfunction,\sthen\sset\nthe\sEP_SubtArg\sflag\son\sthe\sresult-set\sexpressions\sof\sthat\ssubquery.\n[bugs:/forumpost/8de44412fd|Bug\sreport\s8de44412fd]. +D 2026-05-18T19:44:04.696 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -734,7 +734,7 @@ F src/pragma.c 789ef67117b74b5be0a2db6681f7f0c55e6913791b9da309aefd280de2c8a74d F src/prepare.c 084a037fd3810cb7ffbfc001cd58c0ffac68ba36598a5084b55ea2a090014ebd F src/printf.c 2bc09ee91d69c709528575bbbee2199e16d6a7e68e1508ac7cf998a7289170ca F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c -F src/resolve.c 11134922dfc2c89d10c658a1ae9ae9e1af0df031d40b9e9171dc14d3f2e6d80f +F src/resolve.c 7e936a09405cb59e2b3e51a3ad23753e4803afc5269c5171a54c9bdd70f4fc50 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 4c05cde130f26991b7411d8c6809e0630625e18078742c963a047b4b9cc01d49 F src/shell.c.in 9dcc77636cdc48d67ea0cd7f4d54d791202e435e05598ec0a147cd61269e1c4d @@ -2205,8 +2205,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 622882529558b4779dfb7246bd5a9de776555c8f940bb941397fb56fb9f97e43 -R d24f0da7d2c47dc861907e18b0a3ec5b +P ac3a958b0ab7766544bb406aa990668d2235ab26fb68c75ded3f71273d97b18c +R 8b7676a9b8c1591082998d4ad9fe24e1 U drh -Z d5e5c346537f43415ecc1cfb3b15b0e6 +Z 9295f25c50d1d41e258f97d8c0c2ca57 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9cf5dd0088..1712a713d0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ac3a958b0ab7766544bb406aa990668d2235ab26fb68c75ded3f71273d97b18c +d75c08c8416bde3f510a135ea07cc217ba6183eacda6ba895bccbf57efe9284f diff --git a/src/resolve.c b/src/resolve.c index 64b20f6b70..d01f33ba52 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -941,6 +941,26 @@ static int exprProbability(Expr *p){ return (int)(r*134217728.0); } +/* +** Set the EP_SubtArg property on every expression inside of +** pList. If any subexpression is actually a subquery, then +** also set the EP_SubtArg property on the first result-set +** column of that subquery. +*/ +static SQLITE_NOINLINE void resolveSetExprSubtypeArg(ExprList *pList){ + int nn, ii; + nn = pList ? pList->nExpr : 0; + for(ii=0; iia[ii].pExpr; + ExprSetProperty(pExpr, EP_SubtArg); + if( pExpr->op==TK_SELECT ){ + assert( ExprUseXSelect(pExpr) ); + assert( pExpr->x.pSelect!=0 ); + resolveSetExprSubtypeArg(pExpr->x.pSelect->pEList); + } + } +} + /* ** This routine is callback for sqlite3WalkExpr(). ** @@ -1185,10 +1205,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ if( (pDef->funcFlags & SQLITE_SUBTYPE) || ExprHasProperty(pExpr, EP_SubtArg) ){ - int ii; - for(ii=0; iia[ii].pExpr, EP_SubtArg); - } + resolveSetExprSubtypeArg(pList); } if( pDef->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG) ){ From a2d992a000bb343b23612df491edb3edb23386fa Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 18 May 2026 20:27:57 +0000 Subject: [PATCH 2/9] Prevent integer overflow due to database corruption in. fts3auxNextMethod(). [bugs:/forumpost/bce19272cf|Bug report bce19272cf]. FossilOrigin-Name: d903795e3bdf91607f23dace5a15a070139b32e34aed8540a6c2e19c39e997be --- ext/fts3/fts3_aux.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/fts3/fts3_aux.c b/ext/fts3/fts3_aux.c index 042fe53946..0d88d014d5 100644 --- a/ext/fts3/fts3_aux.c +++ b/ext/fts3/fts3_aux.c @@ -341,7 +341,7 @@ static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){ /* State 3. The integer just read is a column number. */ default: assert( eState==3 ); iCol = (int)v; - if( iCol<1 ){ + if( iCol<1 || iCol>0x3fffffff ){ rc = SQLITE_CORRUPT_VTAB; break; } diff --git a/manifest b/manifest index a353861aa6..b8224c63f1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sa\ssubquery\sis\san\sargument\sto\san\sSQLITE_SUBTYPE\sfunction,\sthen\sset\nthe\sEP_SubtArg\sflag\son\sthe\sresult-set\sexpressions\sof\sthat\ssubquery.\n[bugs:/forumpost/8de44412fd|Bug\sreport\s8de44412fd]. -D 2026-05-18T19:44:04.696 +C Prevent\sinteger\soverflow\sdue\sto\sdatabase\scorruption\sin.\nfts3auxNextMethod().\n[bugs:/forumpost/bce19272cf|Bug\sreport\sbce19272cf]. +D 2026-05-18T20:27:57.529 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -82,7 +82,7 @@ F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d F ext/fts3/fts3.c 6cc7bbc307f27e7b6ee2e1d5ff63ffff4df3b42529dfe00eb34ddded417961b3 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 277f32f304e82f4397fc2a74793c0a95318b7abb9670b519e4805a00946cbd9b -F ext/fts3/fts3_aux.c 37ba1b10bbd163ddc6b05dbc3a306a0d5d68aee3d30f33b4dc5794955cc50887 +F ext/fts3/fts3_aux.c c105f6502df588f49a383eb22aed953844fb0e31265361a0cc8dd73037b37e39 F ext/fts3/fts3_expr.c 5c13796638d8192c388777166075cdc8bc4b6712024cd5b72c31acdbefce5984 F ext/fts3/fts3_hash.c d9dba473741445789330c7513d4f65737c92df23c3212784312931641814672a F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf @@ -2205,8 +2205,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P ac3a958b0ab7766544bb406aa990668d2235ab26fb68c75ded3f71273d97b18c -R 8b7676a9b8c1591082998d4ad9fe24e1 +P d75c08c8416bde3f510a135ea07cc217ba6183eacda6ba895bccbf57efe9284f +R fb9e5a8193aabda22b0c7f7541c1f904 U drh -Z 9295f25c50d1d41e258f97d8c0c2ca57 +Z 1c49ffc7129044d57402911aa96f7225 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 1712a713d0..53a003afa4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d75c08c8416bde3f510a135ea07cc217ba6183eacda6ba895bccbf57efe9284f +d903795e3bdf91607f23dace5a15a070139b32e34aed8540a6c2e19c39e997be From a20f63e0ef79a3c6fc4353ad7b0f01ddf59a4510 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 18 May 2026 20:43:15 +0000 Subject: [PATCH 3/9] Limit the NEAR span in FTS3 to 1 billion, to avoid integer overflow. [bugs:/forumpost/4cfcf164d2|Bug report 4cfcf164d2]. FossilOrigin-Name: adcb44f9dcfd34df4cf4f5cc418ecac9f2ca09723442379dfedcba532c45de77 --- ext/fts3/fts3_expr.c | 1 + manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ext/fts3/fts3_expr.c b/ext/fts3/fts3_expr.c index 681d4e8625..ae8da4cb06 100644 --- a/ext/fts3/fts3_expr.c +++ b/ext/fts3/fts3_expr.c @@ -471,6 +471,7 @@ static int getNextNode( assert( nKey==4 ); if( zInput[4]=='/' && zInput[5]>='0' && zInput[5]<='9' ){ nKey += 1+sqlite3Fts3ReadInt(&zInput[nKey+1], &nNear); + if( nNear>=1000000000 ) nNear = 1000000000; } } diff --git a/manifest b/manifest index b8224c63f1..da6c932061 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Prevent\sinteger\soverflow\sdue\sto\sdatabase\scorruption\sin.\nfts3auxNextMethod().\n[bugs:/forumpost/bce19272cf|Bug\sreport\sbce19272cf]. -D 2026-05-18T20:27:57.529 +C Limit\sthe\sNEAR\sspan\sin\sFTS3\sto\s1\sbillion,\sto\savoid\sinteger\soverflow.\n[bugs:/forumpost/4cfcf164d2|Bug\sreport\s4cfcf164d2]. +D 2026-05-18T20:43:15.141 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -83,7 +83,7 @@ F ext/fts3/fts3.c 6cc7bbc307f27e7b6ee2e1d5ff63ffff4df3b42529dfe00eb34ddded417961 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 277f32f304e82f4397fc2a74793c0a95318b7abb9670b519e4805a00946cbd9b F ext/fts3/fts3_aux.c c105f6502df588f49a383eb22aed953844fb0e31265361a0cc8dd73037b37e39 -F ext/fts3/fts3_expr.c 5c13796638d8192c388777166075cdc8bc4b6712024cd5b72c31acdbefce5984 +F ext/fts3/fts3_expr.c 907dd64deb881c0586d5ecbabc96cfebdbe2ff9e7a052d379fd3b606edfa21ea F ext/fts3/fts3_hash.c d9dba473741445789330c7513d4f65737c92df23c3212784312931641814672a F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 @@ -2205,8 +2205,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P d75c08c8416bde3f510a135ea07cc217ba6183eacda6ba895bccbf57efe9284f -R fb9e5a8193aabda22b0c7f7541c1f904 +P d903795e3bdf91607f23dace5a15a070139b32e34aed8540a6c2e19c39e997be +R 7d66ba7a943cc3436c61e2bb2a74d35d U drh -Z 1c49ffc7129044d57402911aa96f7225 +Z 23a84d4ea8613ad7e5364e12bc2b88d5 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 53a003afa4..8a74274484 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d903795e3bdf91607f23dace5a15a070139b32e34aed8540a6c2e19c39e997be +adcb44f9dcfd34df4cf4f5cc418ecac9f2ca09723442379dfedcba532c45de77 From 1192d6f5b18edbc17cc775c8900530a9c4871a8a Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 18 May 2026 21:45:06 +0000 Subject: [PATCH 4/9] Fix an off-by-one error in matchinfo('b') for FTS3 when there are a large number of columns. [bugs:/forumpost/42d5f799d1|Bug report 42d5f799d1]. FossilOrigin-Name: c0f2cd6d292bb3554539a309a2ecfa0a12f0248cfcbb5594391607b107a62cd2 --- ext/fts3/fts3_snippet.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index 62e27d30bf..d969ca774d 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -887,7 +887,7 @@ static int fts3ExprLHits( if( p->flag==FTS3_MATCHINFO_LHITS ){ p->aMatchinfo[iStart + iCol] = (u32)nHit; }else if( nHit ){ - p->aMatchinfo[iStart + (iCol+1)/32] |= (1 << (iCol&0x1F)); + p->aMatchinfo[iStart + iCol/32] |= (1U << (iCol&0x1F)); } } assert( *pIter==0x00 || *pIter==0x01 ); diff --git a/manifest b/manifest index da6c932061..3850f019e3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Limit\sthe\sNEAR\sspan\sin\sFTS3\sto\s1\sbillion,\sto\savoid\sinteger\soverflow.\n[bugs:/forumpost/4cfcf164d2|Bug\sreport\s4cfcf164d2]. -D 2026-05-18T20:43:15.141 +C Fix\san\soff-by-one\serror\sin\smatchinfo('b')\sfor\sFTS3\swhen\sthere\sare\sa\slarge\nnumber\sof\scolumns.\n[bugs:/forumpost/42d5f799d1|Bug\sreport\s42d5f799d1]. +D 2026-05-18T21:45:06.667 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -88,7 +88,7 @@ F ext/fts3/fts3_hash.c d9dba473741445789330c7513d4f65737c92df23c3212784312931641 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 F ext/fts3/fts3_porter.c 024417020c57dd1ab39816f5fe6cf45222a857b78a1f6412f040ada1ceabd4ff -F ext/fts3/fts3_snippet.c abe3b2998e7cb6d1ab6019f87f021758a0df3ee4010fe144a174a524cff96fe6 +F ext/fts3/fts3_snippet.c 65e178107b59ad4724a11339a645f2e3789f3cf59b2f4e29c90efd864e53c5b4 F ext/fts3/fts3_term.c 6a96027ad364001432545fe43322b6af04ed28bb5619ec51af1f59d0710d6d69 F ext/fts3/fts3_test.c cc329471e573f95a6ea9fbca87e89dcfa1d355591c80172ffcd759ac521d25d8 F ext/fts3/fts3_tokenize_vtab.c 66eba6c2baa04b2b15e80d68341b8fd0b4d3831f6b2edb33916a2906ff2d4389 @@ -2205,8 +2205,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P d903795e3bdf91607f23dace5a15a070139b32e34aed8540a6c2e19c39e997be -R 7d66ba7a943cc3436c61e2bb2a74d35d +P adcb44f9dcfd34df4cf4f5cc418ecac9f2ca09723442379dfedcba532c45de77 +R 7688428400c215e501f1a8e9e22db88b U drh -Z 23a84d4ea8613ad7e5364e12bc2b88d5 +Z 3cd77330141a4fe26eb9e6c7810fb911 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8a74274484..4931ab2876 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -adcb44f9dcfd34df4cf4f5cc418ecac9f2ca09723442379dfedcba532c45de77 +c0f2cd6d292bb3554539a309a2ecfa0a12f0248cfcbb5594391607b107a62cd2 From d0fd0cc2faa00d3f251e35fa5e46677a8c398d1c Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 18 May 2026 23:58:14 +0000 Subject: [PATCH 5/9] Fix a NULL pointer dereference in the obscure (and unused) prefixes extension, which I had forgotten even existed. [bugs:/forumpost/24a33e5d10|Bug report 24a33e5d10]. FossilOrigin-Name: 4880adc053b0f21633936347fd5610e4338b15da39607d8ba5a6b32d1516e8cb --- ext/misc/prefixes.c | 4 ++++ manifest | 14 +++++++------- manifest.uuid | 2 +- test/prefixes.test | 10 +++++++++- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/ext/misc/prefixes.c b/ext/misc/prefixes.c index 3c47933c06..9637b92fbe 100644 --- a/ext/misc/prefixes.c +++ b/ext/misc/prefixes.c @@ -289,6 +289,10 @@ static void prefixLengthFunc( int nL = sqlite3_value_bytes(apVal[0]); int nR = sqlite3_value_bytes(apVal[1]); int i; + if( zL==0 || zR==0 ){ + sqlite3_result_int(ctx, 0); + return; + } nByte = (nL > nR ? nL : nR); for(i=0; i Date: Tue, 19 May 2026 10:30:13 +0000 Subject: [PATCH 6/9] Limit the size of input strings to the (disused) spellfix extension to avoid excessive runtime and integer overflows. [bugs:/forumpost/24a33e5d10|Bugs report 24a33e5d10]. FossilOrigin-Name: 4b16b80cf2e26c41f0828d65883145dc81c0987110c3f04a864cec43e7c418e5 --- ext/misc/spellfix.c | 4 ++++ manifest | 14 +++++++------- manifest.uuid | 2 +- test/spellfix4.test | 10 ++++++++++ 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/ext/misc/spellfix.c b/ext/misc/spellfix.c index f51f3bdfe0..bb0ab0b44e 100644 --- a/ext/misc/spellfix.c +++ b/ext/misc/spellfix.c @@ -1008,6 +1008,8 @@ static int editDist3Core( unsigned int stackSpace[SQLITE_SPELLFIX_STACKALLOC_SZ/sizeof(unsigned int)]; /* allocate the Wagner matrix and the aTo[] array for the TO string */ + if( n2>10000 ) return -2; + if( f.n>10000 ) return -2; n = (f.n+1)*(n2+1); n = (n+1)&~1; nByte = n*sizeof(m[0]) + sizeof(a2[0])*n2; @@ -1198,6 +1200,8 @@ static void editDist3SqlFunc( editDist3FromStringDelete(pFrom); if( dist==(-1) ){ sqlite3_result_error_nomem(context); + }else if( dist==(-2) ){ + sqlite3_result_error_toobig(context); }else{ sqlite3_result_int(context, dist); } diff --git a/manifest b/manifest index c871510a6e..3d6e5366a2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sNULL\spointer\sdereference\sin\sthe\sobscure\s(and\sunused)\sprefixes\nextension,\swhich\sI\shad\sforgotten\seven\sexisted.\n[bugs:/forumpost/24a33e5d10|Bug\sreport\s24a33e5d10]. -D 2026-05-18T23:58:14.244 +C Limit\sthe\ssize\sof\sinput\sstrings\sto\sthe\s(disused)\sspellfix\sextension\nto\savoid\sexcessive\sruntime\sand\sinteger\soverflows.\n[bugs:/forumpost/24a33e5d10|Bugs\sreport\s24a33e5d10]. +D 2026-05-19T10:30:13.196 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -399,7 +399,7 @@ F ext/misc/series.c 496f43bac9bad2ee2cea63fb5212036f30ad3003b4cd317d5c2d6f3ad7c7 F ext/misc/sha1.c 9a11826db885e8afd997c0a1b28bb799a43e462ef770ac33f19e744887c9c6fa F ext/misc/shathree.c fd22d70620f86a0467acfdd3acd8435d5cb54eb1e2d9ff36ae44e389826993df F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52 -F ext/misc/spellfix.c 693c8fd3293087fa821322967a97e59dfa24051e5d2ca7fa85790a4034db6fa4 +F ext/misc/spellfix.c 33c92014c4662c2678ec01fd7dfa622aeff2f6f0f7821f643b331d4cabac2c7e F ext/misc/sqlar.c 97c100b010159c08a7a9acd8eb1ea510a5522e64741aaafcd7b6c629de682edc F ext/misc/sqlite3_stdio.c b43a0f530c6f0fb3d41d9af8c0b40f3f71198a1db55ab8ffffbef5c8cc329d22 F ext/misc/sqlite3_stdio.h 27a4ecea47e61bc9574ccdf2806f468afe23af2f95028c9b689bfa08ab1ce99f @@ -1676,7 +1676,7 @@ F test/speedtest1.c f9f30f35431bfc1d3ee9acc561624e0c0b4614071044bc302169dd27206a F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 -F test/spellfix4.test 51c7c26514ade169855c66bcf130bd5acfb4d7fd090cc624645ab275ae6a41fb +F test/spellfix4.test 7c56a09de68b95051ef0627fe235e514efbba2aa816dc2a9c5c670d98877e632 F test/sqldiff1.test 1b7ab4f312442c5cc6b3a5f299fa8ca051416d1dd173cb1126fd51bf64f2c3fb F test/sqllimits1.test 408131e4975d61868711c83f101a56d4602313cc5cae88d3eee81c1da364fd89 F test/sqllog.test 6af6cb0b09f4e44e1917e06ce85be7670302517a @@ -2205,8 +2205,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P c0f2cd6d292bb3554539a309a2ecfa0a12f0248cfcbb5594391607b107a62cd2 -R 27d88e7229b9ddb4bdedc834047f3737 +P 4880adc053b0f21633936347fd5610e4338b15da39607d8ba5a6b32d1516e8cb +R c278f651f777125c2d9466f5880429fa U drh -Z 95a536c6d276b5c6e9abb39166643759 +Z 243bb07023fe1be2b1f6d0ad563fd1b9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2675673beb..f8e1473dca 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4880adc053b0f21633936347fd5610e4338b15da39607d8ba5a6b32d1516e8cb +4b16b80cf2e26c41f0828d65883145dc81c0987110c3f04a864cec43e7c418e5 diff --git a/test/spellfix4.test b/test/spellfix4.test index caf6d5139a..6b9f09b3d7 100644 --- a/test/spellfix4.test +++ b/test/spellfix4.test @@ -350,4 +350,14 @@ do_execsql_test 320 { ) } {69d0a31872203a775e19325ea98cd053} +do_catchsql_test 400 { + SELECT editdist3(format('%.10001c','x'),'abc'); +} {1 {string or blob too big}} +do_catchsql_test 401 { + SELECT editdist3('xxxabc',format('%.10001c','x')); +} {1 {string or blob too big}} +do_catchsql_test 410 { + SELECT editdist3(format('abc%.9997c','x'),format('abc%.9997c','x')); +} {0 0} + finish_test From 4d3f3c707088cc1c9da1ff954fcd43d2c3603c57 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 19 May 2026 11:15:33 +0000 Subject: [PATCH 7/9] Security enhancements to the untested and unused fossildelta.c extension. Bug reports [bugs:/forumpost/3ac3fe3d71|3ac3fe3d71] and [bugs:/forumpost/e7e470b760|e7e470b760]. FossilOrigin-Name: 2d3fbbe421d3b0ad8fa08255fd30af7f2d947919ebb90fa9c9c4ee72ffd880b4 --- ext/misc/fossildelta.c | 26 +++++++++++++++++++------- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/ext/misc/fossildelta.c b/ext/misc/fossildelta.c index e2de0ec40f..721e6c2b85 100644 --- a/ext/misc/fossildelta.c +++ b/ext/misc/fossildelta.c @@ -29,6 +29,17 @@ ** RBU does not use this extension directly. Rather, this extension is ** provided as a convenience to developers who want to analyze RBU files ** that contain deltas. +** +** Typical build commands assuming +** +** DIR=ext/misc +* NAME=fossildelta +** +** First run "make sqlite3ext.h" then: +** +** linux: gcc -shared -I. -fPIC -o $NAME.so $DIR/$NAME.c +** OS-X: gcc -dynamiclib -fPIC -I. -o $NAME.dylib $DIR/$NAME.c +** Win11: cl -I. $DIR/$NAME.c -link -dll -out:$NAME.dll */ #include #include @@ -43,6 +54,7 @@ SQLITE_EXTENSION_INIT1 */ typedef unsigned int u32; typedef sqlite3_uint64 u64; +typedef sqlite3_int64 i64; /* ** Must be a 16-bit value @@ -769,11 +781,11 @@ struct deltaparsevtab_vtab { struct deltaparsevtab_cursor { sqlite3_vtab_cursor base; /* Base class - must be first */ char *aDelta; /* The delta being parsed */ - int nDelta; /* Number of bytes in the delta */ - int iCursor; /* Current cursor location */ + i64 iCursor; /* Current cursor location */ + i64 iNext; /* Next cursor value */ + i64 nDelta; /* Number of bytes in the delta */ int eOp; /* Name of current operator */ unsigned int a1, a2; /* Arguments to current operator */ - int iNext; /* Next cursor value */ }; /* Operator names: @@ -887,14 +899,14 @@ static int deltaparsevtabNext(sqlite3_vtab_cursor *cur){ } pCur->a2 = deltaGetInt(&z, &i); pCur->eOp = DELTAPARSE_OP_COPY; - pCur->iNext = (int)(&z[1] - pCur->aDelta); + pCur->iNext = (i64)(&z[1] - pCur->aDelta); break; } case ':': { z++; pCur->a2 = (unsigned int)(z - pCur->aDelta); pCur->eOp = DELTAPARSE_OP_INSERT; - pCur->iNext = (int)(&z[pCur->a1] - pCur->aDelta); + pCur->iNext = (i64)(&z[pCur->a1] - pCur->aDelta); break; } case ';': { @@ -938,7 +950,7 @@ static int deltaparsevtabColumn( if( pCur->eOp==DELTAPARSE_OP_COPY ){ sqlite3_result_int(ctx, pCur->a2); }else if( pCur->eOp==DELTAPARSE_OP_INSERT ){ - if( pCur->a2 + pCur->a1 > pCur->nDelta ){ + if( (i64)pCur->a2 + (i64)pCur->a1 > pCur->nDelta ){ sqlite3_result_zeroblob(ctx, pCur->a1); }else{ sqlite3_result_blob(ctx, pCur->aDelta+pCur->a2, pCur->a1, @@ -1014,7 +1026,7 @@ static int deltaparsevtabFilter( return SQLITE_OK; } a++; - pCur->iNext = (unsigned int)(a - pCur->aDelta); + pCur->iNext = (i64)(a - pCur->aDelta); return SQLITE_OK; } diff --git a/manifest b/manifest index 3d6e5366a2..76292f655e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Limit\sthe\ssize\sof\sinput\sstrings\sto\sthe\s(disused)\sspellfix\sextension\nto\savoid\sexcessive\sruntime\sand\sinteger\soverflows.\n[bugs:/forumpost/24a33e5d10|Bugs\sreport\s24a33e5d10]. -D 2026-05-19T10:30:13.196 +C Security\senhancements\sto\sthe\suntested\sand\sunused\sfossildelta.c\sextension.\nBug\sreports\s[bugs:/forumpost/3ac3fe3d71|3ac3fe3d71]\sand\n[bugs:/forumpost/e7e470b760|e7e470b760]. +D 2026-05-19T11:15:33.265 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -377,7 +377,7 @@ F ext/misc/decimal.c 432e5b03a0e2a68a1846a9852a565a1b546ca9b295deda834e4653f0f55 F ext/misc/eval.c 04bc9aada78c888394204b4ed996ab834b99726fb59603b0ee3ed6e049755dc1 F ext/misc/explain.c 9670c8ff7b255eea7845abc5123a4958e74016c16990b10497e56380f91704b9 F ext/misc/fileio.c 936c0a7b3382a047d833ad33f62ba59a3847b79ea745bf529797cd344966fbb0 -F ext/misc/fossildelta.c 40add35db7f355d29ae856fe09043e66802fceff6f2551baccb28d794cadbc77 +F ext/misc/fossildelta.c 6aa3f15279cd2d796583e3ff654be7d2df745fdbea7987c1640e78ce1fac899e F ext/misc/fuzzer.c decaca5a3479dfba69576cd41d4e17161eaf154a5438e12d316bbc5853571802 F ext/misc/ieee754.c 2901d08a586d00a1d3c0fd89e03c57ee9e2b5f013b0daab9e49c7a48a9d5946b F ext/misc/memstat.c 03ab52d2d841eb3f55118105c1964d5225f152b23bd708844c648b48d14ccbcf @@ -2205,8 +2205,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 4880adc053b0f21633936347fd5610e4338b15da39607d8ba5a6b32d1516e8cb -R c278f651f777125c2d9466f5880429fa +P 4b16b80cf2e26c41f0828d65883145dc81c0987110c3f04a864cec43e7c418e5 +R 59d5a66efa1e70342f9560d0d82bbc44 U drh -Z 243bb07023fe1be2b1f6d0ad563fd1b9 +Z 358e2b2e45f4495520024557411695d0 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f8e1473dca..5453b915fb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4b16b80cf2e26c41f0828d65883145dc81c0987110c3f04a864cec43e7c418e5 +2d3fbbe421d3b0ad8fa08255fd30af7f2d947919ebb90fa9c9c4ee72ffd880b4 From db5aebce436abc62897dbaa8379922325709f98c Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 19 May 2026 12:40:00 +0000 Subject: [PATCH 8/9] Early detection of attempts to overwrite an in-use cache page due to database corruption. [https://issues.chromium.org/issues/513858286|Chromium 513858286]. FossilOrigin-Name: 6193e4105b6a58eac2bc17c5b2d55fdae332816b59beed1fe24c15dff1372322 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 8 +++++++- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 76292f655e..eecaa7ac48 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Security\senhancements\sto\sthe\suntested\sand\sunused\sfossildelta.c\sextension.\nBug\sreports\s[bugs:/forumpost/3ac3fe3d71|3ac3fe3d71]\sand\n[bugs:/forumpost/e7e470b760|e7e470b760]. -D 2026-05-19T11:15:33.265 +C Early\sdetection\sof\sattempts\sto\soverwrite\san\sin-use\scache\spage\sdue\nto\sdatabase\scorruption.\n[https://issues.chromium.org/issues/513858286|Chromium\s513858286]. +D 2026-05-19T12:40:00.891 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -676,7 +676,7 @@ F src/auth.c b5ece4e1edccad082c0332fa0087df225473bae0feea9269f824312201377185 F src/backup.c 6ebe22ccbedfcb92423833992130e8d65824be4e6599c3a03f540ab38fc7d13c F src/bitvec.c e242d4496774dfc88fa278177dd23b607dce369ccafb3f61b41638eea2c9b399 F src/btmutex.c 30dada73a819a1ef5b7583786370dce1842e12e1ad941e4d05ac29695528daea -F src/btree.c 6a111fbcc9f4fa1450f81f9531f2045ab75c1fe33112fb7d7a20b631fa9ca4b9 +F src/btree.c eba3271a61031f5a930486416ae2ec8697221e86d1a3c68a014c5f78641f2116 F src/btree.h e823c46d87f63d904d735a24b76146d19f51f04445ea561f71cc3382fd1307f0 F src/btreeInt.h 9c0f9ea5c9b5f4dcaea18111d43efe95f2ac276cd86d770dce10fd99ccc93886 F src/build.c 866e584cdf40fbc83f530af9fd4d0991582a6fdbd8a9911b7cdbbea5f26a4a9e @@ -2205,8 +2205,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 4b16b80cf2e26c41f0828d65883145dc81c0987110c3f04a864cec43e7c418e5 -R 59d5a66efa1e70342f9560d0d82bbc44 +P 2d3fbbe421d3b0ad8fa08255fd30af7f2d947919ebb90fa9c9c4ee72ffd880b4 +R 76b0f2819f1dc68826fc6d0bf7bc6e51 U drh -Z 358e2b2e45f4495520024557411695d0 +Z d5ceec0f442ad447afe0c71effc41b77 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 5453b915fb..01bb414560 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2d3fbbe421d3b0ad8fa08255fd30af7f2d947919ebb90fa9c9c4ee72ffd880b4 +6193e4105b6a58eac2bc17c5b2d55fdae332816b59beed1fe24c15dff1372322 diff --git a/src/btree.c b/src/btree.c index 90877740f3..e4dc5da2e4 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1656,7 +1656,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ ** reconstruct the entire page. */ if( (int)data[hdr+7]<=nMaxFrag ){ int iFree = get2byte(&data[hdr+1]); - if( iFree>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage); + if( NEVER(iFree>usableSize-4) ) return SQLITE_CORRUPT_PAGE(pPage); if( iFree ){ int iFree2 = get2byte(&data[iFree]); if( iFree2>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage); @@ -5300,6 +5300,12 @@ static int accessPayload( (eOp==0 ? PAGER_GET_READONLY : 0) ); if( rc==SQLITE_OK ){ + if( eOp!=0 + && (sqlite3PagerPageRefcount(pDbPage)!=1 + || NEVER(((MemPage*)sqlite3PagerGetExtra(pDbPage))->isInit)) ){ + sqlite3PagerUnref(pDbPage); + return SQLITE_CORRUPT_PAGE(pPage); + } aPayload = sqlite3PagerGetData(pDbPage); nextPage = get4byte(aPayload); rc = copyPayload(&aPayload[offset+4], pBuf, a, eOp, pDbPage); From cbbeddbd6781d7a1dac2a505d41ff151b1de4bf8 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 19 May 2026 15:13:03 +0000 Subject: [PATCH 9/9] Add the "make" subcommand to testrunner.tcl FossilOrigin-Name: 00d546812810252a4d51ff796931dc2ff5bdd5173ddb8f95fb5efccd897087ff --- manifest | 14 +++---- manifest.uuid | 2 +- test/testrunner.tcl | 87 ++++++++++++++++++++++++++++++++++++++-- test/testrunner_data.tcl | 77 ++++++++++++++++++++--------------- 4 files changed, 137 insertions(+), 43 deletions(-) diff --git a/manifest b/manifest index eecaa7ac48..95040d26ec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Early\sdetection\sof\sattempts\sto\soverwrite\san\sin-use\scache\spage\sdue\nto\sdatabase\scorruption.\n[https://issues.chromium.org/issues/513858286|Chromium\s513858286]. -D 2026-05-19T12:40:00.891 +C Add\sthe\s"make"\ssubcommand\sto\stestrunner.tcl +D 2026-05-19T15:13:03.161 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -1721,8 +1721,8 @@ F test/temptrigfault.tes fc5918e64f3867156fefe7cfca9d8e1f495134a5229b2b511b0dc11 F test/temptrigger.test a00f258ed8d21a0e8fd4f322f15e8cfb5cef2e43655670e07a753e3fb4769d61 F test/tester.tcl 2d943f60200e0a36bcd3f1f0baf181a751cd3604ef6b6bd4c8dc39b4e8a53116 F test/testloadext.c 862b848783eaed9985fbce46c65cd214664376b549fae252b364d5d1ef350a27 -F test/testrunner.tcl 6d13732185c13aef87540ebf9daafb8d9657e66f0ac00eb082d93f4749311d4e x -F test/testrunner_data.tcl dfcf192d274e965845189cc014ac89fff91dde92b6e2ac9e1262897fc21ee2e0 +F test/testrunner.tcl ca474a06ef014260fa2b26489dd7896e0920944a8f4f4beae1339c0a9c862df8 x +F test/testrunner_data.tcl 4b3cf036d39c98b83f9289a5c047eb01089c932d4f59a81bf764f6800589b959 F test/testrunner_estwork.tcl 81e2ae10238f50540f42fbf2d94913052a99bfb494b69e546506323f195dcff9 F test/thread001.test a0985c117eab62c0c65526e9fa5d1360dd1cac5b03bde223902763274ce21899 F test/thread002.test c24c83408e35ba5a952a3638b7ac03ccdf1ce4409289c54a050ac4c5f1de7502 @@ -2205,8 +2205,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 2d3fbbe421d3b0ad8fa08255fd30af7f2d947919ebb90fa9c9c4ee72ffd880b4 -R 76b0f2819f1dc68826fc6d0bf7bc6e51 +P 6193e4105b6a58eac2bc17c5b2d55fdae332816b59beed1fe24c15dff1372322 +R 47c0b19a1e0edb9eaefa4cec284fc032 U drh -Z d5ceec0f442ad447afe0c71effc41b77 +Z 86ab4f0d052a2398e753f15ef922bf21 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 01bb414560..b7855b4157 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6193e4105b6a58eac2bc17c5b2d55fdae332816b59beed1fe24c15dff1372322 +00d546812810252a4d51ff796931dc2ff5bdd5173ddb8f95fb5efccd897087ff diff --git a/test/testrunner.tcl b/test/testrunner.tcl index e08bca4577..377a516753 100755 --- a/test/testrunner.tcl +++ b/test/testrunner.tcl @@ -113,6 +113,7 @@ Usage: $a0 joblist ?PATTERN? $a0 njob ?NJOB? $a0 retest + $a0 make CONFIG TARGETS $a0 script ?-msvc? CONFIG $a0 status ?-d SECS? ?--cls? @@ -171,6 +172,8 @@ as complete. Testing will halt when all tests currently running complete. The "clean" command removes files and directories created by a prior invocation of testrunner.tcl. +The "make" command runs "make" configured for the specific CONFIG. + The "script" command outputs the script used to build a configuration. Add the "-msvc" option for a Windows-compatible script. For a list of available configurations enter "$a0 script help". @@ -585,6 +588,87 @@ if {[string compare -nocase script [lindex $argv 0]]==0} { exit } +#-------------------------------------------------------------------------- +# Check if this is the "make" command. Example: +# +# test/testrunner.tcl make Debug-Two clean testfixture +# \_______/ \_______________/ +# Configuration ----------^ ^---------- Arguments to "make" +# +# This works by running the equivalent of "testrunner.tcl script" to generate +# the approprate shell script or BAT file, then invoking that script. The +# generated script is usually deleted automatically, but that can be suppressed +# using the --keep option. +# +if {[string compare -nocase "make" [lindex $argv 0]]==0} { + set bKeep 0 + set bDryRun 0 + set Config {} + set MakeArgs [list] + for {set i 1} {$i<[llength $argv]} {incr i} { + set arg [lindex $argv $i] + if {$arg eq "-keep" || $arg eq "--keep"} { + set bKeep 1 + continue + } + if {[regexp {^--?dry-?run$} $arg] || [regexp {^--?n$} $arg]} { + set bDryRun 1 + continue + } + if {$Config eq ""} { + if {![info exists ::trd::build($arg)]} { + puts stderr "No such configuration: $arg" + puts stderr "Should be one of: [lsort [array names ::trd::build]]" + exit 1 + } + set Config $arg + continue + } + lappend MakeArgs $arg + } + if {$Config eq ""} { + puts stderr "Missing configuration name" + puts stderr "Run \"$argv0 help\" for help" + exit 1 + } + set scriptname testrunner-[expr {int(rand()*1000000)}][clock seconds] + if {$tcl_platform(platform) eq "windows"} { + set bMsvc 1 + append scriptname .bat + } else { + set bMsvc 0 + append scriptname .sh + } + if {$bDryRun} { + puts "Script \"$scriptname\" would have been:" + puts [trd_buildscript $Config [file dirname $testdir] $bMsvc $MakeArgs] + exit 0 + } + set fd [open $scriptname w] + puts $fd [trd_buildscript $Config [file dirname $testdir] $bMsvc $MakeArgs] + close $fd + if {$bMsvc} { + set rc [catch { + exec $scriptname >@stdout + } msg] + set rc 0 + } else { + set rc [catch { + exec sh $scriptname >@stdout 2>@stderr + } msg] + } + if {$bKeep} { + puts "script retained in \"$scriptname\" + } else { + file delete -force $scriptname + } + if {$rc} { + puts stderr "make failed: $msg" + exit 1 + } + exit +} + # Compute an elapse time string MM:SS or HH:MM:SS based on the # number of milliseconds in the argument. # @@ -2052,6 +2136,3 @@ if {$TRG(explain)} { } trdb close exit $exit_status - - - diff --git a/test/testrunner_data.tcl b/test/testrunner_data.tcl index a30402826c..822ab6193e 100644 --- a/test/testrunner_data.tcl +++ b/test/testrunner_data.tcl @@ -473,10 +473,12 @@ proc trd_all_configs {} { } proc trimscript {text} { - set text [string map {"\n " "\n"} [string trim $text]] + set text [string map {"\n " "\n"} [string trim $text]] + set text [string map {"\n\n" "\n"} $text] + return $text } -proc make_sh_script {srcdir opts cflags makeOpts configOpts} { +proc make_sh_script {srcdir opts cflags makeOpts configOpts {targets {}}} { set tcldir [::tcl::pkgconfig get libdir,install] set myopts "" @@ -488,43 +490,54 @@ proc make_sh_script {srcdir opts cflags makeOpts configOpts} { append myopts "OPTS=\"\$OPTS $o\"\n" } - return [trimscript [subst -nocommands { - set -e - if [ "\$#" -ne 1 ] ; then - echo "Usage: \$0 " - exit -1 - fi - - SRCDIR="$srcdir" - TCLDIR="$tcldir" - - if [ ! -f Makefile ] ; then - \$SRCDIR/configure --with-tcl=\$TCLDIR $configOpts - fi - - $myopts - CFLAGS="$cflags" - - make \$1 "CFLAGS=\$CFLAGS" "OPTS=\$OPTS" $makeOpts + set out "set -e\n" + if {[llength $targets]==0} { + set out [trimscript { + if [ "$#" -lt 1 ] ; then + echo "Usage: $0 " + exit -1 + fi + }]\n + } + append out [trimscript [subst -nocommands { + SRCDIR="$srcdir" + TCLDIR="$tcldir" + if [ ! -f Makefile ] ; then + \$SRCDIR/configure --with-tcl=\$TCLDIR $configOpts + fi + $myopts + CFLAGS="$cflags" + }]]\n + if {[llength $targets]==0} {set targets {$*}} + append out [trimscript [subst -nocommands { + make $targets "CFLAGS=\$CFLAGS" "OPTS=\$OPTS" $makeOpts }]] + return $out } # Generate the text of a *.bat script. # -proc make_bat_file {srcdir opts cflags makeOpts} { +proc make_bat_file {srcdir opts cflags makeOpts {targets {}}} { set srcdir [file nativename [file normalize $srcdir]] - - return [trimscript [subst -nocommands { - set TARGET=%1 - set TMP=%CD% - nmake /f $srcdir\\Makefile.msc TOP="$srcdir" %TARGET% "CCOPTS=$cflags" "OPTS=$opts" $makeOpts - }]] + set makefile $srcdir\\Makefile.msc + if {[llength $targets]==0} { + return [trimscript [subst -nocommands { + set TARGET=%1 + set TMP=%CD% + nmake /f $makefile TOP="$srcdir" %TARGET% "CCOPTS=$cflags" "OPTS=$opts" $makeOpts + }]] + } else { + return [trimscript [subst -nocommands { + set TMP=%CD% + nmake /f $makefile TOP="$srcdir" $targets "CCOPTS=$cflags" "OPTS=$opts" $makeOpts + }]] + } } # Generate the text of a shell script. # -proc make_script {cfg srcdir bMsvc} { +proc make_script {cfg srcdir bMsvc {targets {}}} { set opts [list] ;# OPTS value set cflags [expr {$bMsvc ? "-Zi" : "-g"}] ;# CFLAGS value set makeOpts [list] ;# Extra args for [make] @@ -624,9 +637,9 @@ proc make_script {cfg srcdir bMsvc} { } if {$bMsvc==0} { - set zRet [make_sh_script $srcdir $opts $cflags $makeOpts $configOpts] + return [make_sh_script $srcdir $opts $cflags $makeOpts $configOpts $targets] } else { - set zRet [make_bat_file $srcdir $opts $cflags $makeOpts] + return [make_bat_file $srcdir $opts $cflags $makeOpts $targets] } } @@ -643,7 +656,7 @@ proc make_script {cfg srcdir bMsvc} { # directory of that containing this script). MSVC is a boolean - true to # use the MSVC compiler, false otherwise. # -proc trd_buildscript {config srcdir bMsvc} { +proc trd_buildscript {config srcdir bMsvc {targets {}}} { trd_import # Ensure that the named configuration exists. @@ -657,7 +670,7 @@ proc trd_buildscript {config srcdir bMsvc} { } # Generate and return the script. - return [make_script $build($config) $srcdir $bMsvc] + return [make_script $build($config) $srcdir $bMsvc $targets] } # Usage: