]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Block deep recursion in test extension functions test_eval() and eval(). master
authordrh <>
Wed, 29 Jul 2026 13:00:37 +0000 (13:00 +0000)
committerdrh <>
Wed, 29 Jul 2026 13:00:37 +0000 (13:00 +0000)
Does not affect deliverable code.
[bugs:/info/2026-07-29T06:29:11Z|Bug 2026-07-29T06:29:11Z]

FossilOrigin-Name: 3e99c27fe3db76a146bb4a77c08007e6c4598cda7975dd40d4f7f14c3bd914b5

ext/misc/eval.c
manifest
manifest.uuid
src/test_func.c
test/eval.test
test/misc8.test

index d3849d65871b1fbc15dfca1cba1bfdd63ed14238..32fc8dd1b60afd4ac90d18c8492a80373100ac48 100644 (file)
@@ -78,6 +78,9 @@ static void sqlEvalFunc(
   char *zErr = 0;
   int rc;
   struct EvalResult x;
+  int depth;                /* Recursion depth */
+  int *pDepth;              /* Prior depth */
+  static const char zDepth[] = "eval-extension-depth";
 
   memset(&x, 0, sizeof(x));
   x.zSep = " ";
@@ -89,7 +92,15 @@ static void sqlEvalFunc(
   }
   x.szSep = (int)strlen(x.zSep);
   db = sqlite3_context_db_handle(context);
+  pDepth = (int*)sqlite3_get_clientdata(db, zDepth);
+  depth = pDepth ? 1+*pDepth : 1;
+  if( depth>4 ){
+    sqlite3_result_error(context, "eval() nested too deep", -1);
+    return;
+  }
+  sqlite3_set_clientdata(db, zDepth, &depth, 0);
   rc = sqlite3_exec(db, zSql, callback, &x, &zErr);
+  sqlite3_set_clientdata(db, zDepth, pDepth, 0);
   if( rc!=SQLITE_OK ){
     sqlite3_result_error(context, zErr, -1);
     sqlite3_free(zErr);
index 5b13b2b6ed7c0ba2334a61d7cd023dca0b127b5f..1a93e7bc1c9dc230b475746ca021ff82657660fe 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Improved\scomments\sclarifying\soperation\sof\sthe\sext/misc/noop.c\stesting\nextension.\n[bugs:/info/2026-07-29T06:31:22Z|Bug\s2026-07-29T06:31:22Z].
-D 2026-07-29T11:28:07.767
+C Block\sdeep\srecursion\sin\stest\sextension\sfunctions\stest_eval()\sand\seval().\nDoes\snot\saffect\sdeliverable\scode.\n[bugs:/info/2026-07-29T06:29:11Z|Bug\s2026-07-29T06:29:11Z]
+D 2026-07-29T13:00:37.380
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -376,7 +376,7 @@ F ext/misc/csv.c 5ca451b9ce77322c4ce8476766e7ed18160e5c8b19e7cab76e13006d631b9e8
 F ext/misc/dbdump.c 678f1b9ae2317b4473f65d03132a2482c3f4b08920799ed80feedd2941a06680
 F ext/misc/decimal.c 0e5504e949c45df8cc69e3754bfa4f35cb341f7c055e74187693cc1f2c33afbd
 F ext/misc/diskused.c 0ef61ab38a877430e104d24c6d55f172634563f584bb08af2f33eaa04acaf5eb
-F ext/misc/eval.c 04bc9aada78c888394204b4ed996ab834b99726fb59603b0ee3ed6e049755dc1
+F ext/misc/eval.c d4ea2d9898fbe4d30d38ff675ee51958d3bb0601a145bade56dee8b8f438cc5b
 F ext/misc/explain.c 04c9270fd8cf93a9bceb12d2f5f67e3f09a4e58b3e0efe14d24531444d2fffdf
 F ext/misc/fileio.c f32d7488e229cc52283b6f8d9370b004aa92e7a3054aef320cbdbdecb08c4ee5
 F ext/misc/fossildelta.c 5513fe1aae0d168fb5e798cd04a4d0e5fd15f39ca64c37b0eb63123602acc8e7
@@ -771,7 +771,7 @@ F src/test_delete.c d0e8f6dc55cfc98a7c27c057fb88d512260564bf0b611482656c68b8f7f4
 F src/test_demovfs.c 3efa2adf4f21e10d95521721687d5ca047aea91fa62dd8cc22ac9e5a9c942383
 F src/test_devsym.c 649434ed34d0b03fbd5a6b42df80f0f9a7e53f94dd1710aad5dd8831e91c4e86
 F src/test_fs.c a946408c81231feff4b6a2c18068f20aefe254dc82288687128af8b7520d32cb
-F src/test_func.c 858d4dddb7acf88222ebcba7cffb585f6dde83e4a15b838c0d05ccdf8d5219b9
+F src/test_func.c e8bb96f879e9ac9d1397e3bc37fed8673cdc305a073a418787bc5becdacefa77
 F src/test_hexio.c a90baa0a8ab5e7cfe2216a61c9a31cfd1f8378353a3d23e25fa94c09aa755bb0
 F src/test_init.c 1649e02448f536e53172f6b1ff873254fe9a0c6c8a4502a2d25c0cc7b11945ea
 F src/test_intarray.c 3fcf8ca7bb5c8776ea83f6aa9b66f8df0d1f37a99207b0097c8486f9c15cedbf
@@ -1107,7 +1107,7 @@ F test/eqp.test 472e1cb356f5c9eef821d115c7589dd463f49e9ab249183fe34712da157d7dda
 F test/eqp2.test 188bc2293b9dab0932b6ac50c3fec62976815df072d7814d5547c821a8630819
 F test/errmsg.test eae9f091eb39ce7e20305de45d8e5d115b68fa856fba4ea6757b6ca3705ff7f9
 F test/errofst1.test 6da78363739ba8991f498396ab331b5d64e7ab5c4172c12b5884683ef523ac53
-F test/eval.test 73969a2d43a511bf44080c44485a8c4d796b6a4f038d19e491867081155692c0
+F test/eval.test 331d501ba30ba6d6e797e5dfc8ce29ede8a64675dec22da7ea7a5523bc691e85
 F test/exclusive.test 7ff63be7503990921838d5c9f77f6e33e68e48ed1a9d48cd28745bf650bf0747
 F test/exclusive2.test cd70b1d9c6fffd336f9795b711dcc5d9ceba133ad3f7001da3fda63615bdc91e
 F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7
@@ -1455,7 +1455,7 @@ F test/misc4.test 10cd6addb2fa9093df4751a1b92b50440175dd5468a6ec84d0386e78f087db
 F test/misc5.test 0a5d7604e197f10ee471280bfcaaf8229f9d8e2eebfef2c8853222cbc1ea9cd5
 F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91
 F test/misc7.test d595599972ec0b436985f0f02f243b68500ffc977b9b3194ec66c0866cfddcab
-F test/misc8.test 08d2380bc435486b12161521f225043ac2be26f02471c2c1ea4cac0b1548edbd
+F test/misc8.test 1c5e3fad1224f7bd67dbeb7dbf69cded89f6f846075805a72c7bfc6a1b1ed786
 F test/misuse.test 859f37014d9824ca66bd90c36372c08c80c51c9593a7cfa8a31d4f92cd4d5b7f
 F test/mjournal.test f054788b7ca261e3825e306a1c714060941b709fe90fde2f14336f355300d1f0
 F test/mmap1.test 18de3fd7b70a777af6004ca2feecfcdd3d0be17fa04058e808baf530c94b1a1d
@@ -2218,8 +2218,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 978d12de384fef985d0363633566304bb20f452dfe8ceb836ca1d353a135f30a
-R 74f307287448cb9fdc20d53b9bfe41f0
+P c9bb594059c5e7ad6fd04f1b8087910833d89f05ddf1b6eea6bd5590c851c790
+R e44778a472f5d5583e7e1b8de641931a
 U drh
-Z 6f1cfb365fc9ffd712c8213b12afe99d
+Z 7ed69fa602ad9512280648b018e37a49
 # Remove this line to create a well-formed Fossil manifest.
index 71292c5154afe99375c9633a3fc5e2b24913736d..0e73aeebe071ab5112906451c3b0a1d1e5946590 100644 (file)
@@ -1 +1 @@
-c9bb594059c5e7ad6fd04f1b8087910833d89f05ddf1b6eea6bd5590c851c790
+3e99c27fe3db76a146bb4a77c08007e6c4598cda7975dd40d4f7f14c3bd914b5
index 82f7b3d9cadea8e6d2ee29656896fa181fa7e291..0c955667b449bd33f2fc6252ed55c7cdc0115e58 100644 (file)
@@ -296,8 +296,14 @@ static void test_eval(
   int rc;
   sqlite3 *db = sqlite3_context_db_handle(pCtx);
   const char *zSql;
+  static const char zTag[] = "test_eval()";
 
+  if( sqlite3_get_clientdata(db, zTag) ){
+    sqlite3_result_error(pCtx, "nested test_eval()", -1);
+    return;
+  }
   zSql = (char*)sqlite3_value_text(argv[0]);
+  sqlite3_set_clientdata(db, zTag, &rc, 0);
   rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
   if( rc==SQLITE_OK ){
     rc = sqlite3_step(pStmt);
@@ -306,9 +312,9 @@ static void test_eval(
     }
     rc = sqlite3_finalize(pStmt);
   }
+  sqlite3_set_clientdata(db, zTag, 0, 0);
   if( rc ){
     char *zErr;
-    assert( pStmt==0 );
     zErr = sqlite3_mprintf("sqlite3_prepare_v2() error: %s",sqlite3_errmsg(db));
     sqlite3_result_text(pCtx, zErr, -1, sqlite3_free);
     sqlite3_result_error_code(pCtx, rc);
index 159e8754dc6db860357056dc682cbe11240a37bb..8addfe58977602b44b075b2cf8de2e57eebf9dbf 100644 (file)
@@ -84,4 +84,15 @@ do_test eval-4.1 {
   execsql { SELECT test_eval('SELECT ''abcdefghij''') }
 } {abcdefghij}
 
+# Bug 2026-07-29T06:29:11Z
+#
+do_catchsql_test eval-5.1 {
+  DROP TABLE IF EXISTS t1;
+  CREATE TABLE t1(x text);
+  INSERT INTO t1 VALUES('SELECT test_eval(x) FROM t1');
+} {0 {}}
+do_catchsql_test eval-5.2 {
+  SELECT test_eval(x) FROM t1;
+} {1 {sqlite3_prepare_v2() error: nested test_eval()}}
+
 finish_test
index 60b44fe1c7e23c009dcdac1dc184454bed0e0471..45856d059e8305482f6be80ebf9acb2c0eefb975 100644 (file)
@@ -62,6 +62,17 @@ do_catchsql_test misc8-1.8 {
   SELECT eval('SELECT * FROM t1 WHERE 1 = 0;');
 } {0 {{}}}
 
+# Bug 2026-07-29T06:29:11Z
+#
+do_execsql_test misc8-1.9 {
+  DROP TABLE IF EXISTS t1;
+  CREATE TABLE t1(x text);
+  INSERT INTO t1 VALUES('SELECT eval(x) FROM t1');
+} {}
+do_catchsql_test misc8-1.10 {
+  SELECT eval(x) FROM t1;
+} {1 {eval() nested too deep}}
+
 reset_db
 
 proc dbeval {sql} { db eval $sql }
@@ -143,4 +154,5 @@ do_test misc8-4.3 {
 
 
 
+
 finish_test