]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Do not attempt to take any write lock on a read-only database on Windows.
authordrh <drh@noemail.net>
Thu, 28 May 2015 00:54:35 +0000 (00:54 +0000)
committerdrh <drh@noemail.net>
Thu, 28 May 2015 00:54:35 +0000 (00:54 +0000)
FossilOrigin-Name: a47ff0cdab0f82398c68ea770053f193f4812a51

manifest
manifest.uuid
src/os_win.c
test/rowallock.test [new file with mode: 0644]

index 5ec3757d06f51ccec5f7068f0f5cd16fbf61d3fc..1298368df73a2c5b076a275cd29cc1c187e48fc4 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C The\sfuzzoomtest\smakefile\starget\sis\sno\slonger\ssupported,\sso\supdate\nreleasetest.tcl\saccordingly.
-D 2015-05-27T19:35:08.477
+C Do\snot\sattempt\sto\stake\sany\swrite\slock\son\sa\sread-only\sdatabase\son\sWindows.
+D 2015-05-28T00:54:35.202
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 994bab32a3a69e0c35bd148b65cde49879772964
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -235,7 +235,7 @@ F src/os.h 3e57a24e2794a94d3cf2342c6d9a884888cd96bf
 F src/os_common.h abdb9a191a367793268fe553d25bab894e986a0e
 F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa
 F src/os_unix.c 23eb5f56fac54d8fe0cb204291f3b3b2d94f23fc
-F src/os_win.c 97f7828a9554d753665b6fcf7540e31c2b3d6a6e
+F src/os_win.c 27cc135e2d0b8b1e2e4944db1e2669a6a18fa0f8
 F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca
 F src/pager.c 9bc918a009285f96ec6dac62dd764c7063552455
 F src/pager.h c3476e7c89cdf1c6914e50a11f3714e30b4e0a77
@@ -843,6 +843,7 @@ F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb
 F test/rollback.test 458fe73eb3ffdfdf9f6ba3e9b7350a6220414dea
 F test/rollback2.test fc14cf6d1a2b250d2735ef16124b971bce152f14
 F test/rollbackfault.test 6a004f71087cc399296cffbb5429ea6da655ae65
+F test/rowallock.test f7f834125f11ff62f6e1ae7d0b07fd9228f2d5a2
 F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81
 F test/rowid.test 742b5741584a8a44fd83e856cc2896688401d645
 F test/rtree.test 0c8d9dd458d6824e59683c19ab2ffa9ef946f798
@@ -1279,7 +1280,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 8bfe834432b37f94779da6c71fc369651f024590
-R 7269484077d02112c37e52a4369ae264
+P 06959d4ada53b765cae4b192a691fced4b8aebbb
+R b30cfcc10e16186636545a138869402d
 U drh
-Z 7d5ba49e31193e65fb96ee7978e16396
+Z 3b24ef1efe39a20b744ff0c0269b43f9
index a634db36786ef8661035af0ead11af54fd899ada..cf05a9ae5f2a3ea56d30f4933d45629d6644944d 100644 (file)
@@ -1 +1 @@
-06959d4ada53b765cae4b192a691fced4b8aebbb
\ No newline at end of file
+a47ff0cdab0f82398c68ea770053f193f4812a51
\ No newline at end of file
index 63afac81ae4c87aded49825ceb12052bca57d4c5..d84bda4ef5006263f5c3e8c1737308480e61fd2b 100644 (file)
@@ -3015,6 +3015,12 @@ static int winLock(sqlite3_file *id, int locktype){
     return SQLITE_OK;
   }
 
+  /* Do not allow any kind of write-lock on a read-only database
+  */
+  if( (pFile->ctrlFlags & WINFILE_RDONLY)!=0 && locktype>=RESERVED_LOCK ){
+    return SQLITE_IOERR_LOCK;
+  }
+
   /* Make sure the locking sequence is correct
   */
   assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK );
diff --git a/test/rowallock.test b/test/rowallock.test
new file mode 100644 (file)
index 0000000..57dbbb2
--- /dev/null
@@ -0,0 +1,62 @@
+
+# 2015-05-28
+#
+# 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 testing locks on read-only WAL-mode databases.
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+source $testdir/lock_common.tcl
+set testprefix rowallock
+
+do_multiclient_test tn {
+  code2 { db2 close }
+  code3 { db3 close }
+  
+  do_execsql_test 1.$tn.1 {
+    PRAGMA page_size = 4096;
+    CREATE TABLE t1(a, b);
+    CREATE TABLE t2(a, b);
+    INSERT INTO t1 VALUES(1, 2), (3, 4);
+    PRAGMA journal_mode = wal;
+  } {wal}
+
+  code1 { 
+    db close 
+    sqlite3 db test.db -readonly 1
+  }
+
+  do_execsql_test 1.$tn.2 {
+    PRAGMA mmap_size = 1000000;
+  } {1000000}
+  do_execsql_test 1.$tn.2.1 {
+    SELECT * FROM t1;
+  } {1 2 3 4}
+
+  do_catchsql_test 1.$tn.3 {
+    INSERT INTO t1 VALUES(5, 6);
+  } {1 {attempt to write a readonly database}}
+
+  do_test 1.$tn.4 {
+    code2 { sqlite3 db2 test.db }
+    sql2 { INSERT INTO t1 VALUES(5, 6); }
+    code2 { db2 close }
+    file exists test.db-wal
+  } {1}
+
+  do_test 1.$tn.5 {
+    sql1 { SELECT * FROM t2 }
+    code1 { db close }
+    file exists test.db-wal
+  } {1}
+}
+
+finish_test