]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Ensure that the CLI always jumps to the code that frees memory allocations
authordrh <>
Thu, 27 Nov 2025 12:15:22 +0000 (12:15 +0000)
committerdrh <>
Thu, 27 Nov 2025 12:15:22 +0000 (12:15 +0000)
prior to exiting when it encounters errors on the command line - just so
that fuzzers won't call that memory leak, even though it is not.

FossilOrigin-Name: 50eaf4266f184963e85ad6235fb3410bf4992db8b3dc7c92be23a2f143c12a6b

manifest
manifest.uuid
src/shell.c.in

index c963f393c835e9694e33de2e5614d8ca1cc003d6..013d44a4f71517cb48999fca3409f682971195ed 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\san\sutterly\sharmless\smemory\sleak\sthat\soccurs\swhen\sthe\sCLI\sexits\sdue\nto\san\serror\sin\sthe\scommand-line\sarguments.
-D 2025-11-27T11:40:40.248
+C Ensure\sthat\sthe\sCLI\salways\sjumps\sto\sthe\scode\sthat\sfrees\smemory\sallocations\nprior\sto\sexiting\swhen\sit\sencounters\serrors\son\sthe\scommand\sline\s-\sjust\sso\nthat\sfuzzers\swon't\scall\sthat\smemory\sleak,\seven\sthough\sit\sis\snot.
+D 2025-11-27T12:15:22.120
 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 5616fbcf3b833c7c705b24371828215ad0925d0c0073216c4f153348d5753f0a
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
 F src/select.c 6a509cddd815d64f6141e539fff633a518a393772a44dffb4490f7fc3f0d83a9
-F src/shell.c.in 2f1e67595ec37adc4d7deec3d488df2185c586b657b2c20fa8677946c13da25b
+F src/shell.c.in 139c2fb0a69274c15f1f0f5f3e11eadb197c8104287146f13ff88a9e13f486cc
 F src/sqlite.h.in f1363321ca55cc2feaa289e9fe6dfb08102a28c54edf005564711a2348b06eef
 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
 F src/sqlite3ext.h 5d5330f5f8461f5ce74960436ddcfa53ecd09c2b8b23901e22ae38aec3243998
@@ -2180,8 +2180,8 @@ F tool/version-info.c 33d0390ef484b3b1cb685d59362be891ea162123cea181cb8e6d2cf6dd
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P ea67d8b001d1be3b0410ca697ff7ddda71c957c8ecb6d76e75133ba39b754623
-R e6930b1477d8434e534555fe5d129aec
+P 55942e6d582d421187f2806dc93ea931b64dbb4025203540af654f56d1c9bc36
+R 7e0ff5a857c89204982f3b6a2646b7d7
 U drh
-Z eabcaa8d22309d26b221a4479d689a4c
+Z 119039c71467ca3eecec50215c515ab9
 # Remove this line to create a well-formed Fossil manifest.
index 3f11b5ee59766ec7d022c19bbe627fe3dae7b4d1..287af3ed4be9bf41359e26ab88e560e844b6f56e 100644 (file)
@@ -1 +1 @@
-55942e6d582d421187f2806dc93ea931b64dbb4025203540af654f56d1c9bc36
+50eaf4266f184963e85ad6235fb3410bf4992db8b3dc7c92be23a2f143c12a6b
index cf81cfb6e04dea9374b052177a6ecf736cef9ac3..d87136956ada026c6f9ca3231fd63fd4397e238d 100644 (file)
@@ -12778,7 +12778,8 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
 #else
     cli_printf(stderr,
                     "%s: Error: no database filename specified\n", Argv0);
-    return 1;
+    rc = 1;
+    goto shell_main_exit;
 #endif
   }
   data.out = stdout;
@@ -12920,7 +12921,8 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
     }else if( cli_strcmp(z,"-version")==0 ){
       cli_printf(stdout, "%s %s (%d-bit)\n",
             sqlite3_libversion(), sqlite3_sourceid(), 8*(int)sizeof(char*));
-      return 0;
+      rc = 0;
+      goto shell_main_exit;
     }else if( cli_strcmp(z,"-interactive")==0 ){
       /* Need to check for interactive override here to so that it can
       ** affect console setup (for Windows only) and testing thereof.
@@ -12977,25 +12979,29 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
       z = cmdline_option_value(argc,argv,++i);
       if( z[0]=='.' ){
         rc = do_meta_command(z, &data);
-        if( rc && bail_on_error ) return rc==2 ? 0 : rc;
+        if( rc && bail_on_error ){
+          if( rc==2 ) rc = 0;
+          goto shell_main_exit;
+        }
       }else{
         open_db(&data, 0);
         rc = shell_exec(&data, z, &zErrMsg);
         if( zErrMsg!=0 ){
           shellEmitError(zErrMsg);
           sqlite3_free(zErrMsg);
-          if( bail_on_error ) return rc!=0 ? rc : 1;
+          if( !rc ) rc = 1;
         }else if( rc!=0 ){
           cli_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
-          if( bail_on_error ) return rc;
         }
+        if( bail_on_error ) goto shell_main_exit;
       }
 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
     }else if( cli_strncmp(z, "-A", 2)==0 ){
       if( nCmd>0 ){
         cli_printf(stderr,"Error: cannot mix regular SQL or dot-commands"
               " with \"%s\"\n", z);
-        return 1;
+        rc = 1;
+        goto shell_main_exit;
       }
       open_db(&data, OPEN_DB_ZIPFILE);
       if( z[2] ){