]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix the CLI so that it does not try to open what might be an SQLite
authordrh <>
Sat, 25 Oct 2025 18:35:29 +0000 (18:35 +0000)
committerdrh <>
Sat, 25 Oct 2025 18:35:29 +0000 (18:35 +0000)
database using open() in the deduceDatabaseType() routine, as this can
lead to broken posix advisory locks.

FossilOrigin-Name: 2a3a02715fa53673531575fa13aee056711139b409367cccc18654e82720c4e6

manifest
manifest.uuid
src/shell.c.in

index 099d1de88593020986e666d483364c739d691463..799128f4128e15e68bfd911a3a7b793484be74c6 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Stricter\sassert()\sstatements\son\sunixShmSystemLock().
-D 2025-10-25T11:37:54.456
+C Fix\sthe\sCLI\sso\sthat\sit\sdoes\snot\stry\sto\sopen\swhat\smight\sbe\san\sSQLite\ndatabase\susing\sopen()\sin\sthe\sdeduceDatabaseType()\sroutine,\sas\sthis\scan\nlead\sto\sbroken\sposix\sadvisory\slocks.
+D 2025-10-25T18:35:29.707
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -736,7 +736,7 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c f8d1d011aba0964ff1bdccd049d4d2c2fec217efd90d202a4bb775e926b2c25d
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
 F src/select.c b95181711d59c36d9789e67f76c4cfec64b99f9629a50be5e6566e117b87d957
-F src/shell.c.in 8d218cb62f8badb58cb6d91302ca8b6ccdc93232dd2ba39a9ace2e41fd8495cb
+F src/shell.c.in a1cf350fa00e75eecf21d76e64a3bd2daaf90a5d31c1a2597e59edd7e3e2ee1a
 F src/sqlite.h.in fcf692ee7d0997efee1e48ac9b533f18ec1eb2243255173134ab7ee0c70bc455
 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
 F src/sqlite3ext.h 7f236ca1b175ffe03316d974ef57df79b3938466c28d2f95caef5e08c57f3a52
@@ -2171,8 +2171,8 @@ F tool/version-info.c 33d0390ef484b3b1cb685d59362be891ea162123cea181cb8e6d2cf6dd
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 86f53a2eb37d8ec98bc9d4c6b00253cc00d798e79c7d409e65d608354a556e19
-R dcf753e10a96715b1840de9a0d3fab75
+P ed01ed337c04cce4cdbb6e80628b6f716d537e072b80067bd2bd6c5d18a1454f
+R aa6ff8a07549169951095444f01a467f
 U drh
-Z 78fddbc0c09532d4fb60b8889bacc776
+Z 0645197cb8b7d28672cb6a8bbdf9cfb5
 # Remove this line to create a well-formed Fossil manifest.
index 62cb49d79a136164b730fc4a8afac008cb5fe335..6723658e449fc610e32e34a72ba0a8e3a4e6b99b 100644 (file)
@@ -1 +1 @@
-ed01ed337c04cce4cdbb6e80628b6f716d537e072b80067bd2bd6c5d18a1454f
+2a3a02715fa53673531575fa13aee056711139b409367cccc18654e82720c4e6
index 53c1d06f29cf3d1a3d11a9deb096cb3daafe7acd..9fb0d5f5df73dd8b8e52431b66461bfcaa4f35b3 100644 (file)
@@ -5650,17 +5650,25 @@ static int session_filter(void *pCtx, const char *zTab){
 ** the type cannot be determined from content.
 */
 int deduceDatabaseType(const char *zName, int dfltZip){
-  FILE *f = sqlite3_fopen(zName, "rb");
+  FILE *f;
   size_t n;
+  sqlite3 *db = 0;
+  sqlite3_stmt *pStmt = 0;
   int rc = SHELL_OPEN_UNSPEC;
   char zBuf[100];
-  if( f==0 ){
-    if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
-       return SHELL_OPEN_ZIPFILE;
-    }else{
-       return SHELL_OPEN_NORMAL;
-    }
+  if( access(zName,0)!=0 ) goto database_type_by_name;
+  if( sqlite3_open_v2(zName, &db, SQLITE_OPEN_READONLY, 0)==SQLITE_OK
+   && sqlite3_prepare_v2(db,"SELECT count(*) FROM sqlite_schema",-1,&pStmt,0)
+           ==SQLITE_OK
+   && sqlite3_step(pStmt)==SQLITE_ROW
+  ){
+    rc = SHELL_OPEN_NORMAL;
   }
+  sqlite3_finalize(pStmt);
+  sqlite3_close(db);
+  if( rc==SHELL_OPEN_NORMAL ) return SHELL_OPEN_NORMAL;
+  f = sqlite3_fopen(zName, "rb");
+  if( f==0 ) goto database_type_by_name;
   n = fread(zBuf, 16, 1, f);
   if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
     fclose(f);
@@ -5682,6 +5690,14 @@ int deduceDatabaseType(const char *zName, int dfltZip){
   }
   fclose(f);
   return rc;
+
+database_type_by_name:
+  if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
+    rc = SHELL_OPEN_ZIPFILE;
+  }else{
+    rc = SHELL_OPEN_NORMAL;
+  }
+  return rc;
 }
 
 #ifndef SQLITE_OMIT_DESERIALIZE