]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a segfault in swarmvtab that could occur if there was an error in the SQL
authordan <dan@noemail.net>
Sat, 5 Aug 2017 16:15:33 +0000 (16:15 +0000)
committerdan <dan@noemail.net>
Sat, 5 Aug 2017 16:15:33 +0000 (16:15 +0000)
statement passed to the constructor. Add other test cases.

FossilOrigin-Name: 6ce8b7ca62fcf97875395fc1a989179309e0abb48d4465658ef0d871434ea057

ext/misc/unionvtab.c
manifest
manifest.uuid
test/swarmvtab.test
test/swarmvtabfault.test [new file with mode: 0644]

index 8b7f4c2ee2b8884586a2442a8cc7664708e7e68e..fc87915b386b37f581dcf60ab0fd6c18e33aaafa 100644 (file)
@@ -721,7 +721,7 @@ static int unionConnect(
     pStmt = 0;
 
     /* Capture the not-found callback UDF name */
-    if( argc>=5 ){
+    if( rc==SQLITE_OK && argc>=5 ){
       pTab->zNotFoundCallback = unionStrdup(&rc, argv[4]);
       unionDequote(pTab->zNotFoundCallback);
     }
index 647ccf32745b0ca5ceb92401eab799f5359514dd..a26480da8d3df47d429b6eb393129168fbb9f3b2 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Microoptimization\sin\spcache1.c\smakes\sthe\scode\sslightly\ssmaller\sand\sfaster.
-D 2017-08-05T15:49:03.201
+C Fix\sa\ssegfault\sin\sswarmvtab\sthat\scould\soccur\sif\sthere\swas\san\serror\sin\sthe\sSQL\nstatement\spassed\sto\sthe\sconstructor.\sAdd\sother\stest\scases.
+D 2017-08-05T16:15:33.260
 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016
@@ -281,7 +281,7 @@ F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52
 F ext/misc/spellfix.c a4723b6aff748a417b5091b68a46443265c40f0d
 F ext/misc/stmt.c 6f16443abb3551e3f5813bb13ba19a30e7032830015b0f92fe0c0453045c0a11
 F ext/misc/totype.c 4a167594e791abeed95e0a8db028822b5e8fe512
-F ext/misc/unionvtab.c c59e3518f2bd4ea490b12e20afc2fb6837d496fdebaff507e4969ad53c61f738
+F ext/misc/unionvtab.c 1e0ebc5078e1a916db191bcd88f87e94ea7ba4aa563ee30ff706261cb4b39461
 F ext/misc/vfslog.c fe40fab5c077a40477f7e5eba994309ecac6cc95
 F ext/misc/vfsstat.c bf10ef0bc51e1ad6756629e1edb142f7a8db1178
 F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd
@@ -1231,8 +1231,9 @@ F test/subselect.test 0966aa8e720224dbd6a5e769a3ec2a723e332303
 F test/substr.test 18f57c4ca8a598805c4d64e304c418734d843c1a
 F test/subtype1.test 7fe09496352f97053af1437150751be2d0a0cae8
 F test/superlock.test ec94f0556b6488d97f71c79f9061ae08d9ab8f12
-F test/swarmvtab.test fbb2415797477588337a54e3bc0ff8e1981d325d22b9e75a527438e79d926a6a
+F test/swarmvtab.test 5e75154e6488b1cca19910e2820786f12eea66c4d4120539f6f064381bef8a54
 F test/swarmvtab2.test 038ef9bcad6fd2fb9e395196080cf23e223ddb1219015049a61540c161bc577d
+F test/swarmvtabfault.test 73563eefe3073c6fb3bb14475fb4ef5d4f2e3a67a02947ee0ca08980ea3dd7fe
 F test/symlink.test c9ebe7330d228249e447038276bfc8a7b22f4849
 F test/sync.test 2f84bdbc2b2df1fcb0220575b4b9f8cea94b7529
 F test/sync2.test 6be8ed007fa063b147773c1982b5bdba97a32badc536bdc6077eff5cf8710ece
@@ -1642,7 +1643,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 002a9c7baccf3417c56ec7d16755ea32fdd70a654ffc75f2fc4624fd2b688aed
-R dcb8fc9ec89330fec69c3eee54be505b
-U drh
-Z 2eca10fcc0a16cb9db9d08ac69a27abe
+P 422cd9f39403feeacd70133c7a147e23572c75d617ac564344f016ae6611162c
+R dfa04873a550ce06576a091a701d0729
+U dan
+Z f26bc896b278db4548da6d42aa588fb6
index a598b3c9c8560f6b9718d557662a15beddd4ea13..257235744fa3edc44db2504033bb3f2d07068e3b 100644 (file)
@@ -1 +1 @@
-422cd9f39403feeacd70133c7a147e23572c75d617ac564344f016ae6611162c
\ No newline at end of file
+6ce8b7ca62fcf97875395fc1a989179309e0abb48d4465658ef0d871434ea057
\ No newline at end of file
index 06cb328bc9e95e28fd8619b85cc0ab80c9aa7a61..315d3bdfe9c20c771bda37dd759d0b004480a0c6 100644 (file)
@@ -130,6 +130,7 @@ for {set i 0} {$i < 40} {incr i} { forcedelete "test.db$i" }
 #   2.1: Database file does not exist.
 #   2.2: Table does not exist.
 #   2.3: Table schema does not match.
+#   2.4: Syntax error in SELECT statement.
 #
 reset_db
 load_static_extension db unionvtab
@@ -184,5 +185,62 @@ do_catchsql_test 2.3 {
   SELECT * FROM s1 WHERE rowid BETWEEN 201 AND 300;
 } {1 {source table schema mismatch}}
 
+do_catchsql_test 2.4 {
+  CREATE VIRTUAL TABLE temp.x1 USING swarmvtab('SELECT * FROMdir');
+} {1 {sql error: near "FROMdir": syntax error}}
+do_catchsql_test 2.5 {
+  CREATE VIRTUAL TABLE temp.x1 USING swarmvtab('SELECT * FROMdir', 'fetchdb');
+} {1 {sql error: near "FROMdir": syntax error}}
+
+for {set i 0} {$i < 40} {incr i} {
+  forcedelete "test.db$i"
+}
+
+#-------------------------------------------------------------------------
+# Test the outcome of the fetch function throwing an exception.
+#
+proc fetch_db {file} {
+  error "fetch_db error!"
+}
+
+db func fetch_db fetch_db
+
+do_catchsql_test 3.1 {
+  CREATE VIRTUAL TABLE temp.xyz USING swarmvtab(
+    'VALUES
+        ("test.db1", "t1", 1, 10),
+        ("test.db2", "t1", 11, 20)
+    ', 'fetch_db_no_such_function'
+  );
+} {1 {no such function: fetch_db_no_such_function}}
+
+do_catchsql_test 3.2 {
+  CREATE VIRTUAL TABLE temp.xyz USING swarmvtab(
+    'VALUES
+        ("test.db1", "t1", 1, 10),
+        ("test.db2", "t1", 11, 20)
+    ', 'fetch_db'
+  );
+} {1 {fetch_db error!}}
+
+do_execsql_test 3.3.1 {
+  ATTACH 'test.db1' AS aux;
+  CREATE TABLE aux.t1(a INTEGER PRIMARY KEY, b);
+  INSERT INTO aux.t1 VALUES(1, NULL);
+  INSERT INTO aux.t1 VALUES(2, NULL);
+  INSERT INTO aux.t1 VALUES(9, NULL);
+  DETACH aux;
+  CREATE VIRTUAL TABLE temp.xyz USING swarmvtab(
+    'VALUES
+        ("test.db1", "t1", 1, 10),
+        ("test.db2", "t1", 11, 20)
+    ', 'fetch_db'
+  );
+} {}
+
+do_catchsql_test 3.3 { SELECT * FROM xyz } {1 {fetch_db error!}}
+
+
+
 finish_test
 
diff --git a/test/swarmvtabfault.test b/test/swarmvtabfault.test
new file mode 100644 (file)
index 0000000..8c913c1
--- /dev/null
@@ -0,0 +1,61 @@
+# 2017-07-15
+#
+# 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 SQLite library.  The
+# focus of this file is error handling in the swarmvtab extension.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+set testprefix swarmvtabfault
+
+ifcapable !vtab {
+  finish_test
+  return
+}
+
+proc fetch_db {file} {
+  forcedelete $file
+  sqlite3 dbX $file
+  dbX eval { CREATE TABLE t1(a INTEGER PRIMARY KEY, b) }
+  dbX close
+}
+
+forcedelete test.db1
+do_execsql_test 1.0 {
+  ATTACH 'test.db1' AS aux;
+  CREATE TABLE aux.t1(a INTEGER PRIMARY KEY, b);
+  INSERT INTO aux.t1 VALUES(1, NULL);
+  INSERT INTO aux.t1 VALUES(2, NULL);
+  INSERT INTO aux.t1 VALUES(9, NULL);
+  DETACH aux;
+} {}
+
+faultsim_save_and_close
+do_faultsim_test 1.1 -faults oom* -prep {
+  faultsim_restore_and_reopen
+  db func fetch_db fetch_db
+  load_static_extension db unionvtab
+  db eval {
+    CREATE VIRTUAL TABLE temp.xyz USING swarmvtab(
+        'VALUES
+        ("test.db1", "t1", 1, 10),
+        ("test.db2", "t1", 11, 20)
+        ', 'fetch_db'
+    );
+  }
+} -body {
+  execsql { SELECT a FROM xyz }
+} -test {
+  faultsim_test_result {0 {1 2 9}} {1 {sql error: out of memory}}
+}
+
+finish_test
+