From: drh <> Date: Sat, 25 Oct 2025 18:35:29 +0000 (+0000) Subject: Fix the CLI so that it does not try to open what might be an SQLite X-Git-Tag: major-release~42 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0d859b4828cc8f214b6447490b8d0a4d500105f7;p=thirdparty%2Fsqlite.git Fix the CLI so that it does not try to open what might be an SQLite database using open() in the deduceDatabaseType() routine, as this can lead to broken posix advisory locks. FossilOrigin-Name: 2a3a02715fa53673531575fa13aee056711139b409367cccc18654e82720c4e6 --- diff --git a/manifest b/manifest index 099d1de885..799128f412 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index 62cb49d79a..6723658e44 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ed01ed337c04cce4cdbb6e80628b6f716d537e072b80067bd2bd6c5d18a1454f +2a3a02715fa53673531575fa13aee056711139b409367cccc18654e82720c4e6 diff --git a/src/shell.c.in b/src/shell.c.in index 53c1d06f29..9fb0d5f5df 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -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