]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
In the sqlite3_bind_text and sqlite3_bind_text16 TCL commands of the test
authordrh <>
Fri, 26 Mar 2021 23:59:37 +0000 (23:59 +0000)
committerdrh <>
Fri, 26 Mar 2021 23:59:37 +0000 (23:59 +0000)
suite, ensure that the string is zero-terminated if the size argument is
negative.

FossilOrigin-Name: f472fd64434cb2eac169587faa34bec489bc82002d529bc72dbfbba5251e5517

manifest
manifest.uuid
src/test1.c

index ec20425f980a23ba4de6f20998450323737b2a45..1a82e0d70047cec4c1674913d05691808d7efc52 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Remove\sold\stestcases()\smacros.\s\sAlso\sremove\ssurplus\send-of-line\swhitespace.
-D 2021-03-24T23:30:06.986
+C In\sthe\ssqlite3_bind_text\sand\ssqlite3_bind_text16\sTCL\scommands\sof\sthe\stest\nsuite,\sensure\sthat\sthe\sstring\sis\szero-terminated\sif\sthe\ssize\sargument\sis\nnegative.
+D 2021-03-26T23:59:37.423
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -552,7 +552,7 @@ F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a3
 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1
 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
 F src/tclsqlite.c 986b6391f02cd9b53c1d688be55899f6ffddeb8e8014cd83c1b73ff912579a71
-F src/test1.c cff43d8e21be543b77651b4d2caf49bd6488fee220f8540ecd9f71d13169dbd1
+F src/test1.c d5d0d715657a6b75e88d287a7a66c8411818d91e8412d75fdd815449ed5143d8
 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5
 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644
 F src/test4.c 7c4420e01c577b5c4add2cb03119743b1a357543d347773b9e717195ea967159
@@ -1911,7 +1911,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 037ca79e6032ca962b4f6182187bc12a7d91170d73630c8cd6fb191d2c183ee4
-R 4917cb97cf7d2f0464ec24d8aec9c1db
+P 54b41915ed8ef993b4116b2de00f3f4bba7570a1d28ad6bb93ba158a6b89eff3
+R 9b354d3e9bd417dba394c6169f3261ae
 U drh
-Z b164854ca6947409852c4f03609cd09b
+Z e1dfb5d13124d8522e37c5a32d2e98f5
index ffa7cca0a0d2bac3cb64b0ae264b59ae8c447b50..104b41246bf631d1332f1f00fbb5ef45a953c41c 100644 (file)
@@ -1 +1 @@
-54b41915ed8ef993b4116b2de00f3f4bba7570a1d28ad6bb93ba158a6b89eff3
\ No newline at end of file
+f472fd64434cb2eac169587faa34bec489bc82002d529bc72dbfbba5251e5517
\ No newline at end of file
index 27c638f4ee5b2160ff16d14ae789dced0040ea00..38a736d0232cfbf8c49e3276da1f942d158c93fe 100644 (file)
@@ -3825,9 +3825,11 @@ static int SQLITE_TCLAPI test_bind_text(
 ){
   sqlite3_stmt *pStmt;
   int idx;
+  int trueLength = 0;
   int bytes;
   char *value;
   int rc;
+  char *toFree = 0;
 
   if( objc!=5 ){
     Tcl_AppendResult(interp, "wrong # args: should be \"",
@@ -3837,13 +3839,23 @@ static int SQLITE_TCLAPI test_bind_text(
 
   if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR;
   if( Tcl_GetIntFromObj(interp, objv[2], &idx) ) return TCL_ERROR;
-  value = (char*)Tcl_GetByteArrayFromObj(objv[3], &bytes);
+  value = (char*)Tcl_GetByteArrayFromObj(objv[3], &trueLength);
   if( Tcl_GetIntFromObj(interp, objv[4], &bytes) ) return TCL_ERROR;
-
+  if( bytes<0 ){
+    toFree = malloc( trueLength + 1 );
+    if( toFree==0 ){
+      Tcl_AppendResult(interp, "out of memory", (void*)0);
+      return TCL_ERROR;
+    }
+    memcpy(toFree, value, trueLength);
+    toFree[trueLength] = 0;
+    value = toFree;
+  }
   rc = sqlite3_bind_text(pStmt, idx, value, bytes, SQLITE_TRANSIENT);
+  free(toFree);
   if( sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ) return TCL_ERROR;
   if( rc!=SQLITE_OK ){
-    Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);
+    Tcl_AppendResult(interp, sqlite3ErrName(rc), (void*)0);
     return TCL_ERROR;
   }
 
@@ -3869,7 +3881,9 @@ static int SQLITE_TCLAPI test_bind_text16(
   int idx;
   int bytes;
   char *value;
+  char *toFree = 0;
   int rc;
+  int trueLength = 0;
 
   void (*xDel)(void*) = (objc==6?SQLITE_STATIC:SQLITE_TRANSIENT);
   Tcl_Obj *oStmt    = objv[objc-4];
@@ -3885,10 +3899,21 @@ static int SQLITE_TCLAPI test_bind_text16(
 
   if( getStmtPointer(interp, Tcl_GetString(oStmt), &pStmt) ) return TCL_ERROR;
   if( Tcl_GetIntFromObj(interp, oN, &idx) ) return TCL_ERROR;
-  value = (char*)Tcl_GetByteArrayFromObj(oString, 0);
+  value = (char*)Tcl_GetByteArrayFromObj(oString, &trueLength);
   if( Tcl_GetIntFromObj(interp, oBytes, &bytes) ) return TCL_ERROR;
-
+  if( bytes<0 && xDel==SQLITE_TRANSIENT ){
+    toFree = malloc( trueLength + 2 );
+    if( toFree==0 ){
+      Tcl_AppendResult(interp, "out of memory", (void*)0);
+      return TCL_ERROR;
+    }
+    memcpy(toFree, value, trueLength);
+    toFree[trueLength] = 0;
+    toFree[trueLength+1] = 0;
+    value = toFree;
+  }
   rc = sqlite3_bind_text16(pStmt, idx, (void *)value, bytes, xDel);
+  free(toFree);
   if( sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ) return TCL_ERROR;
   if( rc!=SQLITE_OK ){
     Tcl_AppendResult(interp, sqlite3ErrName(rc), 0);